Uso de código en bancos de memoria en NEXTBasic
En este pequeño artículo comentaremos cómo usar los bancos de memoria disponibles en el ZX Spectrum Next para almacenar en ellos código NEXTBasic ejecutable desde el programa.
Además de código, en lo bancos de memoria, pueden ubicarse drivers, definición de sprites y tile, archivos de sonido y otros recursos, si bien en estos momentos, nos centraremos en el código.
ZX Spectrum Next tiene versiones de 1 y 2 megabytes, lo que significa un aumento significativo respecto a la cantidad de memoria de los spectrums originales de 16k, 48k y 128k.
Por cuestiones de diseño y capacidad de direccionamiento del procesador, éste no es capaz de acceder de forma lineal a la cantidad total de memoria teniendo que fragmentarla en bloques de 16k, llamados bancos. En estos bancos podemos almacenar las distintas partes de nuestro programa y llamarlos para ejecutar el código que se encuentre en ellos.
El uso de bancos permite hacer programas más largos y, combinados con otras técnicas como el uso de procedimientos o subrutinas, más modulares pudiendo incluso hacer código reutilizable en otros proyectos si se diseña de forma correcta.
La memoria se compone de un total de 48 bancos (numerados de 0 a 47) en los NEXTs de 1 mega o 112 bancos (de 0 a 111) en los modelos de 2 megas. Algunos de ellos son de uso interno del propio ordenador, por lo que se recomienda el uso a partir del banco 12. Del 12 al 47 ó 111, dependiendo de la cantidad de memoria.
Los bancos tienen un tamaño de 16k, no pudiendo superarse este tamñano. Desde un banco puede ejecutarse código de cualquier otro banco (por ejemplo usando bank numero proc nombre_función()) o bien del programa principal usando el número de banco 255 (bank 255 proc nombre_función()).
Edición de programas usando bancos
Una vez hecha una pequeña introducción a los bancos, explicaremos cómo usarlos a nivel de edición de programas editando directamente en NEXTBasic, utilizando un editor externo en PC y luego importándolo con el comando dor .txt2bas y, por último, usando Visual Studio Code y la extensión creada por Remy Sharp.
1. Edición desde NEXTBasic
Para trabajar con bancos desde el editor de NEXTBasic, debemos escribir el código normalmente en el módulo principal y, una vez escrito, mover estas líneas al banco deseado.
Para mover las líneas al banco usaremos:BANK n LINE inicio,fin
que copiará las líneas desde inicio a fin, incluidas, en el banco n.
Debemos salvar a la tarjeta SD el contenido del banco con SAVE «bancon.bnk» BANK n
Si, una vez movido el código a un banco, deseamos modificarlo deberemos cargarlo en memoria si no está cargado (con LOAD «bancon.bnk» BANK n) y ponerlo en el banco por defecto con BANK n MERGE.
Esto colocará el código del banco en el código principal y se podrá modificar. Una vez modificado, se debe copiar de nuevo al banco, con BANK n LINE inicio,fin y volver a grabarlo con SAVE «bancon.bnk» BANK n.
En mi opinión, es el método más laborioso y propenso a fallos de los que se van a comentar, aunque tiene la parte «romántica» de poder usar directamente el editor y la máquina real, lo que para algunos será un punto a favor.
2. Edición externa e importación con .TXT2BAS
Se trata de una opción mixta en la que se usará un editor externo en un PC para crear el programa.
En el código se incluirán directivas #bankfile nombrefichero.bnk para indicar el principio del código de un banco.
Una vez terminado el código, se debe copiar al Next y, mediante el comando .txt2bas se convertirá a BASIC tokenizado con el comando .txt2bas.
Es importante indicar que, el fichero en el que escribamos el programa debe tener extensión .txt y no .bas, ya que al ejecutar el txt2bas éste creará el fichero .bas con el mismo nombre.
Por ejemplo, .txt2bas nombrefichero.txt creará el fichero nombrefichero.bas con el resultado de convertir nuestro programa a BASIC tokenizado.
El programa .txt2bas generará el programa principal y tantos ficheros como directivas #bankfile encuentre con el código indicado entre ellas.
Por ejemplo, el programa:01 load "bnk30.bnk" bank 30 : load "bnk31.bnk" bank 31
10 PRINT "im in default bank"
20 bank 30 PROC text()
25 bank 31 PROC text2()
30 PAUSE 0
40 STOP
#bankfile bnk30.bnk9000 DEFPROC text()
9010 print "im in bank 30"
9500 endproc
#bankfile bnk31.bnk9600 DEFPROC text2()
9610 print "im in bank 31"
9700 endproc
creará un programa .bas con el contenido:01 load "bnk30.bnk" bank 30 : load "bnk31.bnk" bank 31
10 PRINT "im in default bank"
20 bank 30 PROC text()
25 bank 31 PROC text2()
30 PAUSE 0
40 STOP
un fichero bnk30.bnk con el contenido:9000 DEFPROC text()
9010 print "im in bank 30"
9500 endproc
y un fichero bnk31.bnk con el contenido:9600 DEFPROC text2()
9610 print "im in bank 31"
9700 endproc
Recalcar que, para usar el código de los bancos, éstos deben cargarse en memoria previamente.
En el ejemplo indicado, se hace con la línea:01 load "bnk30.bnk" bank 30 : load "bnk31.bnk" bank 31
3. Visual Studio Code y extensión de Remy Sharp
Esta última forma de edición, en mi opinión, es la más cómoda y productiva se usen bancos o no.
Crearemos un fichero donde pondremos el código que queremos almacenar en un banco, por ejemplo:9000 DEFPROC text()
9010 PRINT "Estoy en el banco 30"
9500 endproc
Para crear el fichero con el código del banco, pulsaremos F1 y, en la lista de acciones, buscaremos:
NEXTBasic: export to BAS y le asignaremos un nombre al fichero generado, por ejemplo banco30.bas
Posteriormente, desde el programa principal, procederemos como es habitual cargando en memoria el banco que acabamos de generar para poder usarlo con: 05 load «banco30.bas» bank 3005 load "banco30.bas" bank 30
10 PRINT "Estoy en el banco principal"
20 bank 30 PROC text()
30 PAUSE 0
40 STOP
Es posible que, además de las indicadas, haya numerosas formas más de editar programas en NEXTBasic. Si conocéis alguna más os agradecería que la comentáseis para dar cuantas más opciones mejor a los que se deciden a escribir programas en NEXTBasic.
Igualmente, se agradece cualquier corrección a lo expuesto en caso de encontrar algún error en el texto o en algún concepto.
Muchas gracias!