ZX Spectrum – Cargando BASIC de manera personalizada (III): carga Turbo

Para esto emplearemos la rutina nanodrive de la Microhobby 65, mejorada luego en la revista 81. La rutina tal cual no me sirve (llamar a la rutina con DEF FN no es compatible con sobreescribir el BASIC). Así que después de depurarla un poco, vamos a ver qué es lo que no nos han contado los de Microhobby.

A la rutina se entra por 65170, e inmediatamente después empiezan a cargar datos desde el calculador. Una vez metidos en registros (65192) se comprueba si vamos a cargar o salvar, se pone el flag a 255 y se salta a la rutina correspondiente. Así que tenemos 3 puntos alternativos de entrada de los que no nos habían contado nada:

  • En la dirección 65192, es la entrada “general”. En IX ponemos el inicio del bloque, en DE la longitud y en A ponemos 0 para grabar y 1 para cargar. El flag siempre es 255.
  • En la dirección 65206 tenemos la rutina SAVE, y se aceptan los mismos parámetros que en la de la ROM.
  • En la dirección 65333 tenemos la rutina LOAD, y también acepta los parámetros de la ROM.

De momento, para hacer más genérica la cosa, entraré por 65192. Hago un pequeño parche de 12 bytes que cargue los registros como quiero y así no tengo que usar DEF FN:

org 65158
ld a,0
ld ix,23552
ld de,35083
jp 65192

Mi nueva rutina cargará a partir de 65158 y tendrá una longitud de 377 bytes. La voy a manejar con los siguientes POKEs:

POKE 65159,n: REM 0 para grabar, 1 para cargar
POKE 65162,ixl: POKE 65163,ixh: REM bytes bajo y alto del inicio del bloque
POKE 65165,del: POKE 65166,deh: REM bytes bajo y alto de la longitud

El resto de POKEs son los mismos que los publicados en el número 81, y mi rutina está ya modificada para ir a 3850 baudios. Una vez generada mi rutina modificada, tenemos que liarnos con dos cosillas:

– El CLEAR 65157.
– Guardar el BASIC como bloque turbo.

Así que nuestra nueva línea para grabar el juego será algo así:

9999 CLEAR 65157:
     POKE 65159,0:
     POKE 65162,0:POKE 65163,92:
     POKE 65165,PEEK 23653: POKE 65166,(PEEK 23654)-91:
     SAVE "nanodrvz" CODE 65158,377:
     PRINT USR 65158:RUN 7600

Esta línea solo funcionará si ya está cargada la rutina nanodrive en memoria.

Destripándola un poco, los tres primeros POKEs indican que voy a grabar desde la dirección 23552. No son necesarios porque la rutina nanodrive que hay en la cinta ya tiene esos valores puestos. Luego POKEo la longitud. Para ello copio los valores de STKEND, pero al byte alto le resto 91 (lo que hace que POKEe en realidad STKEND-23296), lo que me da un bloque que copia 256 bytes extra (por si las moscas). Por último, grabo la rutina nanodrive ya POKEada y el bloque turbo. Dos pequeñas cosas:

– Según las instrucciones de Microhobby, para que nanodrive grabe hay que pulsar la tecla 0.
– La mayoría de emuladores no pueden grabar bloques turbo a tzx. El único que he conseguido que funcione es el ZX Spin, pero no funciona automáticamente. Para que grabe el bloque turbo, hay que ir al menú Recording > Tape Recording > Start Recording. Utilizando esta opción, generará un bloque de tipo “Direct Recording” bastante hermoso… estoy investigando como convertirlo a un bloque turbo “normal”.

En cuanto al cargador BASIC, será algo de este estilo:

10 BORDER 0: PAPER 0: INK 0: CLEAR 65157
20 LOAD "" CODE: POKE 65159,1
30 PRINT USR 65158

…y con esto tenemos un BASIC turbo. Observad que no POKEo ni inicio ni longitud… en los pasos anteriores hemos grabado la rutina con estos datos ya incluídos. Lo único que meto es el POKE para que en vez de grabar, cargue.

Enlaces interesantes:

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