Ficheros con el disco RAM del 128k El sigte. artículo está dividido en 3 partes. El primero es una adaptación del artículo "No lo olvides, archivalo" pensado esta vez en el disco RAM del 128k, y +2. La segunda parte trata ampliamente sobre cómo el Opus Discovery añade al 128k mayor control sobre el disco RAM. LA tercera parte trata sobre su equivalente en el +3. Luego vienen unos apéndices con ejemplos de como aprovechar al máximo las capacidades del disco virtual en el manejo de archivos de todo tipo. I - No lo olvides, archivalo... (texto condensado y adaptado originalmente publicado en Input Sinclair) Todo programa que maneje gran cantidad de datos ha de contar con alguna forma conveniente de almacenar los datos. Una forma es usar sentencias DATA para almacenar un listín telefonico sencillo, pero si la informacion queda dentro del programa mismo, uno tiene que interrumpir el programa (con BREAK) para modificarlo, lo cual no es muy satisfactorio. Es mucho mejor almacenar la informacion en cinta o disco, los datos en este caso se almacenan en un fichero. Guardando los datos separadamente del "nucleo" del programa se tiene lo que se llama una memoria virtual: es decir que el programa base puede ser usado con ficheros diferentes, cada uno con su propio numero de registros o campos. El almacenamiento secuencial de datos es uno de los metodos preferidos, ya que su programacion es sencilla y los principios en que se basa son faciles de entender y los datos pueden ser convertidos a un formato que permite su traslado de un programa a otro o de un ordenador a otro inclusive. En un fichero secuencial los datos se almacenan en serie, con un solo byte por separador entre datos. Este articulo explica como crear tus propios ficheros de modo de poderlos incorporar en tus programas. Creacion de fichero: "Listin telefónico" En este programa ejemplo pensado para el disco RAM del 128k, las entradas admitidas son nombre, apellido y numero. La informacion puede ser enviada directamente al fichero, pero es mas conveniente almacenarlo en cadenas para salvar posteriormente toda ella. La primera parte del programa, establece un sencillo bucle que permite introducir los datos. El maximo da datos a ingresar es 50, si se desea más, se deben cambiar las dimensiones de la línea 10: 10 DIM a$(50,15): DIM b$(50,15): DIM t$(50,12): DIM n(1): DIM s$(15) 20 LET n=0 30 LET n=n+1 40 INPUT "Nombre ";a$(n) 50 INPUT "Apellido ";b$(n) 60 INPUT "Numero de Telefono ";t$(n) 70 IF a$(n)<>s$ AND n<50 THEN GO TO 30 Para salvar los datos como cadenas de texto: 80 CLS : PRINT "Almacenando los datos" 100 LET n(1)=n: SAVE! "contador" DATA n() 110 SAVE! "nombre" DATA a$() 120 SAVE! "apellido" DATA b$() 130 SAVE! "telefono" DATA t$() 140 PRINT "Datos almacenados" 150 STOP Si se desea salvar los datos a cinta, omitir entonces todos los "!" del listado ya que de lo contrario, se salvará todo al disco RAM. Lectura del fichero: La rutina para leer el contenido de un fichero y trasladarlo a la memoria, es el inverso al de escritura. Para cargar las cadenas de texto salvadas al disco RAM, tipear: 200 CLEAR 210 LOAD! "contador" DATA n() 220 LOAD! "nombre" DATA a$() 230 LOAD! "apellido" DATA b$() 240 LOAD! "telefono" DATA t$() 250 FOR l=1 TO n(1) 260 PRINT a$(l),b$(l),t$(l) 270 NEXT l Las lineas últimas del listado funcionarían correctamente si los datos se hubiesen salvado a cinta o a diskete. Ahora, debido a que el Spectrum 128k no recupera las cadenas como matrices sino como largas cadenas simples cuando se trabaja con el disco RAM, las líneas del 250 al 270 deben ser todas modificadas: 250 LET a$= a$(6 TO): LET b$= b$(6 TO): LET t$= t$(6 TO) 255 LET n=1: LET m=1 260 FOR l=1 TO n(1) 270 PRINT a$(n TO n+14),b$(n TO n+14),t$(m TO m+11) 275 LET n= n+15: LET m= m+12 280 NEXT l Esta modificación es válida con el 128k original, 128 inglés, y +2; así también con los clones rusos como el Pentagon y Scorpion. El Spectrum 128k no admite la actualización de los archivos existentes, y por lo tanto no hay sobreescritura. Los archivos deben ser borrados para su subsecuente uso. En este caso hay que hacer: ERASE! "telefono": ERASE! "apellido": ERASE! "nombre": ERASE! "contador" ya sea como órdenes directas o incluirlas en el listado. El contenido del disco RAM es mejor tratarlo como una pila "LIFO" (el último en salvarse, es el primero en borrarse en este caso), por motivos de rapidez. La sentencia VERIFY! es innecesaria para verificar los archivos, en su lugar basta con CAT! para ver los archivos existentes en la RAM. Si todas las rutinas anteriores se hubiesen salvado al disco RAM por separado, usamos el comando MERGE! para unirlas. Ventajas y desventajas del disco virtual Hasta aquí como hemos visto, el sistema operativo del disco virtual del 128k, es bastante sencillo de usar, tiene unos pocos comandos Basic para su manejo. Su sintaxis es similar a la del Microdrive pero mucho más simplificada. Pero la principal es la velocidad en el manejo de la información. La desventaja es que no se puede accesar a este disco virtual en modo 48k. El único tipo de base de datos disponible es el de matrices DATA. La otra es que no parece haber ninguna utilidad para copiar o mover archivos ya sea dentro del mismo disco virtual o de este a cinta y viceversa. Y aquí es donde entra el Opus Discovery. II - Opus Discovery y 128k: Aparte del Microdrive de Sinclair, hay muchos sistemas de disco para escoger en el mercado. En su tiempo estuvieron el Kempston Dos, El Swift Disk, y el Opus, entre varios más. Pero solamente el Opus Discovery fue modificado en una versión que funciona bien con el 128k y su disco virtual. El disco RAM no puede ser usado por el OPUS Disc. a menos que se inicialice primero, haciendo por ejemplo: FORMAT 6,"dram" Tras hacer esto, ya no estamos más limitados a los pocos comandos de disco del 128k. Ahora tenemos todos las sentencias de disco del Opus para usarlos con el disco virtual, como si fuera la sexta unidad física. Para ver el contenido basta ahora con hacer CAT 6. Volviendo al programa antes mencionado. El metodo anterior SAVE! DATA tiene el inconveniente de que hay que guardar toda la cadena aunque solo se use una parte de la misma. La versión que sigue a continuación, almacena cada elemento de la cadena separadamente y se detiene cuando los datos se acaban. 10 DIM a$(50,15): DIM b$(50,15): DIM t$(50,12): DIM s$(15) 20 LET n=0 30 LET n=n+1 40 INPUT "Nombre ";a$(n) 50 INPUT "Apellido ";b$(n) 60 INPUT "Numero de Telefono ";t$(n) 70 IF a$(n)<>s$ AND n<50 THEN GO TO 30 80 CLS : PRINT "Almacenando los datos" 110 OPEN #4,6,"fichero" OUT 120 PRINT #4;n 125 FOR l=1 TO n 130 PRINT #4;a$(l)'b$(l)'t$(l) 140 NEXT l 150 CLOSE #4 160 PRINT "Datos almacenados" 170 STOP Para salvar esta rutina al disco virtual basta con: SAVE *6,"list telf" Esta version trabaja bien con el disco RAM. La línea 110 abre el canal de comunicaciones hacia el disco RAM. El Discovery permite el uso de cualquier canal del 4 al 15. Es muy importante teclear las líneas tal como se muestran. La línea 110 requiere una coma como separador, mientras la línea 130 exige un pto. y coma luego de la orden PRINT# y el apostrofe como separador de elementos. La version de la rutina para cargar de nuevo los datos se parece a su procedimiento de escritura excepto que en vez de PRINT#, se pone INPUT# y las variables son separadas por pto. y coma para su correcta lectura: 200 DIM a$(50,15): DIM b$(50,15): DIM t$(50,12) 210 OPEN #4,6,"fichero" IN 215 INPUT #4;n 220 FOR l=1 TO n 230 INPUT #4;a$(l);b$(l);t$(l) 235 PRINT a$(l),b$(l),t$(l) 240 NEXT l 250 CLOSE #4 Ventajas y desventajas de este sistema. En cuanto a las desventajas, parece ser muy lento para accesar los datos. Ventajas: El disco virtual puede ser ahora accedido desde el modo 48k, simplemente pasando primero a este modo y luego inicializando el disco con la sentencia FORMAT. Mientras el 128k responde con "archivo existente" si se intenta reescribir, el Opus simplemente sobreescribe sin dar error o mensaje alguno. La otra ventaja es que se puede mover o copiar archivos ya sea del disco 1 al disco virtual 6 y viceversa, lo que es muy util en casos muy especiales. Podemos trabajar tanto con matrices DATA, como con ficheros OPEN-CLOSE. III - el disco RAM en el +3 y +2a Debido a la sintaxis tipo CP/M que utiliza letras en vez de numeros, el +3 aplica la forma CAT "m:" en vez de CAT!, la cual ya no existe más. Y así con todas las demás sentencias para manejar el disco RAM. De hecho, el DOS del +3 ofrece más sentencias en comparación con las apenas 5 sentencias del original 128k para manejar el d. RAM. Pasemos ahora a ver el programa ejemplo anterior pero esta vez adaptado a la sintaxis +3dos: 10 DIM a$(50,15): DIM b$(50,15): DIM t$(50,12): DIM n(1): DIM s$(15) 20 LET n=0 30 LET n=n+1 40 INPUT "Nombre ";a$(n) 50 INPUT "Apellido ";b$(n) 60 INPUT "Numero de Telefono ";t$(n) 70 IF a$(n)<>s$ AND n<50 THEN GO TO 30 80 CLS : PRINT "Almacenando los datos" 100 LET n(1)=n: SAVE "m:contador" DATA n() 110 SAVE "m:nombre" DATA a$() 120 SAVE "m:apellido" DATA b$() 130 SAVE "m:telefono" DATA t$() 140 PRINT "Datos almacenados" 150 STOP Si se desea salvar los datos a cinta, omitir entonces todos los "m:" del listado y añadir 90 SAVE "t:". Lo mismo en el caso de LOAD. 200 CLEAR 210 LOAD "m:contador" DATA n() 220 LOAD "m:nombre" DATA a$() 230 LOAD "m:apellido" DATA b$() 240 LOAD "m:telefono" DATA t$() 250 FOR l=1 TO n(1) 260 PRINT a$(l),b$(l),t$(l) 270 NEXT l El +3dos admite la sobreescritura de archivos creando un backup de los programas vueltos a salvar, creando dos versiones: la nueva y la anterior con extensión ".bak" Ventajas y desventajas del +3 El +3dos solo funciona en modo Basic +3, pero no en modo 48k. No hay ficheros OPEN-CLOSE, solo matrices DATA. Los ficheros secuenciales solo son posibles usando el compilador Hisoft Basic version +3. La ventaja es que ahora es posible copiar o mover archivos entre los discos "a", "b", y el disco virtual "m" siempre que estemos en modo Basic +3. El disco RAM del +3 solo ofrece 58k libres frente a los 62 a 63k del 128k y el +2. Para cerrar los sigtes. apendices tienen ejemplos de como sacarle provecho al disco RAM del 128k. Apendice A ANIMACION 128K Un ejemplo de animación con el 128k mediante el truco de salvar y cargar las imágenes en el disco RAM con las sentencias SAVE!/LOAD! CODE. 10 CLS 20 FOR c=0 TO 30 30 CIRCLE 31,143,30-c 40 CIRCLE 92,143,c 50 CIRCLE 153,143,30-c 60 CIRCLE 214,143,c 70 SAVE !STR$ c CODE 16384,2048 80 CLS 90 NEXT c 100 CLS 110 FOR n=0 TO 30 120 LOAD !STR$ n CODE 16384 130 NEXT n 140 FOR n=30 TO 0 STEP -1 150 LOAD !STR$ n CODE 16384 160 NEXT n 170 GOTO 110 Publicado en Microhobby 104, trucos, pag. 9 Apendice B Encadenando programas en el disco RAM. (texto resumido de articulo publicado originalmente en Microhobby) Como bien se sabe es imposible meter un programa de más de 40k en el Spectrum de 48k, pero tampoco es posible de hacer en el 128k. El único modo es dividiendolo en varias partes. En el pasado, la memoria RAM era muy cara y los ordenadores disponian de muy poca entonces, así que había que aprovecharla al máximo. No había sentido tener un programa enorme si solo se ejecutaba un trozo de ella. Conn esa idea en mente, se desarrolló la técnica de fragmentar un programa en partes que hicieran tareas concretas y mantener solo el bloque que se ejecutaba en ese momento. A esta técnica se le llamó en inglés "overlay" que se traduce como "recubrimiento" o "superponer". Vamos a aplicar todo lo antes dicho al 128k. Además de las partes o bloques intercambiables del programa, una parte de esta debe permanecer cargada en la RAM, para gestionar el manejo de dichos bloques, lo que exige una planificación muy cuidadosa y estructurada. Por ejemplo, un programa de agenda personal. Por un lado estan las rutinas que editan los datos, añadir, eliminar, etc. Luego están las de salvarlos, ya sea a cinta microdrive o disco, o en nuestro caso al disco virtual. Otras rutinas se encargarán de buscar e imprimir los datos. En suma, se puede dividir todo el programa en cuatro bloques que se encargaran de los datos y ya que nunca estarán activas todas las rutinas, solo cargaremos las que se necesiten en el momento. En el Basic Sinclair tenemos la sentencia MERGE, que nos permite cargar trozos de programa, sin borrar lo que ya está en memoria, siempre y cuando los números de líneas sean diferentes. Para nuestro caso, el programa raiz o principal estará en disco o cinta bajo el nombre "agenda". Este llamará a las otras rutinas que seran movidas al disco RAM con los nombres de "agnd1", "agnd2", "agnd3" y "agnd4". Estos serán cargados mediante la orden MERGE !"agnd"+n$, conteniendo n$ un valor del 1 al 4 y luego un GOTO a la línea de ejecución de la rutina recién cargada. En este caso, todas las rutinas deben tener el mismo número de líneas para que se haga una mezcla con recubrimiento correcto. En el caso de que una de las rutinas tuviese menos líeas que las otras, poner líneas con REM para llenar ese espacio. El programa de instalación es algo más truquero, Si trabajamos con cinta, debemos tener un cargador inicial al que le siguen los 4 bloques que se cargaran uno a uno y pasarán al disco RAM para al final recien cargar el programa raiz "agenda". Cada parte se autoejecutará en la línea 9999 la cual debe ser del modo sigte: 9999 SAVE !"agnd1": LOAD "agnd2" 9999 SAVE !"agnd2": LOAD "agnd3" 9999 SAVE !"agnd3": LOAD "agnd4" 9999 SAVE !"agnd4": LOAD "agenda" En el caso del Microdrive o discos, el programa inicial sería "RUN". Nota: el articulo original no menciona la posibilidad de que el programa agenda maneje los datos primero en el disco virtual y solo al terminar se haga un backup de los datos al disco o cinta. publicado bajo el título ´LA TECNICA "OVERLAY" EN EL SPECTRUM 128´ en Microhobby 115, iniciacion, pag. 14 Apendice C la tecnica overlay en el +3 Considerando todo lo antes dicho sobre el método de encadenar programas en el disco RAM del 128k, pasamos ahora a ver como se aplica este metodo al +3. Omitiremos lo de la cinta, y trabajaremos directamente con diskettes. Tomamos un disco recien formateado, y ponemos ahi el programa instalador al que llamaremos "disk" y enseguida salvamos el programa principal "agenda" y las cuatro partes restantes. En este caso ya no es necesario que cada bloque autosalve y cargue la parte sigte. hasta ejecutar el programa raiz como en el 128k. Aquí el instalador lo hace todo: 10 COPY "a:agnd1" TO "m:" 20 COPY "a:agnd2" TO "m:" 30 COPY "a:agnd3" TO "m:" 40 COPY "a:agnd4" TO "m:" 50 LOAD "agenda" Si hubiese alguna base de datos creada en el disco entonces añadir la línea: 45 COPY "a:base.dat" TO "m:" para que el programa pueda continuar trabajando a partir de donde se quedó previamente. Como se ve, no es necesario dar un nombre de copia, solo el disco destino que en este caso es solo "m:". Una forma de simplificar el listado anterior sería usar un bucle FOR-NEXT: 10 FOR n=1 TO 4 20 COPY "a:agnd"+STR$ n TO "m:" 30 NEXT n 50 LOAD "agenda" incluso, el +3 dos permite eliminar y reemplazar todas esas líneas con un: 20 COPY "a:agnd?" TO "m:" debido a que admite comodines en el manejo de nombres de ficheros. Siendo este último método más rapido pues hace todo con una sola orden. Y en el programa raiz "agenda" usar: MERGE "m:agnd"+n$, siendo n$ un valor del 1 al 4. Ahora todos los datos manejados por el programa se trabajan primero en el disco virtual y solo al terminar la sesión, pasan a ser copiados al disco. Y si por a ó b se quisiera borrar todo el contenido del disco RAM: ERASE "m:" ó FORMAT "m:" hacen el trabajo. Nota: hasta aquí la adaptación del artículo de Microhobby. Se puede independizar cada bloque, mediante el uso de variables comunes salvadas al disco para luego ser usadas por cada rutina mediante SAVE/LOAD DATA. De hacerse así, podemos reemplazar el MERGE "m:agnd"+n$ de antes por: LOAD "m:agnd"+n$ y usar MERGE solo para alguna que otra subrutina compartida por los bloques. Francisco Leon (c)2018 zx_if1@hotmail.com