Taller de Juan AntonioZX Spectrum

El taller de Juanan: 0x05 Load Screen and DSK

25/01/2025

Añadir una pantalla de carga

En esta ocasión dejo de lado el ensamblador y me voy a centrar en como añadir una pantalla de carga a los programas.

La pantalla de carga se puede diseñar con ZXPaintbrush, que se puede descargar desde aquí, o como es mi caso, la puedes bajar desde Spectrum Computing; yo me he bajado las pantallas de carga de Sir Fred, Game Over, La Abadía del Crimen y Cauldron II.

Lo primero es transformar los archivos de pantalla de carga, con extensión .scr, a archivos de cinta, con extensión .tap. Para ello abro cada uno de los archivos con ZXPaintbrush, en el menú File selecciono el submenú Export File/selection as, le pongo un nombre al archivo, en tipo selecciono All tape files (*.tap;*.blk;*.tzx;*.tsx;*.pzx), hago clic en guardar y cuando pide nombre de cabecera, le pongo uno. Con esto ya tengo la pantalla de carga lista para incluirla en mi programa.

Yo tengo cuatro pantallas de carga ya preparadas:

  • SirFred.tap
  • GameOver.tap
  • LaAbadiaDelCrimen.tap
  • CauldronII.tap

Primero voy a hacer una prueba, con un sencillo programa en Basic, para cargar las cuatro pantallas de carga (uso un emulador para ello):

10 PAPER 0:INK 7:BORDER 0:CLS
20 LOAD""SCREEN$
30 PAUSE 100:PAPER 0:INK 7:CLS
40 LOAD""SCREEN$
50 PAUSE 100:PAPER 0:INK 7:CLS
60 LOAD""SCREEN$
70 PAUSE 100:PAPER 0:INK 7:CLS
80 LOAD""SCREEN$
90 PAUSE 0:PAPER 7:INK 0:BORDER 7:CLS

Cambio color de fondo, tinta y borde, limpio la pantalla, cargo la pantalla de carga y hago una pequeña pausa antes de volver a cambiar los atributos y limpiar la pantalla para cargar la siguiente. Grabo el programa como Loader.tap.

Ahora ya tengo cinco ficheros de cinta, solo falta juntarlos todos en uno; lo hago desde la línea de comandos.

Windows

copy /b /y Loader.tap+CauldronII.tap+GameOver.tap+LaAbadiaDelCrimen.tap+SirFred.tap Screens.tap

Linux

cat Loader.tap CauldronII.tap GameOver.tap LaAbadiaDelCrimen.tap SirFred.tap > Screens.tap

Ahora ya tengo el archivo de cinta Screens.tap listo para cargar.

Añadir pantalla a un programa existente

Si ya tengo un programa, por ejemplo uno de los que he utilizado en entregas anteriores, sólo tengo que modificar unas líneas para añadirle una pantalla de carga.

  1 DATA 0,3,15,63,127,123,125,62
  2 DATA 0,128,193,243,255,255,187,253
  3 DATA 48,120,254,255,249,246,239,255
  4 DATA 0,24,124,252,254,254,124,120
  5 DATA 31,7,3,1,0,0,0,0
  6 DATA 254,255,247,231,3,1,0,0
  7 DATA 255,47,223,255,249,240,224,0
  8 DATA 224,240,248,240,192,0,0,0
  9 DATA 63,127,239,247,238,127,63,0
 10 DATA 255,255,190,119,251,255,255,0
 11 DATA 248,252,238,222,190,252,248,0
 20 CLS 
 30 LOAD""SCREEN$
 40 CLS:BORDER 0:PAPER 0:INK 7:CLS :
    PRINT FLASH 1;AT 10,8;"CARGANDO DATOS"
 50 FOR i=0 TO 87:READ a:POKE USR "A"+i,a:NEXT i
100 BORDER 1:PAPER 5:INK 7:CLS
110 PRINT AT 1,5;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147):
    PRINT AT 2,5;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
120 PRINT AT 2,15;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147): 
    PRINT AT 3,15;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
130 PRINT AT 1,25;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147): 
    PRINT AT 2,25;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
140 INK 1:PRINT AT 5,10;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147): 
    PRINT AT 6,10;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
