domingo, 20 de noviembre de 2011

Programando para COLECOVISION

La consola COLECOVISION fue la propuesta de COLECO al boom de las consolas. Vio la luz en 1982 y en sus apenas dos años de vida comercial vendió más de seis millones de unidades.

La COLECOVISION nos ofrece un hardware muy muy similar al del MSX1, ya que comparte con éste CPU y VDP. El sonido lo genera con el SN76489 de Texas Instruments, que es el mismo que podemos encontrar en la Sega Master System, aunque esto dará para otra historia ;)

Aunque la CPU y el VDP son idénticos, no funcionan exactamente igual en ambos sistemas, por lo que hay que tener en cuenta los siguientes puntos importantes:
  • RAM: la norma MSX dicta que la mínima cantidad de RAM disponible en un MSX1 ha de ser de 8kb, situadas en el área desde $E000 a $FFFF. En la COLECOVISION tenemos única y exclusivamente 1kb de RAM, situada en la zona entre $7000 y $73FF, aunque también puede accederse en otras áreas que forman un mirror de esta zona de memoria.
  • Ubicación de la ROM: en MSX lo normal es que las ROMS de 32k se sitúen en la zona de memoria desde $4000 hasta $BFFF, aunque como ya sabemos todos, gracias al sistema de slots del MSX es posible situar las ROMS prácticamente en cualquier dirección. Sin embargo, en COLECOVISION la ROM sólo puede situarse en los 32kb superiores: de $8000 a $FFFF.
  • Interrupciones: en el MSX no tenemos NMI, es decir, todas las interrupciones que se generan son enmascarables. En la COLECOVISION parece ser todo lo contrario. La interrupción de blanqueo vertical (producida por el VDP cada vez que se termina de dibujar un frame) es una NMI. No he encontrado información sobre si se pueden producir otro tipo de interrupciones enmascarables, así que por el momento las podemos ignorar. Esto, que parece poco, significa que las instrucciones DI y EI no van a desactivar las interrupciones del VDP, por lo que habrá que utilizar el bit 5 del registro R#1 del VDP para controlar las interrupciones (si está a 0, el VDP no generará interrupciones).
  • Acceso al VDP: en MSX la norma dicta que las direcciones de acceso al VDP han de leerse de los bytes 6 y 7 de la BIOS. En COLECOVISION el VDP se sitúa en varios puertos, pero lo normal es acceder a través de los puertos $BE y $BF. Esto equivaldría a tener una BIOS en MSX en la que en las direcciones 6 y 7 tuviéramos el valor $BE.
Pasemos ahora a ver la estructura de la cabecera de una ROM de COLECOVISION:
  • $8000: contiene dos bytes que pueden ser $AA y $55 o bien $55 y $AA. La diferencia es que en el primer caso se mostrará la pantalla de presentación de COLECO y en el segundo caso no.
  • $8002: Puntero a una copia en RAM de la tabla de atributos de sprites (*)
  • $8004: Puntero a una tabla de prioridades de sprites (*)
  • $8006: Puntero a un buffer libre en RAM (*)
  • $8008: Puntero a una zona de memoria (12 bytes) para gestionar los controles (*)
  • $800A: Puntero al inicio del juego
  • $800C a $8020: aquí lo que hay que situar es el código que será ejecutado cada vez que se haga un RST. En la BIOS de la COLECOVISION, en las direcciones a las que se puede hacer RST ($0008, $0010, $0018, $0020, $0028, $0030 y $0038) encontramos saltos incondicionales a esta zona. Tenemos 3 bytes para cada RST, por lo que si necesitamos utilizar alguno de ellos, pondremos un JP a la rutina necesaria (tres bytes), mientras que si no lo necesitamos, podemos poner un RET (y un par de NOPs para rellenar). Concretamente las direcciones de salto para cada RST son:
    • RST $08: $800C
    • RST $10: $800F
    • RST $18: $8012
    • RST $20: $8015
    • RST $28: $8018
    • RST $30: $801B
    • RST $38: $801E
  • $8021: aquí situaremos el código a ejecutar (máximo 3 bytes) cuando se produzca una NMI. Recordemos que en la COLECOVISION se produce una NMI cuando el VDP termina de dibujar un frame, por lo que aquí deberíamos situar un salto incondicional a la rutina de tratamiento de interrupciones.
  • $8024: aquí situaremos una cadena identificativa del juego, que será la que se mostrará en la pantalla de presentación de COLECO (si los dos primeros bytes de la ROM son $AA y $55). El formato de la cadena será:

    LINEA 2 / LINEA 1 / AÑO (4 dígitos)

    y la pantalla de presentación quedaría parecido a esto:

    COLECOVISION

    PRESENTS

    LINEA 1

    LINEA 2

    AÑO
Los punteros marcados con (*) o bien serán 0 o bien apuntarán a zonas de RAM, en cuyo caso serán usados por la BIOS de la COLECOVISION.

Por el momento ya tenéis información suficiente como para intentar hacer una pequeña ROM para COLECOVISION, como por ejemplo el clásico "HOLA MUNDO". En un futuro post veremos cómo leer los controles y las diferencias entre el AY-3-8910 (el PSG del MSX) y el SN76489 (el PSG de la COLECOVISION y la Sega Master System).

El emulador que os recomiendo para trabajar con la COLECOVISION no es otro que el mismísimo BlueMSX. ¡Buen provecho!

No hay comentarios: