Cartucho Flash de NES

De WikiNES-77
Saltar a: navegación, buscar

Introducción

Tengo unas NES (Nintendo Entertainment System) en muy buenas condiciones. Lo malo que no tengo muchos juegos y algunos juegos son muy difíciles de pillar (Por Ejemplo: Bubble Bubble).

He decidido hackear un cartucho que pueda cargar el software que yo quiera, esto puede ser un juego, una demo, un juego casero o lo que quiera.

He usado 2 chips flash AT49F002 (256K). Para programarlo he usado un programador universal de eprom. Los chips y sockets son demasiado gruesos y hacen que el cartucho no se pueda cerrar. Esto se soluciona con un agujero en la cubierta. De esta forma es más fácil cambiar los chips sin necesidad que abrir el cartucho.


Detalles

El cartucho Flash usa 2 ROMS (memorias de solo lectura). Una rom es usada por la CPU y contiene el programa, la otra rom es usada por la PPU (unidad de proceso gráfico) y contiene ilustraciones. Estas 2 roms están en buses separados.

La CPU de la NES puede sólo con direcciones de 16 Bits, cual significa que tiene 65536 bytes de memoria. El espacio de memoria se divide en 2 bancos, los primeros 32K son para RAM y E/S, los segundos 32K son para mapear la rom del cartucho. La PPU tiene limitaciones parecidas.

El permitir el uso de más memoria requiere el uso de más chips adicionales. Esas son mapper nombradas y hacen posible un cambio de bancos de memoria. Con la conmutación de bancos de memoria, es posible referenciar una dirección de memoria (desde el punto de vista de la CPU) a varias áreas en la ROM. Por ejemplo: El rango de direcciones $C000-$FFFF normalmente apunta al rango $4000-7FFF con lo cual la ROM podría referenciar al $8000-$C000. Esto es transparente desde el punto de vista de la CPU (salvo la operación de la conmutación de bancos).

Existen muchas mappers diferentes, algunas de ellas son muy complejas. La mapper presente en el Bubble Bobble es una MMC1 creada por Nintendo. Aquí puedes ver documentación sobre esta mapper (link). El Bubble Bobble y el Motor City Patrol han sido las elegidas porque usan MMC1.

En el cartucho hay un chip de protección (CIC). El CIC se comunica con el CIC de la NES. Si la conexión se hace con éxito, el chip CIC de la NES se para reseteando a NES a 1HZ y el juego puedo lanzarse. Yo sólo dejé el chip donde estaba.

Elegí usar el flash AT49F0002 (256K) porque tenia algunos en stock. La salida de los pin de los roms de Nintendo difieren, con esto tube que cortar placas en la placa y soldar algunos cables. Por suerte, había pocas diferencias. Aqui está un documento que te enseñará como son las conexiones de los PIN de las roms de NES (link). Aquí hay otro documento que encontré con las salidas del MMC1 (link).


Software

En internet, las roms de la NES usualmente se distribuyen en formato .nes. Un .nes contiene datos de 2 cartuchos roms (PRG y CHR) y una cabecera especifica que mapper se usa, el tipo de mirroring y el tamaño de las roms. Se necesita una utilidad para extraer los 2 roms que deberían de funcionar en linux por lo tanto codifiqué el mio propio (no hice una búsqueda intensiva).

Tengo 3 utilidades: readnes, nesgg y patchnes.


readnes

Sintaxis: ./readnes rom.nes [num repeats prg] [num repeats chr]

readnes lee la cabecera del .nes, imprime la mapper usada, el tipo de mirroring, el número de bancos de PRG/CHR y genera 2 archivos. Uno de ellos contiene la rom PRG y la otra la CHR.

El contenido de la rom de PRG o CHR puede salir más de una vez a un archivo PRG y CHR. Esto ha sido útil para mí cuando yo tenía un juego de 128kb para ponerlo en un cartucho de 256Kb. Debido a la forma que la MMC1 es usada, la dirección A14 ha cambiado y los datos sin programar son leídos. Después de leer datos dos veces en la rom PRG, el estado de la línea A14 no importó más.

Ejemplo:

$ ./readnes BUBBLE.NES 2 1
File length :262288 Bytes
NES PRG: 08 CHR: 10 MAPPER: 11 44
Nintendo MMC1
Flags: 01
V
PRG 8 pages of 16kb (131072 bytes) 
CHR 16 pages of 8kb (131072 bytes)
End at 262160
Remaining bytes: 128
BUBBLE BOBBLE  From MINDRAPE and EFX

Writing BUBBLE.prg
.
Writing BUBBLE.chr
..

