martes, 10 de enero de 2012

Programando para COLECOVISION (II)

Hace unas semanas, comentaba por aquí los puntos básicos a la hora de programar para la consola ColecoVision, una consola muy muy similar a nuestros MSX1.

En aquel post hablé de la cabecera de las roms para ColecoVision y de la disposición de la memoria, así como lo mínimo que hay que saber sobre la forma en la que la CPU de la consola (un Z80 a la misma velocidad de reloj que el MSX) gestiona las interrupciones generadas por el VDP (que es el mismo que el de un MSX1).

En esta ocasión vamos a ver cómo leer los mandos de la ColecoVision. Pero primero vamos a ver cómo son estos mandos.


Típico mando de ColecoVision
(imagen original de museodelvideojuego.com)

Como podemos ver, el mando consiste en una rueda/joystick situada en la parte superior, con dos botones grises (uno a cada lado del mando, en la zona media) y un teclado numérico de 12 botones.

Para obtener el estado completo de cada mando hay que leer dos bytes, aunque con uno puede bastar, dependiendo de qué necesitemos leer. Lo primero que hay que tener en cuenta es que los valores que vamos a leer utilizan lógica inversa, es decir: un 1 significa NO pulsado. Así que tras leer, una buena idea es utilizar la instrucción CPL y asumir que un 1 significa pulsado.

Lectura del primer byte: Joystick, rueda y botón izquierdo

Este primer byte nos informa sobre el estado del joystick, de la rueda y del botón izquierdo. Para poder leer este byte tenemos que hacer un OUT al puerto $C0, ¿con qué valor? Pues lo divertido es que da exactamente igual, sólo tenemos que hacer un OUT a ese puerto para seleccionar el primer byte devuelto por los mandos.

Una vez seleccionado este primer byte, podremos leer el estado del primer mando a través del puerto $FC y el del segundo a través del puerto $FF.

Por último, interpretar el contenido de este byte es muy sencillo, ya que cada bit tiene un significado preciso:
  • Bit 0: Arriba
  • Bit 1: Derecha
  • Bit 2: Abajo
  • Bit 3: Izquierda
  • Bit 4: Rueda girando
  • Bit 5: Dirección de giro
  • Bit 6: Botón Izquierdo
  • Bit 7: -- No usado --
Como veis, es sencillo. Lo más complicado es entender el funcionamiento de la rueda. El bit 4 (en la documentación de la Coleco se le denomina INT) se activa cuando la rueda está girando, en cuyo caso el bit 5 tendrá 0 ó 1 dependiendo del sentido de giro.

Lectura del segundo byte: Botón derecho y teclado numérico

Este segundo byte nos dirá el estado del botón derecho y qué tecla se ha pulsado en el teclado numérico. Para seleccionar que queremos leer este byte, debemos realizar un OUT al puerto $80 y al igual que con el primer byte, nos da igual el valor que mandemos.

Una vez seleccionado el segundo byte, lo mismo que antes: el puerto $FC nos devuelve el valor del primer mando y $FF el del segundo.

Sin embargo, interpretar este segundo byte es algo más complejo, ya que sólo el bit 6 tiene un significado concreto: el estado del botón derecho. Para leer el estado del teclado numérico, hay que utilizar la siguiente tabla cuya entrada es el valor de los 4 bits de menor peso de este segundo byte y la salida representa la tecla pulsada:

ValorTecla pulsada
0-- Inválido --
16
21
33
49
50
6*
7-- Inválido --
82
9#
107
11-- Inválido --
125
134
148
15-- Inválido --

Es una tabla a la que aún no le he encontrado un sentido lógico, pero es la que utiliza la propia BIOS de la Coleco a la hora de decodificar el teclado numérico.

De momento eso es todo. En este punto estamos en condiciones de hacer algo funcional para Colecovision, aunque no suene por ahora. En un futuro post veremos cómo aprovechar lo que ya sabemos del PSG de MSX para utilizarlo en la Colecovision.

1 comentario:

Jorge Romero González dijo...

Saludos Fernando.

Justo acabo de ver la entrada y me he acordado de la ultima vez que te escribi por correo.

Esta semana te voy a enviar los graficos de mi ultimo juego por si te interesa usarlos en alguno de tus proyectos, ya sabes el que te dije que estaba haciendo para PC, tratando de ceñirme a las limitaciones graficas del MSX1. Al final no solo lo termine, sino que he hecho hasta una version en Flash.

El correo te llegara desde info (at)oniric-factor.com

Perdona por no haberte respondido al ultimo mensaje. Uso muy poco la cuenta de gmail y se me fue la pinza completamente. :(

¡Feliz año!