Programa CLONE

Uno de los primeros programas con los que jugué cuando compré mi primer QL fue el copiador que acompañaba al software de PSION. Con este programa uno puede aprender varios conceptos básicos acerca de las facilidades del QL y del SuperBASIC, uso de ficheros, canales… y de paso el programa ayudó a salvar más de un cartucho de microdrive, al menos hasta la llegada de las extensiones TK2 (Toolkit II) de Tony Tebby, con sus “wildcards” o facilidades de copia salvaje. Respecto a esto, tengo que hacer mención al artículo de Salvador Merino titulado “Un resumen de la historia de un copión llamado trumpcopy2” que os recomiendo que no dejéis de leer pues tiene su gracia a la vez que es muy aprovechable si se dispone de TK2.

Hablaba del programa copiador de microdrives. Esto es lo que veremos en este artículo dedicado obviamente a los que empiezan con el QL. Es muy cortito. Veamos su listado y que hace en cada línea:

100 REMark copia de mdv2_ a mdv1_
110 OPEN_NEW #3,mdv1_dir
120 DIR #3,mdv2_
130 OPEN_IN #3,mdv1_dir
140 INPUT #3,a$;a$
150 REPeat copia
160   IF EOF(#3): EXIT copia
170   INPUT #3,a$
180   PRINT "Copiando mdv1_";a$
190   COPY mdv2_ & a$ TO mdv1_ & a$
200 END REPeat copia
210 CLOSE #3
220 DELETE mdv1_dir
230 PRINT "Copia completada."

La línea 100 muestra un comentario. Nada nuevo bajo el sol. Sólo decir que cuando se renumeran automáticamente las líneas (RENUM) en el QL, la primera línea por defecto es la 100.

El programa, a grandes rasgos, va a abrir un fichero en mdv1_ (unidad de microdrive 1), luego listará en ese fichero el nombre de los ficheros que hay en mdv2_ y por último copiará uno por uno cada fichero de mdv2_ a mdv1_.

En la línea 110 abrimos (OPEN) un canal nuevo de comunicación (#3) que va a ser un fichero en mdv1_ llamado “dir”. Cualquier dispositivo de entrada o salida, ficheros, puertos serie, etc… se abrirá como un canal numerado “#n”.

En la línea 120 hacemos DIR para mostrare el contenido de mdv2_ y este contenido se mostrará por el canal 3 (#3). Si #3 se hubiese abierto como un puerto serie en vez de como un fichero, estaríamos mandando el listado a la impresora por ejemplo directamente.

El siguiente paso será poder acceder al canal en modo lectura. Usamos pues OPEN_IN en la línea 130.

Ya podemos leer del #3. Las dos primeras cadenas de texto del fichero mdv1_dir corresponden al nombre del microdrive y al número de sectores disponibles (información que proporcionó DIR). Esta información no es necesaria para realizar la copia, así que la desechamos.

En la línea 140 leemos en a$ las dos primeras cadenas de texto (a$;a$) del fichero “dir”. El punto y coma pues es un separador. El SuperBASIC tiene estas facilidades que nos permiten leer varias cadenas a la vez con un INPUT.

Entre las líneas 150 y 200 se produce la magia. Estamos en un bucle llamado “copia” cuya condición de salida podemos ver en la línea 160: Si hemos llegado al final del canal (EOF) entonces salimos del bucle “copia” y segimos desde la línea posterior a END REPeat copia.

En la línea 170 leemos a$, que contendrá una cadena con un nombre de fichero del listado de mdv2_.

En la línea 180 indicamos por pantalla que vamos a copiar ese fichero. Volvemos a usar “;” como separador. Existen varios tipos de separadores en SuperBASIC que descubrirás en el manual.

En la línea 190, por fin, se realiza la copia de un fichero desde mdv2_ a mdv1_ Analicemos esta línea.

La orden COPY  necesita saber desde donde hacia donde vamos a copiar. Sabemos que el fichero a copiar está en a$, y que vamos a copiar desde mdv2_ a mdv1_, ahora sólo tenemos que escribir correctamente la sentencia.

el separador “&” consigue unir cadenas de texto. En este caso la cadena de texto es mdv2_ o mdv1_ y el contenido de a$, que será igual para ambas unidades de microdrive, puesto que el fichero que copiaremos se va a llamar igual en el origen y en el destino.

Pongamos que tenemos un fichero llamado programa_bas en mdv2_. La orden sería:

COPY mdv2_programa_bas TO mdv1_ programa_bas

Podríamos tener, como sucede en el listado, el nombre del fichero en una variable:

fichero$="programa_bas"
COPY mdv2_ & fichero$ TO mdv1_ & fichero$

y funcionaría igual.

Esto puede ser de mucha utilidad cuando escribimos programas que van a acceder a datos en microdrive o en discos, pues de esta forma podemos sustituir el nombre del dispositivo guardado en una variable sin tener que cambiar cada línea del listado donde se use ese dispositivo. Por ejemplo:

..
500 DIR mdv1_
600 RUN mdv1_programa_bas
..

Si este programa lo salvamos en flp1_ (floppy 1) por poner un ejemplo y en el copiamos también el fichero programa_bas tendremos que cambiar las líneas 500 y 600 y cualquiera otra que apunte a algún archivo en mdv1_ que ahora esté en flp1_

Con el siguiente programa la cosa sería más sencilla.

100 disp$="mdv1_"
..
500 DIR disp$
600 RUN disp$ & programa_bas
..

En este ejemplo sólo tendremos que cambiar la línea 100 por:

100 disp$="flp1_"

Útil ¿verdad?

Seguimos pues. Como ya hemos salido del bucle, y copiado todos los ficheros, que era nuestro objetivo, en la línea 210 cerramos el canal 3 (#3) definitivamente.

En la línea 220 borramos el fichero “dir” en mdv1_, pues ya no lo necesitamos, y en la línea 230 avisamos que la tarea está realizada.

Ha llegado la hora de usar el programa. Debemos poner el microdrive que queramos copiar en mdv2_ y un cartucho en blanco formateado en mdv1_ y ejecutar el programa.

Si salvamos el programa en mdv2_ antes de ejecutarlo, este se clonará a si mismo en la copia que realicemos. 😉

Con lo expuesto aquí, uno ya puede abrir ficheros para escribir y leer de ellos o copiar en ellos información proveniente de otros canales. Puedes probar a crear un pequeño fichero al que añadas mediante INPUTs cadenas de texto que introduzcas por teclado y luego muestres lo escrito por pantalla, o abrir un canal dirijido al puerto serie y escribir directamente líneas en la impresora. Todo sea por enredar.

Anuncios
1 comentario
  1. afx dijo:

    Un ejemplo perfecto para ver una de las fortalezas del SuperBASIC, la redirección de entradas/salidas a diferentes dispositivos por medio de los canales.

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