Sinclair QL Programación Avanzada
Anterior Siguiente

6. Asignación de Entrada/Salida

6.1 Introducción a E/S

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

6.2 Especificación de nombres de dispositivo

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:

SER1R (8 bits sin paridad)

  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

6.3 Rellenando las especificaciones de nombres del sistema

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

6.3.1 Requerimientos para rellenar nombres del sistema

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

6.3.2 Aproximación al rellenado de nombres del sistema

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.

6.3.3 Componentes de nombres de fichero

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
o

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.

6.4 Abriendo ficheros

6.4.1 Introducción general

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.

6.4.2 Orden de búsqueda de ficheros

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.

6.5 Sección de referencia de TRAPS de asignación E/S

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