231 20: A C C E S O A L D I S C O Los comandos de disco de AMOS te ofrecen un total acceso al sistema de ficheros del Amiga. Esta posibilidad, puede ser explo- tada para crear desde un simple lector de datos hasta completas bases de datos. Drives & volumes Como sabes, tu Amiga te permite etiquetar tus discos de diferen- tes maneras. Si no estas familiarizado con el CLI, es posible que encuentres todo esto un poco confuso. De modo que te brindaremos una breve explicacion de los nombres usados 1- Drives O unidades de discos, a las que se les asignan nombres con el siguiente formato DFn en donde "N" es un digito simple que contiene el numero de tu uni dad de discos. El primer floppy de tu sistema (normalmente el in- terno) es conocido como DF0, luego vendran DF1, DF2, DF3, etc si estuviesen instalados. Los discos duros o 'Hard Drives' se especifican mediante DHn en donde "N" es el numero de tu disco duro (o parte de el). 2- Volumes El Amiga tambien crea un nombre separado (VOLUME) para identi- ficar cada disco individual. Esta etiqueta puede ser sustituida por el nombre del drive en cualquiera de tus comandos AMOS. Asi, AMOS detectara automaticamente cada drive en busca del disco nece sario. Si no lo encontrara, aparecera un mensaje de error "drive not mounted". Cuando prepares un nuevo disco desde el Workbench, el disco re cibira el nombre de vacio 'Empty". Para cambiar esta etiqueta des de el Workbench, simplemente selecciona la opcion RENAME e intro- duce tu nuevo nombre el la oportuna caja de dialogos. Este nombre podra ser practicamente cualquier cadena de caracteres que desees pero debera terminar con un par de puntos (:) cuando se usada en tus programas. He aqui algunos ejemplos: 232 AMOS: AMOS_DATA: ATENCION!!: si creas varios discos con el mismo nombre o con sus nombres intercambiados de forma indiscriminada, el Amiga podra fa cilmente confundirse de disco. En dichas circunstancias, necesita ras especificar el numero de drive. De este modo, AMOS sabra que disco manejar. Te aconsejamos asignar diferentes nombres para cada disco en uso. Esto no cuesta trabajo y simplifica las cosas enormemente. 3- Dispositivos logicos Finalmente, existe un juego de objetos conocidos como disposi- tivos logicos (LOGICAL DEVICES), utilizados por el Amiga para sus rutinas operativas para determinar con precision la posicion de importantes ficheros del sistema como los manipuladores de dispo- sitivos (DEVICE HANDLERS) o las fuentes (FONTS). Cada dispositivo se asigna habitualmente a un directorio especifico de la actual secuencia de arranque (Start-Up-Sequence). He aqui algunos casos: FONTS: Es un directorio que contiene diferentes fuentes LIBS: Contiene ficheros libreria necesarios para el comando SAY de AMOS 4- Cross DOS Si has comprado un paquete DOS separado y lo has instalado en memoria, tambien seras capaz de acceder a discos formateados por otros sistemas operativos (IBM o ST) desde AMOS Basic. Esos dis- cos reciben nombres que comienzan por las letras DI: DIn: (En donde N es el numero del drive) Al objeto de convertir tus programas STOS a AMOS Basic, necesita- ras grabarlos en formato ASCII utilizando el comando FSAVE"*.ASC" de STOS. Luego inserta el disco en el floppy del Amiga que haya sido montado por Cross DOS o en un drive de IBM. Debido a las diferencias entre STOS y AMOS, muchos programas de STOS necesitaran ligeras modificaciones antes de funcionar con el sistema AMOS. 233 Cambio de directorio DIR (Muestra el directorio del presente disco) DIR ¡path$¿ ¡/w¿ Lista todos los ficheros del presente disco. Si se incluye el pa- rametro opcional "PATH", solo los ficheros que cumplan ciertas condiciones se podran visualizar. Cualquier cajon del listado se podra distinguir por ir precedido del caracter "*". El listado puede detenerse en cualquier momento, bastando con pulsar la barra espaciadora. Para continuar, pulsala de nuevo. Ten en cuenta que si cambiar discos e intentas obtener el lis- tado del directorio, obtendras un mensaje de error del tipo "devi ce not mounted". Esto se debe a que has sacado el disco sin infor mar de ello a AMOS Basic. La solucion es simplemente actualizar el nombre del directorio actual al nuevo, usando una linea como DIR$="DF0:" antes de llamar al comando DIR. /W lista los ficheros en dos columnas en pantalla. Esto dobla el numero de ficheros que pueden verse al mismo tiempo. La cadena PATH consiste en 3 elementos principales: ¡ Disc:¿¡Directory/¿Filter FILTER define unas condiciones que deberan cumplir los ficheros de tu listado. En el texto, cada caracter de tu texto debe equiva ler exactamente a cada caracter del fichero visualizado. Ejemplo: Dir "Music" (Resultado: Music) El asterisco (*) equivale a una lista de letras de los nombres de tus ficheros hasta el proximo caracter control: Dir "M*" Por defecto, esta opcion ignorara cualquier fichero que alguna letra de extension MS-DOS. Asi un fichero como Mad.ASC del disco no sera listado. El punto (.) equivale a la extension de un fichero. Es habitual- mente usado conjuntamente con el asterisco para listar todos los ficheros de un determinado tamaño. El signo de interrogacion equivale a un caracter simple en la po sicion actual. 234 = DIR$ = (cambia el directorio actual) s$=DIR$ DIR$=s$ Esta funcion contiene el directorio que sea usado en el punto de comienzo para todas las siguientes operaciones de disco, tanto de carga como de escritura. Es muy similar al comando CD del CLI, con la ventaja adicional de permitirte leer el directorio a la vez que puedes cambiarlo. Ejemplos de su uso: Print DIR$ Dir$="AMOS:Iff/" PARENT (reestablece el guion de un directorio) PARENT La accion de PARENT consiste en cargar el directorio actual con el patron del cajon actual. Usando repetidamente este comando, rapidamente iras llegando hasta el directorio origen. SET DIR (establece el estilo usado por DIR) SET DIR n¡,filter$¿ Establece el estilo de los listados. "N" es el numero de caracte- res que oscilan desde 1 a 100, y que apareceran en cada fichero. Ten presente que esta ubicacion NO tiene efecto sobre la actual longitud de tus nombres. Solo cambia la forma en que dichos nom- bres aparecen en pantalla. "FILTER" es una lista de nombres que seran excluidos del direc torio. Todos los ficheros que coincidan con este filtro seran com pletamente ignorados y no apareceran como parte del directorio. Esto puede usarse para suprimir los inutiles ficheros ".INFO" que contienen las definiciones de los iconods usados por el Workbench Ten en cuenta que es posible ignorar todos los nombres. Simple mente termina cada nombre con un simple "/". Por defecto, el fil- tro se estable en: ".INFO/*.INFO/*.*.INFO" Operaciones habituales de discos ================================ DFREE (espacio libre de un disco) f=DFREE Devuelve la cantidad de espacio libre en bytes que resta en el disco actual. 235 MKDIR (crea un cajon) MKDIR f$ Crea un nuevo cajon en el disco con el nombre "F$". Ejemplo: Mkdir "DF0:TEST" KILL (borra un fichero del disco) KILL f$ Borra el fichero "F$" del disco actual RENAME (renombra un fichero) RENAME old$ to new$ Cambia el nombre de un fichero Seleccion de un fichero ======================= = FSEL$ (selecciona un fichero) f$=FSEL$(path$¡,default$¿¡,title1$,title2$¿) Esta funcion te permite elegir tus ficheros directamente desde el disco, usando el selector de ficheros estandard de AMOS. "PATH$" establece el patron de busqueda que determinara que fichero sera visualizado en tu listado. Despues de que hayas seleccionado un fichero, FSEL$ informara su nombre completo o una cadena vacia si has seleccionado QUIT. "DEFAULT$" elige un fichero para usar por defecto. "TITLE1$" y "TITLE2$" son cadenas de texto opcionales que des criben el titulo a visualizar en la parte superior del selector de ficheros. Ejemplo: F$=FSEL$("*.IFF","","Load un fichero IFF") If F$="" then Edit: Rem regresa al editor si no se selecciona un fichero Load IFF F$,0 236 Ejecucion de un programa AMOS desde el disco RUN (ejecuta un programa de AMOS Basic) RUN ¡file$¿ Pese a que es bastante facil ejecutar tus programas directamente desde el editor, hemos incluido un comando separado RUN. Esta ver sion del comando con el parametro FILE$ solo puede ser usado des de el modo directo. Pero la orden RUN FILE$ tambien puede situarse dentro de un programa en Basic. Esto te permitira encadenar una lista de pro- gramas uno detras de otro. Ten presente que cuando tu ejecutas un programa de esta forma, el programa existente sera retirado de la memoria y cualquier variable se perdera. Sin embargo, cualquier pantalla de datas que se haya creado permanecera intacta hasta que las siguientes pantallas sean visualizadas. Este comando es enormemente util, ya que te permite dividir cualquier programa AMOS en un numero de niveles que pueden ser cargados separadamente desde el disco. Cada nivel podra ahora es- cribirse de forma separada como un programa completamente indepen diente. Asi, el unico limite para el tamaño de tus programas, es la cantidad de espacio disponible en el disco. Vease tambien PRUN. Comprobando la existencia de un fichero ======================================= = EXIST (comprueba si existe un fichero determinado) flag=EXIST(f$) Este comando verifica si en el directorio actual existe el fiche- ro F$. Si este es encontrado, entonces se devuelve un valor -1, en caso contrario es 0. La funcion EXIST es capaz de chequear la existencia de cualquier fichero en un disco completo. Ejemplo: Print Exist("DF1:"): Rem ¿Se ha conectado un segundo floppy? = DIR FIRST$ (obtiene el primer fichero del directorio que coincida con un patron dado) file$=DIR FIRST$(path$) Devuelve una cadena que contiene el nombre y longitud del primer fichero del disco que cumpla con el actual patron de busqueda, es pecificado en "PATH$". Cuando esta funcion es usada, todo el lis- tado del directorio se cargara en memoria. Una vez aparezca un resultado, podras acceder al siguiente fi chero que reuna esas caracteristica mediante el comando DIR NEXT$ Un ejemplo: Print Dir First$("*.*") 237 = DIR NEXT$ (obtiene el siguiente fichero que coincida con el patron dado) file$=DIR NEXT$ Devuelve el siguiente fichero del directorio creado por el coman- do anterior. Despues de que el ultimo item haya sido leido de la lista, aparecera una cadena conteniendo el caracter vacio (""). Todo el directorio sera ahora borrado y la memoria ocupada sera habilitada para el programa. He aqui un ejemplo que muestra todos los ficheros del directorio actual: F$=Dir First$("*.*") While F$<>"" Print F$: Bell: Wait 30 F$=Dir Next$ Wend Ficheros de disco ================= Los ficheros son un conjunto de informacion que ha sido agrupa da junta en algun lugar del disco. A cada fichero se le asigna un nombre que puede contener desde 1 a 255 caracteres. Antes de que puedas usar alguno de esos ficheros, primero nece sitaras inicializarlos mediante las instrucciones OPEN IN, OPEN OUT o APPEND. Cuando abras un fichero, lo asignaras a un canal cuyo numero va de 1 a 10. Este numero se utilizara en las futuras operaciones de disco para identificar el fichero con el que estas trabajando. El Amiga opera con dos tipos de ficheros de disco: - Ficheros secuenciales - Ficheros de acceso aleatorio 1- Ficheros secuenciales Constituyen los ficheros estandard usados en el Amiga. La ra- zon de su nombre es que solo se permite leer la informacion en la precisa secuencia en que fue originalmente creado. Esto significa que si deseas cambiar solo un dato de la parte media de uno de estos ficheros, tendras que leer todo el fichero y luego volver a escribir todo el fichero otra vez en el disco. AMOS Basic te permite el acceso a los ficheros secuenciales ya sea para lectura o escritura, pero NUNCA para ambas cosas al mis- mo tiempo. Open Out1,"file.seq" Input "Como te llamas?";N$ Print #1, N$ Close 1 Esto crea un fichero llamado FILE.SEQ que contendra tu nombre. Al objeto de leer luego esta informacion, tecla las lineas: 238 Open In 1,"file.seq" Input #1,N$ Print "Recuerdo tu nombre. Es ";N$ Close 1 Observa como ambos programas ejecutan 3 operaciones separadas: - Apertura del fichero usando OPEN IN, OPEN OUT o APPEND - Acceso al fichero con INPUT# o PRINT# - Cierre del fichero mediante CLOSE. Ten presente que si olvidas hacer esto, cualquier cambio del fichero se perdera. Estos 3 pasos necesitan completarse exactamente en este orden, cada vez que accedas a un fichero secuencial. OPEN OUT (apertura de un fichero para salida) OPEN OUT channel,n$ Abre un fichero secuencial para escritura. Si este fichero ya existe seria borrado. "CHANNEL" es un numero entre 1 y 10 y se usara para identificar tu nuevo fichero en los siguientes coman- dos PRINT#. "N$" es el nombre del fichero que sera abierto. APPEND (añade informacion a un fichero existente) APPEND channel,name$ Abre un fichero secuencial para salida. Si este fichero ya existe los datos nuevos se añadiran al final del fichero. Esto te permi- te aumentar tus ficheros ya definidos. OPEN IN (apertura de un fichero para entrada) OPEN IN channel,f$ Establece un fichero de lectura. Si este fichero no existiera, seria creado automaticamente. "CHANNEL" es un numero que oscila entre 1 y 10 y que se usara para las varias instrucciones INPUT sobre tu fichero abierto. CLOSE (cierra un fichero) CLOSE n Cierra el fichero numero N. ATENCION, si olvidas cerrar un fiche- ro despues de que hayas terminado de actuar sobre el, cualquier cambios que hayas realizado se perdera!! 239 PRINT # (imprime una lista de variables en un fichero o dispositivo) PRINTpt channel,variable list Este comando es identica la instruccion normal PRINT, salvo que la informacion no se visualiza en pantalla, sino en el fichero o el dispositivo especificado por el numero de canal. He aqui un ejemplo: Open Out 1,"Testfile" Print#,"Hello" Close 1 Como pasaba con PRINT, podras usar la abreviatura ?# INPUT # (entra una lista de variables desde un fichero o dispositivo) Lee informacion desde un fichero secuencial o dispositivo como el puerto de serie. Como el comando estandard INPUT, se introduce una lista de variables que se cargaran en un juego de variables Basic. Como siempre, cada valor de la lista debera separarse con comas. De forma adicional, cada linea de datos tambien necesitara concluir con su propio caracter . Este es equivalente al retorno de carro que se ejecuta al introducir las lineas desde el teclado. LINE INPUT # (entra una lista de variables no separadas por comas) LINE INPUT #channel,variable list LINE INPUT #channel,separators,variable list Esta funcion es identica a INPUT#, excepto que te permite sepa- rar tu lista de datas usando cualquier caracter, en vez de comas. Si se omite el separador, automaticamente se establece como tal al retorno de carro (RETURN). Cuando estas leyendo el texto, LINE INPUT# siempre es la opcion preferida, debido a que el lenguaje normal incluye comas que pudieran ser interpretadas por AMOS como si fueran separadores, lo que provocaria una gran confusion. SET INPUT (establece el final de una linea de caracteres) SET INPUT c1,c2 Establece el caracter fin de linea que sera utilizado para la con clusion de una linea de datos. El Amiga espera un simple al final de cada linea, mientras que la mayoria de ordenado res (incluido ST) requieren RETURN + . Asi si utilizas ficheros ST, necesitaras finalizar cientos de lineas de tu progra ma. Por fortuna, puedes evitar este problema utilizando este co- mando 240 "C1,C2" contiene un par de valores ASCII que seran usados como separadores. Si deseas un solo caracter, simplemente carga C2 con un valor negativo como un -1. He aqui un par de ejemplos: Set Input 10,-1: Rem formato Amiga estandard Set Input 13,10: Rem formato ST = INPUT$ (introduce un numero de caracteres desde un dispositivo) X$=INPUT$(f,count) Lee "COUNT" caracteres desde el dispositivo o fichero numero "F". = EOF (comprueba el final de un fichero) flag=EOF(channel) EOF es una util instruccion que comprueba si se ha alcanzado el final de un fichero en la actual posicion de lectura. Si eso ocu- rre, EOF devuelve un resultado -1, en caso contrario sera 0. LOF (longitud del fichero abierto) length=lof(channel) Devuelve la longitud de un fichero abierto. No tiene sentido usar esta funcion conjuntamente con dispositivos distintos del disco. POF (contiene una variable con la actual posicion del puntero de fichero) pos=POF(channel) Esta funcion cambia la actual posicion de lectura o escritura de un fichero abierto, por ejemplo: POF(1)=1000 Este comando establece la posicion de lectura/escritura en 1000 caracteres despues del comienzo del fichero. Por muy raro que pa- rezca, POF puede usarse de este modo para simular un acceso alea- torio con ficheros secuenciales. La razon de esto es simplemente que las unidades de disco son intrinsecamente aleatorias y todas las operaciones secuenciales se realizan mediante acceso randomi- zado. 241 - Ficheros de acceso randomizado Estos ficheros se denominan asi porque puedes acceder a la in- formacion contenida en el disco, en el orden que desees. Al obje- to de usar esos ficheros, primeronecesitaras un poquito de teoria Todos los ficheros aleatorios se componen de unidades llamadas "RECORDS", cada uno con su propio numero. Esos 'records' se divi- den a su vez en un numero determinado de campos. Cada campo con- tiene una pieza individual de informacion. Cuando usas ficheros secuenciales, esos campos pueden tener cualquier longitud que de- sees, ya que el fichero solo podra ser leido en una sola direc- cion. Los ficheros randomizados o aleatorios, sin embargo, siem- pre requieren que especifiques el maximo tamaño de avamnce en esos campos. Supongamos que desees producir un fichero que contenga una lis ta de nombres y numeros de telefonos. En este caso, podras usar los campos: Campo Longitud Maxima ----- --------------- Apellido 15 Nombre 15 Codigo 10 Numero 10 Ahora podras definir dichos campos usando la siguiente linea: Field #1,15 as APELLIDO$,15 as NOMBRE$,10 as CODIGO$,10 as NUMERO$ Es importante darse cuenta que las cadenas especificadas por la instruccion FIELD tambien pueden usarse como variables norma- les de cadena. Esto te permite leer y escribir informacion en cualquier campo. Por ejemplo: APELLIDO$="Perez" TEST$=APELLIDO$: Print TEST$ Despues de que hayas cargado un 'record' con informacion, la podras escribir en disco mediante el comando PUT. Ejemplo: Put 1,10 Larga datas en el record 10 del fichero abierto en el canal 1. De forma parecida, podras leer un 'record' mediante la instruc- cion GET: Get 1,10 OPEN RANDOM (abre un canal para un fichero aleatorio) OPEN RANDOM channel,n$ Abre un fichero de acceso aleatorio llamado n$. Cuando uses esta instruccion, deberas definir siempre la estructura del 'record' inmediatamente despues mediante el comando FIELD$.