CVBasic: Un compilador de BASIC para Colecovision

CVBasic es un compilador cruzado de lenguaje BASIC que corre en una computadora PC y genera código ensamblador Z80 que debe ser procesado por un ensamblador (Gasm80) para generar el juego que puede correr en un emulador o en una consola Colecovision real.
En la versión 0.2.0 también ya genera juegos para Sega SG1000 y en la versión 0.4.0 ya permite crearlos para computadoras MSX.
Si ya sabes todo acerca del Colecovision y no necesitas saber como se desarrolló CVBasic entonces puedes saltarte e ir directamente a las secciones Uso de CVBasic y Descargas.

La consola Colecovision

La consola Colecovision apareció en 1982 en USA por parte de Coleco Industries, Inc. y tuvo un gran éxito debido a que el juego que venía incluído era Donkey Kong. Era la primera vez que un juego de arcade lucía como un juego de arcade en tu casa.
Vendió más de 6 millones de consolas hasta el crash de los videojuegos de 1984.
El Colecovision está basado en componentes de fácil acceso que se podían adquirir directamente de fabricantes o incluso de tiendas grandes de electrónico. Lleva el muy común procesador Z80, juntos con dos memorias estáticas de RAM 2114, y el procesador de video TMS9928 acompañado por ocho chips de memoria RAM dinámica 4116.
La disponibilidad de componentes hacían que fuera más fácil hacer reparaciones, y por esto pude hacer un Colecovision en tablillas que una vez me ayudó a probar un juego cuando mis dos Colecovisiones fallaron.
Colecovision con un cartucho de Zombie Near insertado
Colecovision con un cartucho de Zombie Near insertado

Desarrollo de CVBasic

En 2014 codifiqué IntyBASIC, un compiladr de BASIC para Intellivision. Tuvo un gran éxito y una curva de aprendizaje suave. Desde entonces estuve pensando en algo similar pero para Colecovision. Sin embargo, no podía encontrar la forma correcta de haerlo hasta que en 2024 encontré mis viejos juegos Viboritas y Cubos.
El 27-feb-2024 en la mañana tomé el código fuente de IntyBASIC y extraje el separador léxico y la armazón para GOTO y GOSUB, e hice un pequeño compilador para Z80 y lo anuncié en X (Twitter). Por cierto, así es como muchos años atrás aprendí a hacer conversiones de BASIC a ensamblador, GOTO es un JP, y GOSUB es un CALL.
Muy feliz con este resultado, seguí adelante adaptando mi analizador de expresiones e hice un generador de árbol dedicado al Z80. Este generaba montones de instrucciones PUSH/POP en lugar de optimizar, pero de esta forma para la noche ya tuve un programa con una cara rebotando en la pantalla que podía ser compilado, ensamblado y ejecutado por mi emulador CoolCV.
Par manejar el VDP, decidí separarlo en tres partes: DEFINE SPRITE (para sprites), DEFINE CHAR (para caracteres), DEFINE COLOR (el color para los caracteres). Además la sentencia SPRITE ayuda a manejar los sprites de hardware, y la rejilla de pantalla de 32x24 se accede usando VPOKE/VPEEK o PRINT AT.
La única instrucción de manejo de control fue IF y estaba apoyada por GOTO y GOSUB (esto es como funcionan básicamente los procesadores: instrucciones para comparar, saltar y llamar).
Al siguiente día solo pude trabajar 3 horas en la noche, así que adapté las sentencias de control de IntyBASIC (FOR/NEXT, WHILE/WEND, DO/LOOP y EXIT). Con todo esto funcional, fue más claro ver donde se podían optimizar los saltos condicionales que generaba el compilador.
El último día de febrero (2024 es bisiesto), comencé a convertir Viboritas al lenguaje CVBasic para determinar que construcciones me faltaban y también para detectar bugs (había montones). Implemente el manejo de los controles. Tuve que codificar rutinas de multiplicación de 16 bits, división y módulo, junto con un generador de números pseudoaleatorios. Decidí también la sintaxis para la sentencia SOUND, me seguí implementando RESTORE/READ/DATA y agregué soporte para arreglos debido a que simplifica la programación de juegos.
En la tarde me puse a toda marcha para escribir el manual, y en una hora optimicé el generador de código para eliminar la mayor parte de las instrucciones PUSH/POP y hacer que CVBasic sea razonablemente eficiente. También un solo ejemplo de juego no era suficiente, así que añadí otro ejemeplo: Space Attack.
Tarde en la noche publiqué CVBasic v0.1.0.
En sólo 3 días, creé 2956 líneas de código fuente para el compilador (parte de esto derivado de IntyBASIC), 600 líneas ensamblador para la librería, y 1100 líneas de código CVBasic para los ejemplos. Un total de 4656 líneas de código.
Viboritas portado a CVBasic
Viboritas portado a CVBasic.

Uso de CVBasic

Siguiente las convenciones de la línea de comandos, CVBasic es un compilador cruzado que toma código fuente BASIC y lo convierte a código ensamblador Z80. El código ensamblador debe ser procesado por Gasm80 para generar el binario final.
Este es el proceso de compilación:
cvbasic game.bas game.asm
gasm80 game.asm -o game.rom
El archivo ROM final puede ser ejecutado con cualquier emulador de Colecovision como el mío CoolCV, Adamem, GearColeco, BlueMSX, or OpenMSX.
Como alternativa puedes obtener una PCB de cartucho (parecida a esta) y programar tu juego de video para correr en una consola Colecovision de verdad.
CVBasic incluye soporte para el video del Colecovision y características de sonido en la forma de órdenes como SPRITE y SOUND, intentando ser lo más cercano al hardware y lo más práctico para el usuario.
Pretendo mantener actualizada esta versión previa y añadir nuevas características al compilador.

Descargas

Sugiero descargar la versión más reciente (v0.4.1) desde los foros de AtariAge.
CVBasic necesita Windows XP como mínimo, pero si su versión no tiene packs de servicio podría requerir el Visual C++ 2008 runtime, o la versión 2010 (para CVBasic v0.2.0 en adelante)
La versión 0.2.0 incluye binarios para Mac y Linux. La versión 0.4.0 ya incluye binarios para Raspberry Pi.
El manual del usuario está incluído en el archivo ZIP.
Sugiero registrarse en Atariage para obtener ayuda sobre como usar CVBasic leyendo el foro Colecovision Programming o poniendo preguntas.

Space Attack

Ligas relacionadas

Última modificación: 14-mar-2024