Programador SNES - Descripción

Programador Flash
Módulo SNES

Por: David J. Senabre Albujer , 2006
Versión 1.




Trasfondo...

Si no te interesa pasa a visión general :-)
Uno de mis objetivos era conseguir leer y grabar las partidas salvadas de los juegos de
Megadrive y Super Nintendo, para poder así tener backups, y poder:
- Seguir una partida empezada en la consola, en un emulador.
- Seguir una partida empezada en un emulador, en la consola.
- Poder cambiar la pila del cartucho habiendo salvado previamente la partida, para poder
volverla a cargar (al cambiar la pila se borra, como probablemente sepas).
Hace muy poco conseguí hacerlo para Megadrive, y ahora lo he conseguido para la
SNES, pero por métodos muy distintos.

Brevemente, en el caso de la Megadrive, escogí hacer todo el proceso en la propia
consola. Construí un cartucho regrabable para arrancar una BIOS desde el puerto de
expansión, una de cuyas funciones era permitirla conectarse al PC. Esto lo hice usando
un protocolo de transmisión a través del puerto de mandos, por donde se conecta al
puerto paralelo del PC con un cable. Otro programa en el PC se encarga de conectarse a
la consola y darle las ordenes pertinentes, que la BIOS ejecuta (por ejemplo, leer la
SRAM y mandarla por el cable, para que el programa del PC pueda grabarla en el disco
duro, etc).

En el caso de la SNES, una solución de este tipo es muy dificil de implementar, debido
principalmente a su arquitectura. El primer motivo es que es muy laborioso y dificil
meterle una BIOS. Llevo más de un año destrás de conseguirlo, pero aún no me he
puesto. La SNES tiene un puerto de expansión de escasa potencia comparado con el de
la Megadrive, que no permite cargar código, ni tener acceso al bus principal de la CPU.
El segundo motivo es que su capacidad de entrada/salida a través del puerto de mandos
es también muy limitada. Buenisima para conectar mandos (bastante mejor que el de
Megadrive) pero pésima para mandar datos por él. Por tanto, para conectarla al PC,
anque cargara una BIOS, necesitaria usar el puerto de expansión y el manejo del
protocolo de transimisión y su programación sería más compleja.Visión general

La solución a todo esto era usar mi programador de memorias. Como su construcción es
modular, sólo tenía que diseñar una placa de expansión que conectada a la placa madre,
con muy pocos componentes, me permitiera leer y grabar cualquier cosa en el cartucho.
Al final bastó un simple multiplexor, y un conector de cartuchos de SNES.
Para conseguir acceso total al cartucho tuve que dedicar mucho tiempo en investigar el
maldito mapa de memoria de la SNES, que a mi modo de ver es estúpidamente
complicado, y que además puede funcionar en modo HiROM o LoROM. Es muy dificil
al principio entender perfectamente este mapa de memoria, pero es vital si se quiere
dominar la máquina.

Por si fuera poco, para acceder a la SRAM de cartuchos que usan HiROM, hay que
tomar precauciones especiales, y esto unido a otras tantas cosas, hizo que desarrollar el
programa de control fuera algo laborioso, con mucho debugging por medio.
En definitiva, para controlar esta nueva placa necesité realizar un par de modificaciones
a la placa madre, para aumentar su capacidad de direccionamiento de 4 a 16Mb, y
añadir una líneas de control adicional (por suerte, basta con soldar 3 cables). Como el
control del programador Flash, que fue el primer modulo que diseñé para la placa madre,
era sencillo, aproveché para simplificar el diseño. Pero no ha sido posible mantenerlo en
este caso.

Por tanto para usar el programador de SNES necesitas usar la placa madre 2.0
Y para usar el programador Flash puedes usar la placa madre original o la 2.0La construción

Es muy simple.
Hay que hacer tomar todas la lineas de dirección de la placa madre y llevarlar a las
lineas de dirección del cartucho. A todas menos a la A23. Como la placa 2.0 tiene 24
lineas de dirección, 23 de ellas se tendrán que conectar a las 23 linéas bajas de dirección
del cartucho (A0-A22). La A23 del cartucho irá conectada a 5v a través de una
resistencia (no se necesita).
La señal de dirección de la placa madre que nos queda libre la vamos a usar como
selectora de un multiplexor, que se usará para controlar la señal /CART del cartucho.
Normalmente, /CART será controlada por la señal /RD de la placa de control, pero
cuando se quiera grabar la SRAM en cartuchos LoROM, habrá que conectar /CART a
tierra*. Ese será el cometido del multiplexor, controlado por A23 de la placa de control.
A la señal /WR del cartucho irá coenctada la señal /WR de la placa de control, sin más.
A la señal /RD del cartucho irá conectada la señal de control adicional de la placa 2.0
Las lineas del cartucho A23, RESET e IRQ van a 5V a través de una resistencia.
El resto, flotando. Y ya está.
 

