Simulando CHAIN en el ZX Spectrum o como encadenar programas multicarga en el Basic Sinclair (II). Tras terminar mi recopilacion de notas sobre como simular CHAIN en el Spectrum, mi deseo era escribir un programa de mas de 100k a manera de demostracion practica, y fue entonces cuando me encontré con el libro: MULTIAVENTURA - SE TU EL PROTAGONISTA NUEVO VIAJE AL CENTRO DE LA TIERRA (#1) de Editorial Ingelek. Y me dije a mi mismo ¿y por qué no? Aunque contemporaneo de la llamada era de los 8bits, no llamó entonces mi atención. Ahora en cambio le veía desde una nueva perspectiva: uno no lo lee del modo usual continuado, sino que uno, de vez en cuando, salta de una pagina a otra dependiendo de qué opciones se le ofrecen en plena lectura. Eso es obviamente hacer un salto condicional IF THEN GOTO, o en el caso de CHAIN, un IF THEN LOAD dentro de un programa. Dicho esto, ya no tenia que crear mi programa ejemplo de la nada, solo tenia que convertir todo el texto a formato BASIC, aplicando el método de encadenamiento de un programa dividido en varias partes compartiendo datos en comun. I - CONVIRTIENDO A BASIC Primero habia que ver en cuantas partes podia dividir el libro y si todo esto podría caber en un solo disco. Desarrollé mi diagrama y el resultado fueron 55 partes. La versión de Spectrum elegida por mi para tipear todo fue el Spectrum 128k. El sistema de disco a emplear inicialmente fue el +D con Betados. Y todo en emulador de mi elección que fue REAL SPECTRUM edición de aniversario. Una vez tipeadas las 55 partes, salvadas y enlazadas respectivamente, añadi el cargador. Ahora habia que añadirle las pantallas, elegí escanear el titulo de la portada original como pantalla inicial y una segunda a manera de ilustracion extra. Con Photoshop las converti a JPG y enseguida use ZXPAINTBRUSH para convertirlas a SCR. Ahora ya solo faltaba pasarlas al disco MGT. Otros emuladores como Klive y Spectaculator leen los SCR. Pero en el caso del REALS ¿cuál era el método? Su manual dice que uno debe pulsar ALT-F11 para acceder a las preferencias de video y elegir SAVE SCREENSHOT para salvar la pantalla ya sea como PCX, TGA, BMP y también SCR. Pero nada dice sobre como cargarlo una vez creado. SEVENUP me dio una pista de como hacerlo. Una de sus opciones EXPORT DATA, la cual permite salvar todo ya sea como ASM o BIN. REALS tiene la opcion ALT+F9 para acceder a su opcion de memoria, la cual permite seleccionar el inicio (start), el largo (length) y la pagina para a continuacion cargar o salvar bloques de memoria. Probé a ver si cargaba los SCR que yo queria y resultó que si lo hacia. Resulta que esta opción permite cargar no solo BIN y ROM sino tambien SCR. Con los SCREEN$ ya en el disco, faltaba elegir si debia añadirle acentos y eñe a los textos o dejarlos así. Mis opciones eran: usar códigos de control CHR$ 8 y OVER 1 o UDGs o un nuevo banco CHAR en RAM. Opté por lo segundo y para terminar decidi crear una sola variable de cadena con la comilla (CHR$34) como variable comun a todas las partes de la concatenacion. Una vez completada la version +D, pasé a la version +3. Pensé que todo el texto pesaría más de 200k en BASIC, pero resultó solamente 152k la version +D y 160k en el +3. La version OPUS fue de solo 140k, y seleccionando el +2. Le siguió el TRD (139.75k) esta vez con Pentagon. El D80 fue de 130k y el MB-02+ de 131k. Decidido a convertirlo a cada formato conocido ya solo me quedaba por crear las versiones en cartucho para Microdrive y Wafadrive. Pero en este caso no cabe todo en un solo cartucho, había que dividirlo todo en dos cartuchos. Ya que el Wafadrive viene con dos unidades se puede trabajar con dos cartuchos a la vez llamandose el uno al otro mutuamente. En el caso del IF1, decidi sobreentender que el usuario posee dos unidades para trabajar con dos cartuchos a la vez. En el caso del emulador ya no hay problemas para usar dos unidades a la vez. II - CONVIRTIENDO A MATRIZ DE CADENA Despues de haber terminado la version basic del Multiaventuras 1, pensé que aun podia escribir una segunda version del mismo. El nuevo reto era convertirlo a otro formato: el de matrices de cadena. Los originalmente 55 listados BASIC, ahora se convertirian en 55 matrices DATA $. Segun el manual del Spectrum, la matriz se crea haciendo, por ejemplo, DIM a$(20,20) y se salvan, verifican y cargan con SAVE "nombre" DATA a$(), VERIFY ... DATA a$() y LOAD ... DATA a$(). Muy bien, pero lo que el manual no menciona es que una matriz creada y salvada como a$ puede ser cargada con otro nombre de matriz, por ejemplo, mi programa "x" salvó la matriz a$(). Mi programa "z" lo puede cargar como b$() y si todavia hay espacio en la RAM puede cargar otra copia de los datos esta vez como c$() o d$(). En suma no salva la matriz a$ original sino solamente su contenido, el cual puede ser recuperado despues ya sea con el mismo nombre de matriz o con cualquier otro a elegir. Tampoco es necesario usar DIM en el programa que carga las matrices previamente salvadas, solo en el programa para iniciar y crear las matrices a salvar. El Spectrum es el único cuyo BASIC permite trabajar con matrices de longitud variable. Si bien lo habia observado antes, no lo habia puesto en practica hasta ahora. Esta es mi version 2 y al igual que la version anterior, puede correr en formato disco +D MGT, +3 DSK, Discovery OPD, Beta TRD, Mdos D80, MB02. Tambien es posible adaptarlo como la primera version a IF1 MDR. No puede convertirse a Wafadrive ya que este no admite SAVE/LOAD DATA #/$(). III - CONVIRTIENDO A FICHERO OPEN/CLOSE Ahora, si ya lo convertimos todo a matrices de cadena, ¿por qué no entonces, convertirlo tambien al formato de fichero Open/Close? Debido a que un fichero de datos secuencial, se lee de principio a fin, nuevamente habria que crear 55 ficheros secuenciales, en vez de meterlo todo en un solo archivo que demoraria más leer por el programa principal, con lo cual se hace mas facil la conversion. Esta es mi version 3 y ahora solo puede ser convertido para el +D, Opus, Beta128, y D80. MB-02+ no admite ficheros secuenciales ni directos solo matrices DATA (). En el caso del +3 es posible si se usa HISOFT BASIC, o de lo contrario crearlo para el +3e exclusivamente. Una vez hecha esta conversion, ¿por qué no una versión 4? Ahora ya solo queda convertirlo a fichero de acceso directo, pero esto ofrece la ventaja de que ya no necesitaria dividirlo en 55 partes sino que se almacenaria todo en un solo archivo. La ventaja de esta clase de ficheros es que la matriz se carga y ocupa espacio en memoria, pero los ficheros pueden permanecer en el disco y ser impresos en pantalla sin ocupar mucho espacio en RAM. En este ultimo caso, solo podria crearse en version para +D con Betados o Unidos, Opus Discovery, Beta128 y +3e. OTRAS POSIBLES VERSIONES: Hasta ahora todas las versiones estan adaptadas a la pantalla estandar del Spectrum de 22 lineas por 32 filas. Una mejora seria añadirle una rutina en C.M. para cambiar el modo de texto a ya sea 64 o 52 caracteres. Una alternativa es crear una version BetaBasic version 3 o 4, ya que ofrecen el comando CSIZE que permite modificar el tamaño de caracteres en pantalla. En este caso solo podriamos crear las adaptaciones para Microdrive, Opus D1, +D, Beta128, D80, Mb-02+ y hasta Wafadrive, quedando excluido el +3, ya que no hay ninguna version de BetaBasic que corra en +3. Por ultimo, quedaria la posibilidad de compilar cada parte o convertirlas directamente a rutinas de codigo maquina y salvarlas como ficheros binarios con SAVE CODE. Si bien elegi tipearlo todo en el emulador REALS, muy bien se pudo haber elegido un editor como ZX-EDITOR o mejor aun tipear una version BASIN, pero solamente podria aplicar las versiones 1 y 2, o sea el programa dividido en 55 partes BASIC o como 55 matrices de cadena. LA venttaja es que BASIN me ofrece la posibilidad de salvar y manejar todo como ficheros de PC, directamente al disco duro, no solo como editor para crear los programas que luego ejecutaré con emuladores. Ya para cerrar tambien existe la alternativa de convertirlo todo a SPECBAS, el cual no tiene las desventajas del BASIN de solo limitarse a las 48k del Spectrum original. NOTA FINAL: El libro original tiene una serie de erratas: La pagina 57 hace un llamado a la pagina 63, pero en realidad debe ser la 78. La pagina 60 se salta de frente a la pagina 11 cuando deberia primero llamar a la 26. (c)2014 zx_if1@hotmail.com