Sinclair QL Programación Avanzada | ||
---|---|---|
Anterior | Siguiente |
Este capítulo trata de la asignación de los recursos de entrada y salida en el QL. Estos recursos cubren todos los aspectos de comunicación del ordenador: teclado, puertas serie, pantalla, microdrives, etc. Sin embargo, no es necesario aprender diferentes grupos de reglas para cada dispositivo, ya que el QL ha sido diseñado de forma que la comunicación con todos estos dispositivos se realiza de una forma muy bien estructurada.
Las entradas y salidas en el QL se pueden considerar como escribir y leer datos desde un fichero lógico. Este fichero lógico está en formato de dispositivo estándar. Los datos que se mandan a la puerta serie para imprimir, o al microdrive para almacenar son tratados de forma similar. Los detalles específicos de interconexión para cualquier dispositivo en particular los realizan los controladores de dispositivo. Estos han sido escritos específicamente para cada uno de los dispositivos del QL. El sistema encuentra automáticamente el controlador correspondiente dentro del sistema. Todos ellos están en un formato especial (ver capítulo 9.2). En el capítulo 7 se explica con más detalle la entrada y salida.
La asignación de E/S se puede dividir en dos categorías generales. La de abrir un fichero para que se puedan recoger o mandar datos a él, y la de cerrar ficheros. Esta sección explica como abrir y cerrar ficheros. Es necesario conocer ahora como especificar un canal y toda la información sobre él, antes de poder abrirlo. La sección 6.2 explica posteriormente, la forma en que se deben especificar los dispositivos.
Tenemos disponibles los siguientes TRAPS de asignación de E/S:
D0 | Nombre | Descripción | |
01 | IO.OPEN | Abre un canal | |
02 | IO.CLOSE | Cierra un canal | |
03 | IO.FORMT | Formatea un medio en sectores | |
04 | IO.DELET | Borra un fichero |
En el QL, toda la entrada y salida se manda o recoge desde un dispositivo o fichero lógico. Los dispositivos lógicos y físicos están unidos a través de un controlador de dispositivo. Para activar un dispositivo, se debe abrir el canal al que está unido. Para abrir correctamente un canal, suele ser necesaria alguna información básica extra para el controlador del dispositivo (ej. paridad en una puerta serie o tamaño de la ventana para una consola). Esta información extra se añade al nombre del dispositivo. A la combinación de un nombre de dispositivo y la información añadida se le llama nombre de fichero.
Los nombres de los dispositivos lógicos siguen las mismas convenciones que los nombre reales de fichero, por lo que hay ciertos nombre de fichero reservados que no se pueden usar (como mdv1 o ser1). En los nombres de fichero, no hay diferencia entre mayúsculas y minúsculas. Los siguientes dispositivos son los estándar del QL.
Dispositivos estándar del QL
CON_WxHaXxY_K |
esta es la consola con un área de ventana de 'W' por 'H' puntos con la esquina superior derecha en la posición 'X','Y'. 'K' es el número de caracteres en la memoria intermedia del teclado. El tamaño y la posición se definen en puntos en un mapa de pantalla de 512x256 (la posición 256x128 es el centro de la pantalla en ambos modos). El ancho y la posición X se especifican en múltiplos de 2 puntos. El valor por defecto es: CON_448x180a32x16_128 |
|
SCR_WxHaXxY |
esta es la salida a pantalla. El tamaño y posición se definen en puntos en un mapa de pantalla de 512x256 puntos (la posición 256x128 es el centro de la pantalla en ambos modos). El ancho y la posición X se especifican en múltiplos de 16 puntos. El valor por defecto es: SCR_448x180a32x16 |
|
SERnphz |
E/S serie, con puerta 'n'. 'p' indica la paridad: E, O, M o S para par, impar, marca o espacio respectivamente. 'h' es el parámetrode intercambio de iniciación ('handshaking'), I para ignorarlo y H para usarlo. 'z' indica el protocolo: R, Z o C para datos sin procesar sin EOF, control Z como EOF o control Z como EOF con <CR> como separador de datos en vez de <LF>. El valor por defecto es:
|
|
NETI_nn |
unión a red de datos serie desde el nodo 'nn' |
|
NETO_nn |
unión a red de datos serie hacia el nodo 'nn' |
|
PIPE_n |
si se le pone 'n', es un canal de salida de n octetos de longitud. Si
no se le pone, es un canal de entrada conectado al identificador de canal
pasado en D3 |
|
MDVn_nombre | acceso a ficheros en microdrive, 'n' es número de microdrive, 'nombre' es el nombre del fichero |
Los nombres que se dan en esta sección no están incluídos en el QL actual. Es posible que estas convenciones de nombres se usen alguna vez en el futuro, y se han incluido aquí para completar
1. Los nombres de los ficheros deben ser compatibles con las convenciones de nombres del superBASIC del QL.
Esto nos permite una construcción como esta:
OPEN#1,mitexto
donde 'mitexto' es el nombre del fichero, así como
OPEN#canal,nombref$
donde el nombre del fichero está en la cadena 'nombref$'
2. Los nombres de los ficheros deben permitir el uso de estructuras de directorio, ya sean reales o simuladas.
3. Los nombres de los ficheros deben permitir que la unidad o el medio sea
explícito | (incluido en el nombre) | |
por defecto | (valor por defecto del sistema o especificado anteriormente) o | |
indefinido | (se busca en todas las unidades) |
4. Los nombres de ficheros deben permitir la creación de nombres de ficheros relacionados
1. Los nombres del sistema deben consistir en letras, dígitos y subrayados
2. El nombre debe ser una serie o grupo de caracteres alfa-numéricos separados por subrayados. Cada grupo está relacionado con un directorio.
3. Un Job puede proporcionar una cadena por defecto al sistema operativo. Esta cadena por defecto se añadirá al principio de cualquier nombre de fichero dado en una llamada para abrir un fichero. El sistema reconocerá ciertas cadenas (como MDV1) como nombre de dispositivos físicos. A estos nombres no se le añadirá la cadena por defecto.
La opción para buscar un fichero en todas las unidades (especificando el nombre del medio, por ejemplo) puede resulta muy caro en términos de carga del procesador. Esto no se ha considerado en el 'software' inicial del QL.
4. La creación automática de nombres de fichero relacionados con otro dado, se realiza normalmente añadiendo una extensión al final del nombre. Al QDOS le es imposible distinguir entre el nombre de un fichero de extensión (como JIM_BAS) y un nombre de fichero directorio (como ESTEFI_JIM), por lo que las extensiones aparecen como ficheros dentro del directorio.
Tanto el nombre de fichero como el de extensión deben ser suministrados en la llamada OPEN. Así podrá tomarlo el sistema de la mejor manera posible.
Los nombres de ficheros tienen el formato general de grupos de cadenas alfa-numéricas conectadas por signos de subrayado.
En las siguientes definiciones 'aaa' es una cadena alfa-numérica que empieza con una letra.
nombre.unidad.es | aaan | nombre definido por una unidad seguida por un dígito, ej. mdv1. |
|
nombre.medio.es | aaa | nombre con que se definió
cuando se formateó el medio. |
|
defecto es |
nombre.unidad{_aaa} nombre.medio{_aaa} |
||
nombre.fichero es | aaa{_aaa} |
||
nombre.compl es | unidad.nombre_fichero.nombre |
||
extensión es | aaa |
Nota: En QDOS v1.03, nombre.coml es la única forma permitida de nombre de fichero. No se asumen defectos. No es posible distinguir entre nombre.fichero y nombre.medio_nombre.fichero.
Hay muchos métodos disponibles para abrir ficheros. Es posible abrir un fichero explícitamente mediante una operación OPEN. Alternativamente, se pueden abrir ficheros imp1ícitamente con las operaciones COPY o DELETE.
Cada operación de OPEN se caracteriza por el estado del almacenamiento del fichero antes de abrirlo y por los derechos de acceso después de hacerlo. El estado antes de abrirlo es si el fichero existe o no. Después de abrirlo, los derechos de acceso al fichero pueden ser exclusivos o compartidos.
La siguiente tabla nos muestra los estados correspondientes a cada operación con el fichero:
|
||||||||
Operación |
Estado
|
Acceso
|
Tipo
|
|||||
|
||||||||
nuevo
|
existe
|
exclusivo | ||||||
compartido
|
||||||||
|
||||||||
OPEN |
X
|
X
|
||||||
nuevo | ||||||||
|
||||||||
OPEN |
X
|
X
|
X
|
|||||
reescribir | ||||||||
|
||||||||
OPEN |
X
|
X
|
||||||
exclusivo | ||||||||
|
||||||||
OPEN |
X
|
X
|
||||||
compartido | ||||||||
|
||||||||
COPY |
X
|
X
|
compartido
|
|||||
origen | ||||||||
|
||||||||
COPY |
X
|
X
|
nuevo
|
|||||
destino | ||||||||
|
||||||||
DELETE |
X
|
X
|
exclusivo
|
|||||
|
Los ficheros compartidos son a los que pueden acceder varios Jobs al mismo
tiempo. Un ejemplo puede ser una base datos maestra con varios Jobs refiriendose
a ella. A los ficheros de acceso exclusivo sólo puede acceder un Job
cada vez.
Esta subsección cubre el orden de búsqueda de ficheros. Deben tener en cuenta los lectores que esto no ha sido implementado en las versiones actuales del sistema operativo. Como existe una posibilidad de que se implemente en poco tiempo, se ha incluido para completar.
Hay tres partes posibles en un nombre de fichero que se va a abrir. Cada Job define un nombre por defecto. Como defecto adicional, también se puede proporcionar una extensión (por llamada OPEN). Finalmente, se proporciona un nombre completo o un nombre de fichero.
Cuando se abre un fichero nuevo, el nombre usado por el OPEN se define completo. En caso de que se abra un fichero que ya existe, el sistema intenta encontrar el nombre de fichero que corresponde a una de las combinaciones del nombre que le hemos dado y los defectos.
El orden de búsqueda es:
nombre.completo dado | nombre.fichero dado | |
para nuevo o reescribir: | ||
ler nombre.compl | ler defecto_nombre.fich | |
para exclusivo y compartido: | ||
1º nombre.compl_extens | 1º defecto_nombre.fich_extens | |
2º nombre.compl | 2º defecto_nombre.fich | |
3º nombre.fich_extens | ||
4º nombre.fich |
Ejemplos de OPEN de ficheros existentes
Defecto | Fichero | Extensión | Orden de búsqueda | |
mdv2 | jim | bas | mdv2_jim_bas mdv2_jim y si jim es un medio jim_bas jim |
|
mdv2 | fred_data | data | mdv2_fred_data_data mdv2_fred_data y si fred es un medio fred_data_data fred_data |
|
mdv2 | mdv1_temp | data | mdv1_temp_data mdv1_temp |
|
mdv2 | mdv1_temp | nulo | mdv1_temp | |
ser1_utils | backup | exec | ser1_utils_backup_exec ser1_utils_backup si backup es un medio backup_exec backup |
|
ser1_utils | mdv2 | nulo | mdv2 (sólo leer directorio) |
Tenga en cuenta que en QDOS V1.03 sólo está permitido usar nombre.completo.
IO.OPEN | TRAP#2 | D0=1 |
Abre un canal
Parámetros de llamada | Parámetros retornados |
D1.L | Job ID | D1 | Job ID |
D2 | D2 | preservado | |
D3.L | código en bits: | D3 | preservado |
0 = viejo (exclusivo) fichero o dispositivo
l = viejo (compartido) fichero
2 = nuevo (exclusivo) fichero
3 = nuevo (reescribir) fichero (no soportado para microdrives en QDOS V1.03)
4 = abrir directorio
A0 | direcc. nombre canal | A0 | ID del canal |
A1 | A1 | indefinido | |
A2 | A2 | preservado | |
A3 | A3 | preservado |
Error devuelto:
NO no abierto porque hay demasiados canales abiertos
NJ el Job no existe
OM no hay memoria
NF no se encuentra fichero o dispositivo
EX el fichero ya existe
IU fichero o dispositivo en uso
BN nombre inválido de fichero o dispositivo
Cualquier código de retorno que no sea cero significa que el canal no ha sido abierto.
Descripción:
Este TRAP abre un canal. El nombre de fichero o dispositivo se usa para determinar el tipo de dispositivo requerido. Cada Job mantiene su propia lista de canales, por lo que se debe especificar el número de Job. Si el Job ID es una palabra negativa entonces el canal se asociará con el Job actual.
El nombre de fichero o dispositivo se debe almacenar en una cadena de caracteres ASCII. La cadena es precedida por una palabra que contiene el número de caracteres de la cadena, seguida por los caracteres. El apuntador pasado en A0 debe apuntar a esta palabra (en frontera de palabra).
Un error BN significa que el nombre del dispositivo ha sido reconocido, pero los parámetros eran incorrectos. Por ejemplo CON_20y30.
En circunstancias normales, cuando se accede aun dispositivo no estándar, la información del código se ignora. En la práctica, esto significa que el código sólo es relevante si se accede a un fichero almacenado.
IO.CLOSE | TRAP#2 | D0=2 |
Cierra un canal
Parámetros de llamada | Parámetros retornados |
D1 | D1 | preservado | |
D2 | D2 | preservado | |
D3 | D3 | preservado | |
A0 | ID del canal | A0 | indefinido |
A1 | A1 | indefinido | |
A2 | A2 | preservado | |
A3 | A3 | preservado |
Error devuelto:
NO el canal no estaba abierto
Descripción:
Este TRAP cierra un canal que ha sido abierto previamente.
IO.FORMT | TRAP#2 | D0=3 |
Formatea un medio por sectores
Parámetros de llamada | Parámetros retornados |
D1 | D1.W | número de sectores buenos | |
D2 | D2.W | número total de sectores | |
D3 | D3 | preservado | |
A0 | apuntador nombre medio | A0 | indefinido |
A1 | A1 | indefinido | |
A2 | A2 | preservado | |
A3 | A3 | preservado |
Error devuelto:
OM no hay memoria
FF ha fallado el formateo
NF no se encuentra
IU en uso
Descripción:
IO.FORMT hace que se formatee un medio por sectores, como los cartuchos de microdrive. El nombre del medio se almacena como una palabra con el número de caracteres seguida de una cadena de caracteres ASCII, el número de la unidad, un subrayado y hasta diez caracteres del nombre del medio. Ej. mdv2_Utilidad.
Este TRAP nos devuelve el número total de sectores y el número de sectores buenos. El total de sectores es el máximo número que puede caber en el medio. Ya que algunas partes del medio pueden estar en error, el número real de sectores útiles puede ser menor que el total.
IO.DELET | TRAP#2 | D0=4 |
Borra un fichero
Parámetros de llamada | Parámetros retornados |
D1.L | Job ID (el que lo abrió) | D1 | indefinido |
D2 | D2 | preservado | |
D3 | D3 | indefinido | |
A0 | dirección nombre canal | A0 | indefinido |
A1 | A1 | indefinido | |
A2 | A2 | preservado | |
A3 | A3 | preservado |
Error devuelto:
NO no abierto (hay demasiados canales abiertos)
OM no hay memoria
NF fichero o dispositivo no encontrado
BN nombre de fichero o dispositivo inválido
Descripción:
Este TRAP hace que se borre el fichero especificado. A0 apunta a una palabra que contiene el número de caracteres ASCII que vienen a continuación. Estos caracteres ASCII definen el nombre.
Anterior | Tabla de contenidos | Siguiente |
Los TRAPS del Gestor | Utilización de Entrada/Salida |