(*): Para habilitar la señal /CS-RAM cuando se grabe en ella, sino no haría efecto. En HiROM es distinto, ya que /CS-RAM se habilita cuando se da una dirección dentro de la zona de la SRAM, sin activar /CART. Es más, si activas /CART se deshabilita la SRAM (en HiROM), así que mucho ojo. En HiROM, siempre que activas /CART, se habilita la ROM, por tanto, cualquier RAM queda inhabilitada. Esto es poco intuitivo, y difícil de entender, así que míralo como una excepción. No sé por qué Nintendo hizo algo así.

 

Explicando un poco el direccionamiento...
 
En función de qué acción quieres hacer, las líneas /CART y /RD del cartucho deben ser controladas de cierta forma:

LoROM

  ROM SRAM
Leer /RD = 0; /CART = /RD@ /RD= 0; /CART = /RD@
Grabar --- /RD = 1; /CART = 0

HiROM

  ROM SRAM
Leer /RD = 0; /CART = /RD@ /RD = 0; /CART = 1
Grabar --- /RD = 1; /CART = Mux

/CART: señal de habilitación del cartucho.
/RD: señal de escritura del cartucho.
/RD@: señal de escritura de la placa de control.
Mux: salida del multiplexor, controlado por A23 de la placa de control.

Las señales /CART y /RD necesitan aclaración.
/CART es una señal que se usa para indicar al cartucho que se está intentando acceder a él. Internamente está conectado a /OE-ROM (señal de lectura de la ROM) y /CS-RAM (señal de habilitación de la SRAM).
 
/RD en realidad está conectado a la señal /CS-ROM, y /OE-RAM. De primeras es poco intuitivo, ya que cabría esperar que /RD estuviera conectado a la señal /OE-ROM, y esto ha llevado a algunos (que en mi opinión, no lo han enfocado correctamente) a llamar /CS a /RD, y /RD a /CART. Es decir:
 
En vez de Las llaman Está conectada a
/CART /RD /OE-ROM y /CS-RAM
/RD /CS /CS-ROM y /OE-RAM

Yo considero que es mucho mejor verlo como /RD, y /CART, porque se acaba entendiendo mejor el funcionamiento y el uso del mapa de memoria de la SNES. Sin duda. Aunque /ROM es un nombre bastante razonable, si con ello entendemos que significa acceso al cartucho en conjunto.
 
Aunque como ya habré dicho, este sistema que usa la SNES para acceder al cartucho, puede parecer bastante rebuscado. Yo habría hecho lo que se suele hacer siempre, que la señal de /RD fuera conectada a /OE-ROM y /OE-RAM, y la /CS a /CS-ROM y /CS-RAM. El sistema elegido por Nintendo complica conceptualmente todo. En mi opinión. Aunque con el tiempo se acaba por entender perfectamente. Paciencia.
 

Conector
 
Pinout del módulo lector SNES 

A11

A10

A9

A8

A7

A6

A5

A4

A3

A2

A1

A0

-

-

-

-

-

-

A22

A23

/OE

/WR

A12

A13

A14

A15

A16

A17

A18

A19

A20

A21

D0

D1

D2

D3

D4

D5

D6

D7

 

Versión 2 de la placa de control

La versión 2 es mandatoria. Y recuerdo que el conector de la placa de control tiene el siguiente pinout:

Pinout del FlashUSB de la placa madre v.2

A16

A17

A19

A8

A9

A10

A11

A12

A3

A13

A14

A15

-

-

-

-

-

Ctr

A22

A23

/OE

/WR

A20

A21

A0

A1

A2

A3

A4

A5

A6

A7

D0

D1

D2

D3

D4

D5

D6

D7

(*) La señal Ctr no proviene del 8255 sino del puerto paralelo.



Software de control

El programador se maneja con un programa para Windows que sirve para grabar memorias Flash tipo 29F0x0. No obstante, el módulo SNES requiere una versión adaptada de este software. Si estás interesado en construirlo, ponte en contacto conmigo.
Este programador sólo tiene interés como proyecto personal, y no puede competir con soluciones comerciales.