150 PRINT AT 9,0;INK 3;CHR$(152)+CHR$(153)+CHR$(154):
    PRINT AT 10,10;INK 2;CHR$(152)+CHR$(153)+CHR$(154):
    PRINT AT 9,20;INK 1;CHR$(152)+CHR$(153)+CHR$(154)
160 INK 2:PAPER 6:
    FOR f=18 TO 20 STEP 2: 
    PRINT AT f,0;CHR$(152)+CHR$(153)+CHR$(153)+CHR$(154);: 
    FOR c=0 TO 6: PRINT CHR$(152)+CHR$(153)+CHR$(153)+CHR$(154);:
    NEXT c:
    NEXT f
170 FOR f=19 TO 21 STEP 2: 
    PRINT AT f,0;CHR$(153)+CHR$(154)+CHR$(152)+CHR$(153);: 
    FOR c=0 TO 6: 
    PRINT CHR$(153)+CHR$(154)+CHR$(152)+CHR$(153);:
    NEXT c:
    NEXT f
180 INK 1:PAPER 5:PRINT AT 13,5;"Play On Retro Magazine":
    PRINT AT 15,8;"Pulse una tecla"
200 PAUSE 0
210 CLS

He prescindido de los DATA de las rutinas. En la línea 20 limpio la pantalla y en la 30 cargo la pantalla de carga. He grabado este programa como Sample1.tap.

Ahora tengo que montar el archivo de cinta final, y para ello he elegido la pantalla de carga de Sir Fred.

copy /b /y Sample1.tap+SirFred.tap Sample.tap

Añadir pantalla sin modificar el programa existente

Por último, voy a añadir la pantalla de carga sin modificar el programa existente.

  1 DATA 0,3,15,63,127,123,125,62
  2 DATA 0,128,193,243,255,255,187,253
  3 DATA 48,120,254,255,249,246,239,255
  4 DATA 0,24,124,252,254,254,124,120
  5 DATA 31,7,3,1,0,0,0,0
  6 DATA 254,255,247,231,3,1,0,0
  7 DATA 255,47,223,255,249,240,224,0
  8 DATA 224,240,248,240,192,0,0,0
  9 DATA 63,127,239,247,238,127,63,0
 10 DATA 255,255,190,119,251,255,255,0
 11 DATA 248,252,238,222,190,252,248,0
 20 DATA 58,176,92,33,0,88,17,1
 21 DATA 88,1,255,2,119,237,176,201
 40 CLS:BORDER 0:PAPER 0:INK 7:CLS:
    PRINT FLASH 1;AT 10,8;"CARGANDO DATOS"
 50 FOR i=0 TO 87:READ a:POKE USR "A"+i,a: NEXT i
100 BORDER 1:PAPER 5:INK 7:CLS
110 PRINT AT 1,5;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147):
    PRINT AT 2,5;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
120 PRINT AT 2,15;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147):
    PRINT AT 3,15;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
130 PRINT AT 1,25;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147):
    PRINT AT 2,25;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
140 INK 1:PRINT AT 5,10;CHR$(144)+CHR$(145)+CHR$(146)+CHR$(147):
    PRINT AT 6,10;CHR$(148)+CHR$(149)+CHR$(150)+CHR$(151)
150 PRINT AT 9,0;INK 3;CHR$(152)+CHR$(153)+CHR$(154):
    PRINT AT 10,10;INK 2;CHR$(152)+CHR$(153)+CHR$(154):
    PRINT AT 9,20;INK 1;CHR$(152)+CHR$(153)+CHR$(154)
160 INK 2:PAPER 6:
    FOR f=18 TO 20 STEP 2: 
    PRINT AT f,0;CHR$(152)+CHR$(153)+CHR$(153)+CHR$(154);: 
    FOR c=0 TO 6: 
    PRINT CHR$(152)+CHR$(153)+CHR$(153)+CHR$(154);:
    NEXT c:
    NEXT f
170 FOR f=19 TO 21 STEP 2: 
    PRINT AT f,0;CHR$(153)+CHR$(154)+CHR$(152)+CHR$(153);:
    FOR c=0 TO 6: PRINT CHR$(153)+CHR$(154)+CHR$(152)+CHR$(153);:
    NEXT c:
    NEXT f
    180 INK 1:PAPER 5:PRINT AT 13,5;"Play On Retro Magazine":
    PRINT AT 15,8;"Pulse una tecla"
