Buenas, estos dias...meses... estuve escribiendo un emulador de neogeo pocket para la PSP, y fui haciendo algunos borradores en notepad, con algunos datos que hiba descubriendo
Tengo varios, algunos son personales, con apuntes de codigo, pero hay uno general, que lo arregle un poco, y puede ser util para alguien, lo pego
Si interesa, puedo ir arreglando un poco los otros documentos, porsi sirven de algo, pero son ya mas de codigo
Si alguien tiene conocimientos de esas "areas grises/oscuras" de las que hablo, las espero con ansias, ya que basicamente esa falta de informacion, se traduce en errores de emulacion
Hardware de la Neo Pocket
- CPU- tlcs900h 6.144 Mhz
- CPU Sonido- Z80 3.072 Mhz
- LCD de 160x152px
- VPU- Propietario
- Dos framebuffer de 256x256
- 64 sprites/frame
- 4 colores por sprite/tile (con transparencia incluida)
- 48 paletas (16 para sprites, 16 para cada framebuffer)
- 146 colores totales de 4096 (formato RGB 444)
- RAM
- Ram CPU 2KB
- Ram registros I/O 160 bytes
- Ram principal 12KB? *
* La bios ocupa 12kb que en el emu, se copia a la ram, pero no estoy seguro
Mapa de memoria
0x00000000 - 0x000000ff - Ram CPU
0x00004000 - 0x0000ffff - Ram
0x00200000 - 0x003fffff - Rom (lowe 16Mbit)
0x00800000 - 0x009fffff - rom (high 16Mbit)
0x00fffe00 - 0x00ffffff - Otra ram/rom
Desglosada
000000 - 0008A0 Ram del CPU interna
004000 - 006FFF Ram externa del CPU
007000 - 007FFF Sonido
008000 - 00BFFF Graficos
200000 - 3FFFFF Rom para cartucho
800000 - 9FFFFF Area de rom para juegos de 4MB
FF0000 - FFFFFF BIOS (64Kb)
Ram del CPU interna
Los 160bytes parecen tener registros basicos del 900h, aunque hay algunos registros diferentes
0x00B8 - Controla el Z80 *word (0x00BA byte, 0x00BC byte)
Para desabilitar el z80 para benchmark, escribir AAAA en la direccion 0x00B8, escribir 5555 lo resetea
Para habilitarlo nuevamente, escribir 0xFF en la dir 0x00BC
*Nota, Interesante para ganar algunos fps, desabilitar el Z80 durante ciertos ciclos, posible speed hack
Ram externa del CPU
Memoria principal de la consola, del area 004000 a la 006FF. Se usa por la rom del juego
De 006C00 a 006FFF esta reservada por el sistema
Direcciones interesantes
6F91 > Seleccion de tipo de NGP
00 - Original en B/N
01 - NGP Color
Ram de Sonido
Tanto el 900H como el Z80 aunque tienen acceso al hardware de sonido. Los mapas de memoria de estos dos CPU no tienen acceso a 4KB de ram directamente, lo que hace que el 900H no tenga aceso directo al hardware de sonido, y el Z80 a otras partes, como pantalla
Devido a esta particularidad, se necesita un "driver" residente en la memoria del Z80 para hacer de puente, y que el codigo escrito para la pocket pueda dar sonido
Direccion 0x007000 en el mapa de memoria del +00H corresponde a la direccion 0x000 en el mapa de memoria del Z80
Cuando el 900H inicia, escribe codigo Z80 en esta ram, reiniciando el z80
El chip de sonido, se controla por el z80 por las direcciones 0x4000 y 0x4001
La 0x4000 controla el ruido, y la 4001 los tonos 1 al 3
Area de graficos
Esta diria es el area mas oscura, donde no he encontrado informacion completa
008000 - Prioridad del primer Framebuffer (#0)
008002 - Comienzo de X
008003 - Comienzo de Y
008004 - Tamaño de X (normalmente A0 = 160)
008005 - Tamaño de Y (normalmente 98 = 152)
008009 - Linea Y que esta en uso **
008020 - Plano de scroll de sprites X
008021 - Plano de scroll de sprites Y
008030 - Registro de prioridad del Framebuffer #1
008032 - Framebuffer #0 Scroll X
008033 - Framebuffer #0 Scroll Y
008034 - Framebuffer #1 Scroll X
008035 - Framebuffer #1 Scroll Y
008100-008117 - Tabla de la paleta para juegos en B/N
008200-00827F - Tabla de la paleta para primer plano (solo sprites ?)
008280-00837F - Tabla de la paleta para plano de fondo
008800-0088FF - Control de sprites (64 sprites x 4bytes)
Primer byte TTTTTTTT
Segundo byte HVBPPPPT
H= h flipping (no se como traducir esto)
V= V flipping
B= Seleccion de paleta para juegos en B/N
P= Numero de paleta (0-15 4bits)
T=numero de tile en la tabla de mapa de tiles
Tercer byte posicion X
Cuarto byte posicion Y
008C00-008FFF - Numero de paleta por sprite (64 sprites x 1 byte)
009000 - 0097FF - Framebuffer #0 primer plano virtual 256x256
Primer byte TTTTTTTT
Segundo byte HVBPPPPT
H= h flipping (no se como traducir esto)
V= V flipping
B= Seleccion de paleta para juegos en B/N
P= Numero de paleta (0-15 4bits)
T=numero de tile en la tabla de mapa de tiles
009800 - 0098FF - Framebuffer #1 plano de fondo virtual 256x256
Primer byte TTTTTTTT
Segundo byte HVBPPPPT
H= h flipping (no se como traducir esto)
V= V flipping
B= Seleccion de paleta para juegos en B/N
P= Numero de paleta (0-15 4bits)
T=numero de tile en la tabla de mapa de tiles
00A000 - 00BFFF - Mapa de tiles (?)
Tiles de 8x8 pixel (16 bytes)
Color 2 bits (0..3)
** El metal slug 1 comprueba este flag por ejemplo
** Nota: Formato de los graficos de la Pocket
2BPP
Colores por tile: 0-3
Espaciode color: 2 bits por pixel, 16 bytes por tile (8x8)
Formato bitmap linear
[p4-7 r0: bp*], [p0-3 r0: bp*], [p4-7 r1: bp*], [p0-3 r1: bp*]
[p4-7 r2: bp*], [p0-3 r2: bp*], [p4-7 r3: bp*], [p0-3 r3: bp*]
[p4-7 r4: bp*], [p0-3 r4: bp*], [p4-7 r5: bp*], [p0-3 r5: bp*]
[p4-7 r6: bp*], [p0-3 r6: bp*], [p4-7 r7: bp*], [p0-3 r7: bp*]
Area de Rom
Esta area es bastante oscura tambien, poca informacion
200000 - 20001B - Informacion de Licencia - corrobora el cartucho, la informacion a comprobar es: " BY SNK CORPORATION"
200020 - 200021 - Cada juego parece tener un numero que graba en esta area
Juegos conocidos
0020 - Puzzle Bobble Mini
0021 - Metal Slug 1st Mission
0023 - King of Fighters R2
0027 - Master of Shyougi
0030 - Samurai Shodown 2
0038 - Crush Roller
0039 - Neo Cup 98
0053 - Biomotor Unitron
*** Seria muy interesante descubir mas, tengo q escribir alguna utilidad para leer esta porcion de memoria y hacer pruebas
200024 - 20002F - Nombre del juego
como nota, hay una direccion la 20001F que parece ser recurrente los juegos la comprueban, no se que devuelve o hace
Por ejemplo, el Metal Slug 2, necesita que esta direccion tenga un valor de 0xFF o no va
Rom interna del CPU
Esta parte es donde se vuelca el bios, realmente en el emulador no la leo/escribo directamente, si no a travez de un interruptor de software (SWI 1)
Aun tengo que escribir un poco este tema, ya que emulo el bios, no uso un bios real
En la tabla de vectores de la bios en la rom, estos datos son los que he usado
- Vector de apagado
#Apaga la NeoGeo Pocket por software
- Vector de clock
#Cambia la velocidad del 900H
00 - 6.144 MHz
01 - 3.072 MHz
02 - 1.536 MHz
03 - .768 MHz
04 - .384 MHz
- Vector de hora/fecha
#Parametros del vector
+0 : Año (00-90 = 2000-2090, 91-99 = 1991 - 1999)
+1 : Mes
+2 : Dia
+3 : Hora (formato 24hs)
+4 : Minuto
+5 : Segundos
Tambien hay vector de alarma, salvado, fuente y borrado/escritura de la flash