Manual · 7
C para cartuchos ELF
Los cartuchos ELF tienen un procesador ARM que ejecuta un programa en C y le da al 2600 sus instrucciones según las va pidiendo. VCSIDE trae una plantilla que sigue las reglas que necesitan estos cartuchos, y las comprueba tras cada compilación.
Qué se ejecuta dónde
El juego se escribe en C y se compila para el ARM del cartucho (un Cortex-M0) con arm-none-eabi-gcc. Durante las líneas visibles, el ARM entrega al 6507 cada instrucción que ejecuta, a través de una biblioteca que proporciona el cargador del cartucho. Durante el overblank, el 6507 ejecuta la sincronía vertical, el borrado vertical y el overscan con un programa pequeño propio, y el ARM queda libre para la lógica del juego.
La ROM, build/<nombre>.bin, es un archivo ELF reubicable. Funciona en Stella y Gopher2600 y en el PlusCart y el UnoCart. Para el Chameleon Cart se enlaza con el firmware de ese cartucho.

La plantilla
Un proyecto nuevo de C para ELF tiene:
| Archivo | Qué es |
|---|---|
Makefile | Compila la ROM con las opciones que necesitan estos cartuchos y comprueba el resultado. |
include/vcsLib.h | Los registros del TIA y el RIOT y las funciones del cargador. |
src/main.c | El juego. El ejemplo dibuja un arcoíris que se desplaza, y vuelve al menú con RESET en un multicartucho. |
src/trampolines.S | Llamadas largas al cargador, y a memcpy y memset. |
chameleon/support.c | Lo que añade la compilación para el Chameleon Cart. |
La plantilla es CC0. También puedes empezar con el ejemplo del sprite animado, con el mismo hero.vcsgfx que el de ensamblador y su src/hero.gfx.h. Mira qué escribe al guardar.
Las reglas que sigue
- Código para un Cortex-M0, con los datos en secciones propias y una sola sección de código.
- Un enlazado parcial con libgcc, sin lo que el cargador no necesita, y con las divisiones de libgcc renombradas.
- Las llamadas al cargador son llamadas largas, porque el cargador puede estar en cualquier parte de la flash del cartucho.
- El kernel se ejecuta desde la RAM (
RAM_FUNC, la sección.RamFunc), donde el ARM es lo bastante rápido para cada línea.
Tras enlazar, el Makefile comprueba el resultado:
- todo símbolo sin definir que no sea del cargador se da como error en el archivo que lo usa, como
src/main.c: error: undefined symbol 'foo'(con un enlazado parcial el enlazador no lo trata como tal, y el emulador lo enlazaría a la dirección 0); - ninguna llamada al cargador es corta.
Compilar y errores
F7 ejecuta el build_command del proyecto, make. Las carpetas de la cadena de herramientas Arm y de Make se ponen al principio de su PATH, ya que un programa abierto desde el escritorio no tiene el del shell.
Todo va a Problemas: los errores de gcc en su línea, los mensajes sin línea, los de ld (una referencia sin definir con la función que la hace, una región que se desborda), las comprobaciones anteriores y los errores del propio make.
Para el Chameleon Cart:
make chameleon CHAMELEON_FW=<folder of the Chameleon Cart's template>
La plantilla del firmware del Chameleon Cart no se incluye con VCSIDE.
Espacio
El informe de espacio lee el archivo ELF: código, código en RAM, constantes y variables, y la memoria del cartucho elegido para el proyecto: la flash y la RAM del Chameleon Cart, o la RAM del PlusCart y el UnoCart.
Ejecutar y depurar
F5 ejecuta la ROM en Stella o Gopher2600 como cartucho ELF. Ninguno de los dos emuladores puede parar en una línea de C, así que los puntos de ruptura no se pasan. Las opciones del emulador incluyen las comprobaciones del ARM para ELF.