200 PAUSE 0
210 CLS

El programa es casi idéntico al anterior, pero en este no se carga la pantalla de carga. No siempre va a venir bien modificar el programa, así que voy a añadir la pantalla de carga sin modificar ni una sola línea del programa, que he grabado como Sample2_2.tap.

Dado que no voy a modificar el programa, necesito desarrollar un sencillo cargador que voy a grabar como Sample2_1.tap.

10 CLS 
20 LOAD""SCREEN$
30 POKE 23739,111
40 LOAD""

Limpio la pantalla, cargo la pantalla de carga, el POKE es para que no salgan las cabeceras en la pantalla y así evitar que borre parte de la pantalla de carga, y cargo el programa que no he querido modificar.

Monto el archivo de cinta final y he acabado.

copy /b /y Sample2_1.tap+SirFred.tap+Sample2_2.tap Sample2.tap

Creación del disco (DSK)

Para crear un disco voy a usar la herramienta ZX-Blockeditor que puedes descargar desde aquí.

Una vez que abro el programa, añado la cabecera del disco desde el menú Edit y haciendo clic sobre el submenú Compose datablock. En la ventana que se abre, voy a la pestaña disck, selecciono el bloque DSK format +3/180k y el formato de imagen Extended DSK. Finalmente, hago clic en Add first.

ZX-Blockeditor

Con esto ya tengo listo el disco para añadir la cinta y convertirla.

ZX-Blockeditor

Para añadir la cinta, voy al menú Tools y hago clic en el submenú Import file. Busco y selecciono el fichero Sample2.tap. Dejo seleccionados solo los ficheros de programa y bytes y hago clic en OK.

ZX-BlockEditor

Ya tengo la cinta en el disco, pero tengo que cambiar los tipos de cabecera por tipos válidos para disco. Las cabeceras son las que tienen el icono en forma de pelotita roja. Tengo el cargador que hice, Sample2_1, la pantalla de carga, SirFred, y el programa original, Sample2_2.

Hago doble clic sobre PROGR “Sample2_1” LINE 1. En la pantalla que se abre voy a la pestaña DSK, selecciono el bloque program autostart header y cambio el nombre del programa por DISK. Hago clic en OK.

ZX-BlockEditor

Le he cambiado el nombre al programa porque en el menú del +3 al seleccionar Cargador ejecuta LOAD”DISK”, así ya tengo mi disco preparado para que se ejecute de manera automática.

Modifico el tipo de bloque de la pantalla de la pantalla de carga.

ZX-BlockEditor

Modifico el tipo de bloque del programa original y le cambio el nombre para simplificarlo.

ZX-BlockEditor

Ya tengo el disco listo para grabarlo.

ZX-BlockEditor

Hago clic en el disquete y lo grabo como Sample2.dsk. Ya puedo cargarlo en el emulador pero me da errores, F NOMBRE INCORRECTO.

En cinta los archivos están grabados secuencialmente, por eso no es necesario especificar en el comando LOAD el nombre del fichero a cargar. En disco es distinto, es imprescindible indicar el nombre del fichero a cargar en el comando LOAD.

Cargo en el emulador el cargador desde el Basic del +3 tecleando el comando MERGE”DISK”. El listado de DISK es el siguiente:

10 CLS 
20 LOAD""SCREEN$
30 POKE 23739,111
40 LOAD""

Únicamente tengo que indicar el nombre de los ficheros que quiero cargar. Incluso sobra la línea 30, que no borro por si luego quiero convertir el disco en cinta.

10 CLS 
20 LOAD"SIRFRED"SCREEN$
30 POKE 23739,111
40 LOAD"SAMPLE2"

Grabo los cambios con SAVE”DISK”LINE 10, reseteo el +3 y vuelvo a intentar la carga.

Sir Fred

Al grabar los cambios de DISK se ha generado el archivo DISK.bak. Para borrarlo, desde el Basic del +3 tecleo erase»*.bak», presiono ENTER y después S.

Ya tengo mi programa en cinta y disco.

Podéis descargar todos los archivos utilizados en este artículo desde aquí.

 

ZX Spectrum

Deja una respuesta