Como usar un joystick de MegaDrive de 3 o 6 botones en un MSX.


Como funciona un mando de MegaDrive:

    Los mandos de MegaDrive/Genesis funcionan de una forma muy parecida a los del MSX, esto permite adaptarlos muy facilmente e incluso aprovechar todos sus botones sin mucha circuitería de por medio.

    Esta es la distribución del conector de un mando de MegaDrive:
 
1
Arriba
2
Abajo
3
Izquierda
4
Derecha
5
+5V
6
A/B
7
MX
8
Tierra
9
Start/C

    Al igual que en el MSX, prácticamente cada pin tiene asignado un botón que lo conecta a tierra al pulsarlo, pero a diferencia de éste en el mando de MegaDrive los botones de disparo A y B y los botones Start y C comparten pin. Mediante un multiplexor se elije el botón del cual se quiere leer el estado. Por ejemplo, para leer el estado del botón A hay que poner a 0 (conectar a tierra) el pin 7 desde la consola (el MSX en nuestro caso) y leer el pin 6, para leer el estado del botón B pondremos el pin 7 a 1 y leeremos el valor del pin 6. Idem para los botones Start y C con el pin 9 en vez del 6. Cuando el pin 7 correspondiente al multiplexor está a 0 (tierra) los pines 1 y 2 se ponen a 0 y no muestran el estado de los botones de dirección arriba y abajo.

    El mando de 6 botones es un poco más complejo,  tenemos 4 botones más: X, Y, Z y Mode y el mismo conector pues ha de ser compatible con el mando de 3. Para obtener el estado de los nuevos botones hay que enviar una ráfaga de 3 unos al multiplexor, o sea que tenemos que cambiar rápidamente el estado del pin 7 de esta forma: 010101. Al hacerlo se nos mostrará el estado de X, Y, Z y Mode en los pines 3, 2, 1 y 4 respectivamente. Antes de enviar el último 1, cuando el multiplexor esté a 0 el mando devolverá en los pines 1, 2, 3 y 4 también todo ceros, esto nos permitirá saber si se trata de un mando de 6 botones. Para que el mando vuelva a mostrar el estado de los botones normales basta con volver a poner a 0 el multiplexor, aunque de todas formas vuelve por si mismo pasado cierto tiempo (menos de una interrupción creo, aunque no estoy seguro).

Como funciona el puerto de joystick del MSX:

    Esta es la distribución de los pines del puerto de joystick de un MSX:
 
1
Arriba
2
Abajo
3
Izquierda
4
Derecha
5
+5V
6
Trigger 1
7
Trigger 2
8
OUT
9
Tierra

    Los pines del conector de joystick está conectados al PSG (que no solo sirve para generar sonido) y se puede controlar su estado con los registros 14 y 15 del mismo. El PSG se controla directamente mediante los puertos &HA0, &HA1 y &HA2 del MSX o bien mediante las rutinas de la BIOS para tal fin, consulta el MSX Technical Hand Book o el Red Book.

    Mediante los bits 0 a 5 del registro 14 controlamos las entradas del puerto de joystick, los bits 6 y 7 cumplen otras funciones que no nos interesan y por lo tanto no los usaremos. Normalmente los pines del conector de joystick no están conectados y por tanto su bit correspondiente en el registro 14 está a 1. En cuanto pulsamos un botón del joystick o movemos la palanca los pines implicados se conectan a tierra y sus correspondientes bit se ponen a 0.

    Esta es la distribución del registro 14 del PSG:
 
 
b0 Estado pin 1
b1 Estado pin 2
b2 Estado pin 3
b3 Estado pin 4
b4 Estado pin 6
b5 Estado pin 7
b6 Keyboard mode
b7 Cassete Input

    Con el registro 15 se controla las salidas del puerto de joystick, se selecciona el puerto del cual se leerá con el registro 14 y se controla también el estado del led kana, aunque esto último no nos interesa. Las salidas del puerto de joystick son el pin 8 y los pines 6 y 7, estos dos últimos no los tocaremos pues no podríamos leer el estado de los triggers. Aunque este registro controle las salidas del puerto de joystick también se puede leer, obviamente leeremos lo mismo que hemos escrito pero nos servirá para enmascarar y así no modificar los bits que no nos interesan.

    Esta es la distribución del registro 15 del PSG:
 
b0 Salida pin 6 puerto A
b1 Salida pin 7 puerto A
b2 Salida pin 6 puerto B
b3 Salida pin 7 puerto B
b4 Salida pin 8 puerto A
b5 Salida pin 8 puerto B
b6 Selección puerto. 0=A/1=B
b7 Estado del led kana

El adaptador:

    Pues bien, una vez ya sabemos como funciona el mando de MegaDrive y sabemos controlar el puerto de joystick de nuestro MSX, adaptar un mando es bien sencillo. Primero de todo es hacer corresponder cada pin donde toca, de la siguiente forma:
 
Puerto MSX Mando
Pin 7 Pin 9
Pin 8 Pin 7 
Pin 9 Pin 8

    Así usaremos el pin 8 del puerto de joystick del MSX, que normalmente no se utiliza, para el multiplexor del mando.
    Problema: el pin 8 por defecto está a 0, esto hace que el mando nos muestre el estado de los botones A y Start pero no el estado de las direcciones arriba y abajo, y por tanto no podremos usar el mando como un joystick normal de MSX. Para solucionarlo lo que podemos hacer (lo que yo he hecho) es pasar la señal del multiplexor por un inversor. Un inversor invierte la señal que le llega, o sea que cuando le llegue un 0 él mandará un 1 y viceversa, así lograremos que por defecto el mando ofrezca el estado de todos los botones de dirección y los botones A y C como trigger 1 y 2. Cuando queramos acceder al resto de botones bastará con acceder al mando como he explicado más arriba pero teniendo en cuenta los pines que hemos cruzado y el cambio en el multiplexor.

    Como inversor yo he usado el integrado 74LS04, que es muy sencillo y barato. La alimentación y la conexión a tierra de este integrado la podemos sacar del propio puerto de joystick.

74LS04
    Así pues estas son las conexiones:

Esquema

Concluyendo:

    Después de todo esto ya tenemos un mando de 6 (en realidad son 8) botones usable desde el MSX y además compatible con los estándar ya que los botones B y C hacen de trigger 1 y 2 respectivamente. Como curiosidad comentar que si el mando es usable aún sin adaptador aunque solo con el botón B disponible como trigger 1 es porque se da la suerte de que el pin 8 por defecto está a 0, o sea conectado a tierra que es lo que corresponde en el conector del mando de MD, si no fuera así no funcionaría ningún botón.
    Yo he hecho el montaje a base de placa perforada y cable y me ha cabido dentro de una cajita del tamaño de una caja de cerillas pequeña. No he tenido ningún problema con un joystick de 6 botones AsciiWare, muy bueno por cierto. Para testearlo he hecho la utilidad JoyMega que comprueba el estado de todos los botones.
    Quiero recordar que todo lo que he dicho sobre el funcionamiento del mando ha sido sin tener en cuenta el adaptador, o sea que para programarlo en el MSX hay que tener en cuenta que el pin del multiplexor se invierte.
    A ver si alguien lee esto y se anima a hacer un juego que soporte estos mandos. Para cualquier duda escríbeme a sergio.guerrero@ctv.es.
 

Un saludo.

Sergio Guerrero Miralles.