La rutina del Kernal involucrada en la escritura de ficheros es SAVE:
A su vez, la rutina SAVE hace referencia a las rutinas SETLFS y SETNAM:
Comparando estas tres rutinas con la grabación BASIC vista en la entrada anterior, la analogía salta a la vista:
- Rutina SETLFS: Especificará el dispositivo y si el fichero incluirá cabecera de dirección.
- Rutina SETNAM: Especificará el nombre del fichero.
- Rutina SAVE: Especificará el rango de posiciones de memoria a grabar y dará la propia orden de grabación del fichero.
Llegados a este punto, lo mejor es que el lector revise y ejecute el programa de ejemplo. Se trata de un programa en ensamblador que graba en disco el contenido de una zona de memoria (que a su vez es otro pequeño programa).
Partiremos de una imagen D64 vacía como esta:
La conectaremos al emulador VICE (“Attach”) y ejecutaremos el programa de grabación con SYS 49152. Veremos esto:
Y ahora tendremos una imagen D64 con el fichero “MIPROGRAMA”:
En la siguiente entrada, veremos cómo cargar “MIPROGRAMA” desde un programa en ensamblador. Sin embargo, por el momento nos conformaremos con cargar y ejecutar “MIPROGRAMA” desde BASIC, básicamente para comprobar que está bien grabado y que se puede recuperar bien.
Cerraremos el emulador VICE actual y arrancaremos otro, de modo que partamos de un mapa de memoria completamente limpio. Conectaremos la imagen DISCO.D64 al nuevo VICE.
Dado que “MIPROGRAMA” es un programa en ensamblador, y no BASIC, la carga no debe producirse en la zona BASIC, sino en la dirección indicada por la cabecera del fichero ($c102 = 49410). Es decir, no deberemos usar LOAD “MIPROGRAMA”, 8, sino LOAD “MIPROGRAMA”, 8, 1 (el ,1 del final es fundamental):
Si hacemos LIST no veremos nada, porque no hemos cargado un programa en BASIC, sino un programa en ensamblador. Y si hacemos SYS 49410 lo ejecutaremos:
Como se puede observar, el programa que se ha cargado y ejecutado es el mismo que se grabó (ver fichero MiPrograma.asm), como no podía ser de otro modo.
En la siguiente entrada se verá cómo hacer esta carga también desde un programa en ensamblador.
Programa de ejemplo: Prog59