Despúes de esto se podrá ver como se ha escrito el .prg y el .chr y se podrán meter en Flash/ROM.


nesgg

Nesgg toma uno o muchos códigos del Game Genie (6 o 8 letras) desde la línea de comandos y saca por pantalla que hacen. Las direcciones se ven como son enviadas por la CPU de la NES. Se rotan los byte a la derecha para obtener la dirección de la ROM.

  • Código de 6 letras que simplemente reemplaza un byte en una dirección de memoria.
  • Código de 8 letras que reemplaza un byte en una dirección de memoria sólo si el valor contiene en la misma dirección es igual si el valor especificado en el código del Game Genie. Esto evita que el Game Genie substituya los valores que no deben ser cambiado (por ejemplo: Con la conmutación de banco, una dirección de la CPU de NES no representa siempre la misma dirección de la ROM).

Ejemplo:

$ ./nesgg PAUKEZLA TAUKEZLA PAUKEZLE
PAUKEZLA: Value: $01  Compare Value: $03  Address: $9470
TAUKEZLA: Value: $06  Compare Value: $03  Address: $9470
PAUKEZLE: Value: $09  Compare Value: $03  Address: $9470

Aquí hay una explicación de como son codificados los códigos de Game Genie.


patchnes

patchnes aplica uno o muchos códigos de Game Genie a un .NES (solo si usan MMC1 o no tienen mapper).

En las roms MMC1, hay una pequeña oportunidad de que el valor cambiado sea el erróneo. Esto es debido a que no puedo saber a priori que conmutación de bancos usará, y no puedo saber donde están los bancos que serán usados (en la rom alta o baja). Asumo que el juego usa bancos de 16Kb y que cada banco usará altas y bajas localizaciones. El hacerlo aumenta las probabilidades de substituir el valor derecho en la dirección derecha.

He aplicado un poco de código al Bubble Bubble (MMC1) y parece que va bien.

Ejemplo:

$ ./patchnes BUBBLE.NES PAUKEZLE
Working on rom BUBBLE.NES
Applying 8 letters code 'PAUKEZLE'
Not replacing $11 by 09 at address $9470 because it is not $03
Not replacing $02 by 09 at address $D470 because it is not $03
Not replacing $C4 by 09 at address $11470 because it is not $03
Not replacing $F1 by 09 at address $15470 because it is not $03
Not replacing $A9 by 09 at address $19470 because it is not $03
Not replacing $4C by 09 at address $1D470 because it is not $03
Replaced $03 by $09 at address $21470
Not replacing $FC by 09 at address $25470 because it is not $03


Programando

Para programar los flashs, usaba un programador universal antiguo de xeltek. Puedes comprar un programador universal en ebay por unos $50. Podrías también crear tu propio programador ya que la hoja de datos explica como programarlo.


Fotos

Aquí puedes ver fotos de la placa de SL-ROM-6 desde el cartucho Motor City Patrol. Reemplacé los roms por 2 sockets de 32 pines y modifiqué las placas para que aceptarán la salida de pines de los roms AT49F002 que usaba.

No se pueden ver con facilidad en las fotos pero son los chips están en los sockets.

Nota: Esta vez no tiene un salida de VGA. Estoy usando una capturadora de vídeo.


Mejoras

Unos pocos días después, lo cambié para poder usar juegos de 128Kb en mis chips de 256kb. Para seleccionar un juego o banco de memoria es tan fácil como un nivel alto o bajo del bit más significativo (botón derecho). Para tener soporte de 256Kb, se conecta la señal al mapper al bit más significativo (botón de la izquierda).

Tuve que cortar más señales. A la derecha de la pantalla puedes ver la foto de los cables.



Links

El mejor sitio para encontrar información: http://nesdev.parodius.com/

Pines de la salida de los ROM de la NES: NES_ROM_Pinouts.txt

Pines de salida del cartucho y mappers: [Tipos de Cartuchos|rom.txt]

Información del mapper MMC1 de Nintendo: mmc1.txt (Inglés)

Como están codificados los códigos del Game Genie: nesgg.txt

Información sobre los ROMS Flash AT49F002 Flash: doc1017.pdf


Resposabilidad

No puedo ser responsable de posibles daños que pudieran ocurrirte a ti o a tu equipo mientras haces algo de esta página. Además, NO DOY NINGUNA GARANTÍA de la corrección o de la usabibilidad de la información de esta página. Tengo que decir todo el procedimiento ha funcionado en mi caso sin problemas o daños.

Ahora no puedes decir que no te avisé si algo va mal.



Agradecimientos: Texto extraído de aquí (2006-03-03).