Cargador BASIC

Cuando desarrollamos un programa en ensamblador con CMB prg Studio podemos ensamblarlo y cargarlo con Ctrl + F5. Si el programa tiene errores de ensamblado habrá que corregirlos; si no los tiene el programa se cargará y quedará listo para ejecutar. Para ejecutarlo tendremos que ejecutar manualmente la sentencia BASIC “SYS 49152”, donde 49152 debe sustituirse por la dirección de comienzo del programa en ensamblador (ej. * = $c000).

El proceso puede automatizarse un poco más con un “cargador BASIC”. Un cargador BASIC es un programa en BASIC que carga y ejecuta el programa en ensamblador. Este programa en BASIC puede generarse automáticamente desde CBM prg Studio con Tools > Generate BASIC Loader.

Utilizando esta opción se genera automáticamente un programa en BASIC similar al que sigue:

Cargador BASIC

Este programa es muy sencillo, y consta de:

  • Una variable llamada “SA” con la dirección de comienzo del programa en ensamblador.
  • Un bucle “FOR – NEXT” que recorre la sección DATA y carga el programa en ensamblador a partir de la dirección de comienzo.
  • Una llamada “SYS” para ejecutar el programa en ensamblador.
  • Una sección DATA con el programa en ensamblador ya ensamblado y codificado en decimal.

Este programa puede guardarse en un archivo *.bas y, a partir de ese momento, puede utilizarse para cargar y ejecutar el programa en ensamblador.

Otra alternativa es generar una llamada “SYS” e insertarla en el programa en ensamblador. Esto se hace en CBM prg Studio con Tools > Generate SYS Call.

Si utilizamos esta opción CBM prg Studio nos preguntará la dirección a la que llamar, y nos ofrecerá un par de opciones que no tienen mucha importancia (comentario y si la llamada será “elaborada” o “estándar”):

SYS Call

Elijamos lo que elijamos, CMB prg Studio generará e insertará en nuestro programa en ensamblador una secuencia de bytes como la que sigue:

SYS Call 2

Esa secuencia de bytes se carga a partir de la posición $0801, es decir, justo en el comienzo de la RAM de BASIC. Y es la forma en que BASIC codifica la sentencia “10 SYS 49152”.

Es decir, no es más que una forma indirecta de cargar en BASIC el programa “10 SYS 49152” (o “10 SYS DIRECCIÓN”), que vale para ejecutar nuestro programa en ensamblador.

De las dos opciones presentadas, cargador BASIC y llamada SYS, a mí me gusta más la segunda. Se genera menos BASIC y el grueso del trabajo se sigue haciendo en ensamblador. Además, con la segunda opción, aunque cambie el programa en ensamblador, el programa en BASIC no cambia (porque sólo es una llamada BASIC => ensamblador), mientras que con el cargador cada vez que cambie el programa en ensamblador habrá que regenerar el cargador.


Programa de ejemplo: Prog39

Un comentario en “Cargador BASIC”

  1. Hola.

    En el libro “Commodore 64 exposed”, y más en particular en su página 45, se describe el formato en que se almacenan en memoria los programas en BASIC. Este formato es muy interesante y merece la pena conocerlo.

    A partir de la dirección $0801, y para cada línea del programa BASIC, el formato es así:

    – Dos bytes con la dirección en memoria de la siguiente línea del programa BASIC. Formato low – high. Si se trata de la última línea, entonces vale $00 – $00.
    – Dos bytes con el número de línea de la línea BASIC actual. Formato low – high.
    – N bytes con el texto de la línea BASIC. Las palabras reservadas o instrucciones no se almacenan en formato literal, sino tokenizadas (es decir, mediante códigos). El resto se almacena en formato literal.
    – Un byte de fin de línea. Siempre vale $00.

    De este modo, ahora entendemos por qué la SYS call generada por CBM prg Studio para un programa en ensamblador que empieza en $c000 es así:

    ; 10 SYS49152
    *=$0801
    BYTE $0C, $08, $0A, $00, $9E, $34, $39, $31, $35, $32, $00, $00, $00

    Es decir:

    – La siguiente línea, caso de existir, empezaría en $080c.
    – El número de esta línea es $000a, es decir, 10.
    – $9e es el token para la instrucción SYS.
    – $34, $39, $31, $35, $32 es la codificación literal de 49152.
    – $00 es el fin de línea.
    – $00, $00 ya sería el comienzo de la siguiente línea que, como no existe, vale $0000.

    Obsérvese que los espacios en BASIC son opcionales. Por eso es lo mismo 10 SYS49152 (sin espacio) que 10 SYS 49152 (con espacio). Ahora bien, si se ponen espacios entonces aparecen en el texto en memoria como caracteres $20.

    Todo esto es fácil de comprobar con VICE. Se arranca VICE, se teclea un programa BASIC (en modo programa, no en modo inmediato) y se analiza la memoria a partir de $0801 con el monitor (ALT + M).

    Saludos, HVSW.

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s