ZX Spectrum – Cargando BASIC de manera personalizada (IV): compresión ZX7

AVISO: Hasta ahora, todo lo que he hecho se podía hacer tanto en una máquina real como con emuladores (yo he usado emuladores por comodidad). A partir de aquí, vamos a tener que hacer manipulaciones que van a involucrar obligatoriamente a un PC (aunque luego el resultado pueda usarse en un Spectrum normalito).

Ahora vamos a complicar algo más las cosas. Hay dos formas de reducir el tiempo de carga: acelerando la rutina de carga o haciendo el programa más pequeño. Ahora vamos a usar zx7 para poder hacer más pequeño el programa y que cargue más rápido. Para eso vamos a utilizar un compresor, en este caso el zx7.

La teoría es sencilla: puesto que nuestro BASIC es ahora una tira de bytes (CODE), lo comprimimos. Después debemos cargarlo y volver a descomprimirlo en su sitio (23552). El mayor problema de esta teoría es buscar un sitio para el BASIC comprimido: si no elegimos bien el sitio, puede que al descomprimirlo escribamos por encima de los datos comprimidos y la liemos. Os acordáis de que STKEND nos marca el lugar donde acaba el BASIC, ¿verdad? Pues este dato va a ser terriblemente importante, ya que no podremos meter los datos comprimidos por debajo de STKEND (bueno, en realidad vamos a dejar un poco más de espacio por si las moscas). De momento, hacemos MERGE “” a nuestro programa y ejecutamos PRINT PEEK 23653+256*PEEK 23654. A este resultado (en mi caso 52957) le añadimos unos 500 bytes para hacer sitio a la pila y otras cosas. Así que ahora modificamos la línea de grabación del programa:

9999 CLEAR 53499:
     LET STKEND=PEEK 23653+256*PEEK 23654:
     SAVE "basic" CODE 23552,STKEND-23500:
     CLEAR 65367: RUN 7600

Como he colocado el CLEAR muy bajo, voy a restaurarlo al valor por defecto antes de hacer el RUN (por si acaso el programa genera muchas variables y necesita mucha memoria). Hago el consabido GO TO 9999 y obtengo un bloque CODE para manipular a mi antojo.

Ahora vienen las cosas raras. Cogemos el tzx que acabamos de grabar y lo metemos al ZX Block Editor. Nos ponemos sobre el último bloque y pulsamos el botón derecho del ratón.  Elegimos Export as > Export as binary file y lo llamamos almacen.bin. En mi caso, he exportado un fichero de 29547 bytes con el BASIC de mi programa.

Ahora ejecuto zx7 almacen.bin y zx7 nos genera un fichero almacen.bin.zx7 que ocupa 7275 bytes, lo que es un ahorro bastante importante de espacio.

Mi plan es cargar esos datos comprimidos a partir de 53600, ya que entre 53500 y 53600 voy a poner la rutina de descompresión. Tiro de calculadora y veo que caben perfectamente en la memoria. Perfecto. Ahora viene la siguiente manipulación rara.

Abro ZX Spin y tecleo lo siguiente:

CLEAR 53499: SAVE "basic" CODE 53500,7275+100

Cuando me aparece el mensaje “Press REC & PLAY…” no pulso ninguna tecla (por llevar la contraria) y hago las siguientes cosas:

– Voy al menú Tools > ZX Assembler y tecleo lo siguiente:

org 53500
ld hl,53600
ld de,23552

Sin hacer nada más, abro el fichero dzx_standard.asm que se incluye en zx7, corto todo el texto y lo copio en la ventana del ZX Assembler.

Con todo ese texto en la ventana, voy al menú File > Assemble… y le doy a OK. ZX Spin me informa que ha ensamblado 75 bytes. Ahora voy a la ventana principal de ZX Spin y le doy a File > Load Binary File. En el cuadro de diálogo elijo mi fichero (almacen.bin.zx7) y como Start Address marco 53600.

Ahora que ya tengo los datos comprimidos en la memoria del Spectrum, pulso Enter y dejo que el bloque CODE se grabe. Para comprobar que el juego es ejecutable, hago un PRINT USR 53500.

Así que tengo ya un fichero CODE que contiene el BASIC comprimido y se puede ejecutar… vale, toca hacer el cargador BASIC. Esta vez será lo siguiente:

10 BORDER 0: PAPER 0: INK 0: CLEAR 53499
20 LOAD "" CODE
30 PRINT USR 53500

Una detalle interesante: si los datos comprimidos ocupan menos de 6000 bytes y no usáis pantalla de carga, podéis cargar tanto la rutina descompresora como los datos comprimidos en la memoria de pantalla. Haciéndolo así nos ahorraremos dolores de cabeza acerca de dónde poner el CLEAR y si el BASIC nos pisará los datos comprimidos.

Y los más avispados se preguntarán… ¿qué nos impide ponerle un contador o un turbo a este bloque de datos? Y después de meditarlo, la respuesta es… nada.

He incluido versiones con contador y turbo en la cinta, pero como ya he explicado cómo utilizar esas herramientas me reservo el derecho (o no) de explicarlo en otros artículos. La única precaución en estos casos es que el bloque comprimido no colisione con las rutinas de carga.

Enlaces interesantes:

  • Almacén Lunar: Todas las versiones de este programa.
  • ZX Spin: Mi emulador favorito, el que uso para todos los parcheos.
  • ZX7: Compresor para Spectrum. Hay descargas del compresor para PC y código fuente para las rutinas en ensamblador para descomprimir. Hay un hilo dedicado a este compresor en World of Spectrum.
  • ZX Block Editor: Completo programa para manipular ficheros de Spectrum.
Anuncios

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 )

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 )

Google+ photo

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

Conectando a %s