Entorno de ejecución de cc65 para el C64

Programación retro del Commodore 64

  • Programación retro del Commodore 64
  • “Programación Retro del Commodore 64” es un blog sobre el hardware, el sistema operativo, y la programación del Commodore 64. Y más específicamente sobre programación en ensamblador. Pretende ser un blog con información de calidad, y referencia en español de la programación retro de esta maravillosa máquina.
    • Mi blog
« Publicado el: 07/10/2022 »

Como ya comentamos algunas entradas más atrás, el resultado de compilar y enlazar un programa en C para el C64 con cc65 es un programa en código máquina con un cachito de BASIC que llama al código máquina con un comando SYS. Por tanto, los programas preparados con cc65 se cargan y ejecutan como si fueran programas en BASIC, pero su grueso es código máquina. Esta es la configuración por defecto, aunque se puede cambiar.

Respecto al mapa de memoria de los programas, estos empiezan en $0801, puesto que tienen ese trocito de BASIC, y pueden llegar hasta $cfff. Esto es así porque cc65 desactiva el intérprete de BASIC ($a000 – $bfff), pero mantiene los chips de entrada / salida (VIC, SID, RAM de color y CIAs) y el kernal.

La RAM de pantalla, salvo que se utilice el driver de Conio para 80 columnas, sigue en su sitio habitual: $0400 – $07e7. La pila de C empieza en $cfff y crece hacia abajo; no hay que confundir esta pila con la pila del C64 (página 1; $0100 – $01ff). Por último, el “heap”, que es de donde C saca la memoria para las estructuras de datos dinámicas que pudiera usar el programa (ej. listas enlazadas, árboles, etc.), se ubica al final del programa y crece hacia la pila (la pila de C).

Por tanto, el mapa de memoria sería algo así:

Ya comentamos anteriormente que cc65 tiene header files específicos para el C64 (cbm.h y c64.h), así como estructuras (structs) vinculadas a las direcciones de memoria del VIC, SID, RAM de color y CIAs, lo que permite manipular cómodamente desde C los registros de estos chips, básicamente haciendo asignaciones de valores a los campos de esas estructuras.

cc65 también tiene drivers para que el C64 pueda manejar gráficos TGI, la consola con Conio, el ratón, el joystick, etc., como hemos ido comentando en entradas anteriores.

También es interesante comentar que, para que el programa en C pueda recibir parámetros del entorno, se puede usar esta sintaxis al ejecutar el programa desde BASIC:

RUN : REM ARG1 “ARG 2” ARG3 “ARG 4” …

Igualmente, el programa en C puede devolver un valor de retorno al BASIC en la posición de memoria STATUS = $90 = 144.

Por último, es interesante comentar que es posible programar en C sacando provecho de las interrupciones del C64, si bien para ello las rutinas de interrupción tienen que estar en ensamblador.

Todo esto y mucho más se puede ver en detalle en la página:

https://cc65.github.io/doc/c64.html

Código de ejemplo: argumentos