QL Programación Avanzada
Anterior Siguiente

7. Utilización de Entrada/Salida

7.1 Introducción

En el capítulo 6 hemos tratado los conceptos y procedimientos para asignar canales E/S. Para usar los canales asignados es necesario analizar los datos que se mandan y reciben desde el canal.

Los TRAPs que se encargan de la utilización de los canales se pueden dividir en tres grupos bien definidos. Estos grupos se resumen en las siguientes subsecciones.

7.1.1 Llamadas de E/S serie

Aquí se trata la E/S totalmente redireccionable del QL. Las operaciones de E/S serie incluyen el teclado, líneas serie RS232, pantalla, impresora, microdrives, etc. (sujetos como es lógico a las restricciones de lectura/escritura propias de cada dispositivo). Sólo se necesita especificar el número de canal al que se van a mandar o del que se van a recibir los datos. Toda la información sobre las características particulares de cada fichero se ha especificado ya en el proceso de OPEN (ver capítulo 6).

Cuando tratamos con el sistema de E/S totalmente redireccionable, hay tres posibles estados de retorno. El retorno se puede inhibir hasta que el proceso especificado se haya completado, forzar a que ocurra inmediatamente (ej. sin esperar), o programarlo para que ocurra después de un periodo de tiempo predefinido (o si se completa antes el proceso). El periodo de espera se especifica como cero, un tiempo entre 0 y 10 minutos o indefinidamente. El incremento de tiempo es un número múltiplo de 50 ó 60 Hz.

Sumario de llamadas de E/S serie

D0NombreDescripción
00IO.PENDComprueba una entrada pendiente
01IO.FBYTERecoje un octeto
02IO.FLINERecoje una línea de caracteres terminada en <LF>
03IO.FSTRGRecoje una cadena de octetos
04IO.EDLINEdita una línea de caracteres (sólo en la consola)
05IO.SBYTEManda un octeto
07IO.SSTRGManda una cadena de octetos

7.1.2 Control de salida a pantalla

El control de la pantalla no es por sí mismo una parte del sistema redireccionable de E/S. Sin embargo, la pantalla es una parte integral del QL y como tal debe ser incluida en la utilización de E/S. Por medio del control de salida a pantalla se llevan a cabo procesos tales como modificar una ventana, controlar el cursor, hacer 'scroll' y poner los colores. La operación de sacar caracteres a la pantalla se puede realizar haciendo OPEN a CON_ o SCR_ canal. Esto es parte del sistema redireccionable de E/S.

Sumario de las llamadas de salida a pantalla

D0NombreDescripción
09SD.EXTOPInvoca a una rutina adicional como parte del controlador de pantalla
0ASD.PXENQDevuelve al tamaño de ventana y posición del cursor (en puntos)
0BSD.CHENQDevuelve el tamaño de ventana y posición del cursor (en caracteres)
0CSD.BORDRPone el borde de un color
0DSD.WDEFRedefine una ventana
0ESD.CUREHabilita el cursor
0FSD.CURSSuprime el cursor
10SD.POSPosiciona el cursor en la fila, columna en intervalos de carácter
11SD.TABPosiciona el cursor en cualquier columna de caracteres definida
12SD.NLPosiciona el cursor en una nueva línea de caracteres
13SD.PCOLPosiciona el cursor en la columna anterior
14SD.NCOLPosiciona el cursor en la siguiente columna
15SD.PROWPosiciona el cursor en la línea anterior
16SD.NROWPosiciona el cursor en la siguiente línea
17SD.PIXPPosiciona el cursor en coordenadas de puntos
18SD.SCROL'Scroll' de toda una ventana
19SD.SCRTP'Scroll' de la parte superior de una ventana
1ASD.SCRBT'Scroll' de la parte inferior de una ventana
1BSD.PANMueve lateralmente una ventana
1ESD.PANLNMueve lateralmente la línea del cursor
1FSD.PANRTMueve lateralmente la parte derecha de la línea del cursor
20SD.CLEARLimpia toda una ventana
21SD.CLRTPLimpia la parte alta de una ventana
22SD.CLRBTLimpia la parte baja de una ventana
23SD.CLRLNLimpia la línea del cursor
24SD.CLRRTLimpia la parte derecha de la línea del cursor
25SD.FOUNTPone y quita un juego de caracteres
26SD.RECOLRecolorea una ventana
27SD.SETPAPone el color del papel
28SD.SETSTPone el color del punteado
29SD.SETINPone el color de la tinta
2ASD.SETFLPone el parpadeo
2BSD.SETULPone el subrayado
2CSD.SETMDPone el modo caracteres o gráficos
2DSD.SETSZPone tamaño de los caracteres y espaciado
2ESD.FILLRellena bloques rectangulares en las ventanas
30SD.POINTDibuja un punto
31SD.LINEDibuja una línea
32SD.ARCDibuja un arco
33 SD.ELIPS Dibuja una elipse
34SD.SCALEPone la escala de una ventana
35SD.FLOODPone o quita el relleno de un área gráfica
36SD.GCURPone la posición del cursor gráfico

7.1.3 Manejo de ficheros

El manejo de ficheros se puede realizar ampliamente con el sistema redireccionable de E/S. Por ejemplo, se pueden transferir ficheros enteros entre microdrives y las puertas RS232 sin problemas. En este capítulo se tratan dos áreas básicas de manejo de ficheros. Éstas son la carga y salvado de ficheros completos, y tratamiento de ficheros de acceso directo y de registros estructurados.

Sumario del manejo de ficheros

D0NombreDescripción
40FS.CHECKComprueba todas las operaciones pendientes de un fichero
41FS.FLUSHBorra la memoria intermedia de un fichero
42FS.POSABPosiciona el apuntador de fichero a una posición absoluta en el fichero
43FS.POSREPosiciona el apuntador de fichero a una posición relativa en el fichero
45FS.MDINFObtiene información sobre el medio
46FS.HEADSPone una cabecera de fichero
47FS.HEADRLee una cabecera de fichero
48FS.LOADCarga un fichero en memoria
49FS.SAVESalva un fichero desde memoria

7.2 Llamadas de E/S serie

La E/S serie se refiere a la transferencia de octetos o caracteres. Esta transferencia es totalmente redireccionable, por lo tanto la salida se puede cambiar de la pantalla a la impresora (por ejemplo) redefiniendo simplemente el canal de transferencia. El proceso detallado de los datos a un periférico determinado es ejecutado por un controlador de dispositivo. Esta pieza de 'software' asegura que el QDOS pueda hablar con cualquier periférico de una forma estándar, a pesar de que los detalles de operación de estos periféricos pueden variar ampliamente.

La transferencia serie por octetos se suele usar cuando el job que trata los datos debe controlar la acción del controlador. En estos casos, los octetos representan códigos de control que deben ser procesados por el job y no por el controlador.

La alternativa a mandar octetos individuales es mandar cadenas completas. La transferencia de estas cadenas es mucho más eficiente que transferir los ficheros de octeto en octeto. Cuando se lee una cadena con un tiempo de espera de cero, solamente se pueden leer los octetos que están disponibles en un tiempo determinado. La transferencia de cadenas debe usar tanta memoria intermedia como sea posible. Si ésta es muy pequeña, el proceso de transferecia entre ficheros será ineficiente (a menos que el fichero contenga solamente un pequeño número de octetos).

Es importante usar la facilidad del tiempo de espera con cuidado cuando está accediendo más de un job al mismo canal. Esto es debido a un posible problema de acceso de clases. Por ejemplo, si un job está esperando por una ES y otro job requiere otra ES en el mismo canal, entonces, suponiendo que el periodo de espera no sea cero, el segundo job será replanificado y no se ejecutará hasta que el primer job haya terminado su espera (porque haya terminado su tarea o vencido el tiempo de espera). El periodo de espera del segundo job no empezará hasta que haga realmente el acceso al canal y no desde cuando lo intentó la primera vez.

7.2.1 Opciones de retorno de E/S serie

Las llamadas al sistema de E/S serie se pueden dividir en tres tipos de retorno diferentes, dependiendo de la aplicación. Las opciones son:

Esperando complexión

Esta opción de retorno no volverá hasta que se haya completado el proceso requerido. Este tipo de llamada se debe usar con mucho cuidado, ya que si el evento del proceso permanece incompleto, el job que lo llamó puede permanecer inactivo eternamente.

Retorno inmediato

Esta opción es la opuesta a la anterior. Cuando se realiza esta llamada, se realizarán todos los procesos que vayan a ser afectados inmediatamente. Todo lo que no se pueda realizar instantáneamente permanecerá sin terminar. Tenga en cuenta que si una llamada de salida retorna incompleta (ej. la memoria intermedia del canal está temporalmente llena), permanecerá incompleta. Los datos originales no habrán sido mandados, y deben ser reenviados posteriormente para que no se pierdan.

En espera del periodo o hasta la complexión

Esta opción retornará después de un tiempo predefinido o cuando se haya completado la tarea (si ocurre antes de que el periodo de espera se haya terminado). Un ejemplo del uso de este tipo de periodo puede ser un RS232 conectado a un teclado. Si no se pulsa una tecla en 10 minutos, por ejemplo, la llamada de lectura del teclado terminará su periodo de espera y puede desconectar el teclado del QL. Todos los tiempos se calculan en periodos de refresco de la pantalla, 50/60 Hz. El periodo de espera para las llamadas de E/S serie se pasa en D3 y no se modifica por los TRAPs.

General

Todas las opciones de retorno anteriores están disponibles a través de una llamada. Cada una de ellas se caracteriza por la longitud máxima de espera permitida. El periodo de espera puede ser cero, definido o ilimitado. Para definir el número de ciclos de cuadro antes del retorno se usa una palabra, que puede tomar un valor máximo de 32767 (once minutos). Un periodo de espera de -1 indica que se debe esperar indefinidamente. No se debe usar ningún otro valor negativo.

7.2.2 Sección de referencia de E/S serie

IO.PEND   TRAP #3   D0=0

Comprueba una entrada pendiente

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 EF  fin del fichero

Descripción:

Este TRAP comprueba una entrada pendiente en un canal. La información se devuelve al programa que lo lanzó por medio del código de error. No lee ningún dato ni modifica el canal de entrada de ninguna forma. En las primeras versiones del QDOS, este TRAP no se puede realizar cuando se usa con el controlador de la consola, se debe usar IO.FBYTE en su lugar.

IO.FBYTE   TRAP #3   D0=1

Recoje un octeto

Parámetros de llamada     Parámetros retornados
 
D1  D1.B octeto recibido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 EF  fin del fichero

Descripción:

Este TRAP recoge un octeto del canal definido con un periodo de espera programado. El octeto recogido (si hay alguno) lo devuelve en el registro D1.

IO.FLINE   TRAP #3   D0=2

Recoge una línea de caracteres terminados por <LF>

Parámetros de llamada     Parámetros retornados
 
D1  D1.W número de octetos recogidos
D2.W longitud memoria intermedia D2.W preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 base de memoria intermedia A1 apuntador nuevo a memoria intermedia
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 EF  fin del fichero
 BO  rebosamiento de la memoria intermedia

Descripción:

Con este TRAP se puede recoger una línea de caracteres. El número de caracteres en la línea (incluido el <LF>) se devuelve en el registro D1. Para todas las lecturas múltiples de un octeto, el periodo de espera es el máximo periodo de espera desde el lanzamiento del TRAP, y no el timepo entre octetos consecutivos. Por lo tanto no se puede usar el periodo de espera para detectar si el operador está tecleando muy lentamente. El máximo número de octetos que se pueden recoger dentro del límite de tiempo, son los que se obtienen.

El recoger una línea de caracteres de la consola tiene un significado especial. Todos los caracteres se van escribiendo en la ventana correspondiente de la pantalla, a medida que se introducen desde el teclado. Cuando se usa este TRAP, el cursor se habilita en la ventana, y se inhabilita una vez que se ha leído la línea. Para modificar la línea se pueden usar las teclas de control del cursor, del modo normal:

   mueve el cursor hacia la izquierda
   mueve el cursor hacia la derecha
 CTRL + ⇐  borra un carácter a la izquierda
 CTRL + ⇒  borra un carácter a la derecha

IO.FSTRG   TRAP #3   D0=3

Recoge una cadena de octetos

Parámetros de llamada     Parámetros retornados
 
D1  D1.W número de octetos recogidos
D2.W longitud memoria intermedia D2.W preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 base de memoria intermedia A1 apuntador nuevo a memoria intermedia
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 EF  fin del fichero

Descripción:

Este TRAP recoge una cadena de octetos del canal asignado. Si éstos vienen del teclado, no serán impresos en la pantalla y no se podrá manejar el cursor desde la aplicación. Todo esto se puede conseguir mediante el TRAP IO.FLINE (TRAP #3, D0=2). Si se pasa en A1 un apuntador a una matriz de caracteres, a la vuelta apuntará al siguiente octeto.

IO.EDLIN   TRAP #3   D0=4

Edita una línea de caracteres (sólo en consola)

Parámetros de llamada     Parámetros retornados
 
D1.L longitud cursor/línea D1.L longitud cursor/línea
D2.W longitud memoria intermedia D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 base final línea A1 apuntador final de línea
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 BO  rebosamiento de la memoria intermedia

Descripción:

Este TRAP es similar a IO.FLINE, pero con ciertas diferencias. Se puede usar para editar una línea. A1 debe apuntar siempre al final de la línea. En D1 se pasa la posición del cursor en la palabra alta, y la longitud de la línea en la inferior. De este modo se puede editar la línea fácilmente, se escribe (desde la posición actual del cursor) a la consola cada vez que se lanza el TRAP. Una vez lanzado, la línea no debe tener carácter de terminación. Sin embargo, a la vuelta, el carácter de terminación se incluirá en la cuenta de caracteres. Se pueden usar como caracteres válidos de terminación <CTRL J>, <ENTER>, cursor arriba o cursor abajo.

IO.SBYTE   TRAP #3   D0=5

Manda un octeto

Parámetros de llamada     Parámetros retornados
 
D1.B octeto a mandar D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 DF  unidad llena
 OR  fuera de rango

Descripción:

Con este TRAP se pueden mandar octetos separados a un canal. Para ciertos dispositivos, la espera en salida puede no operar de la forma esperada. El comportamiento esperado ocurre cuando el dispositivo de salida contiene algún tipo de memoria intermedia (ej. la memoria de una impresora). Todo esto es totalmente invisible para el sistema de E/S. Un retorno con la indicación de que se ha completado la transacción solamente significa que los octetos se han transferido al controlador del dispositivo, no implica necesariamente que hayan llegado al otro extremo del dispositivo (ej. que hayan sido impresos). Ver también IO.SSTRG.

IO.SSTRG   TRAP #3   D0=7

Manda una cadena de octetos

Parámetros de llamada     Parámetros retornados
 
D1  D1 número de octetos mandados
D2.W número de octetos a mandar D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1 base memoria intermedia A1 nuevo apuntador memoria intermedia
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 DF  unidad llena

Descripción:

Con este TRAP se pueden mandar cadenas de octetos. Se han hecho algunas previsiones para generar nuevas líneas durante la salida a consola o pantalla. Cuando se manda un <LF>, ocurre la inserción automática de nuevas líneas, o si el cursor llega a la parte derecha de la pantalla. A diferencia del TRAP para mandar un octeto, éste no genera el error OR. En caso de que el cursor se haya suprimido, la nueva línea no queda afectada inmediatamente, y permanece pendiente. Se puede activar de las siguientes formas:

 mandando otro octeto o cadena,
 cambiando el tamaño de carácter,
 activando el cursor,
 o pidiendo la posición del cursor.

Las nuevas líneas pendientes se cancelan si se posiciona el cursor. Ver también IO.SBYTE.

7.3 Control de salida a pantalla

El control de la salida a pantalla cubre las operaciones de modificar ventanas, controlar el cursor, limpiar parte o toda la ventana, hacer 'scroll' y poner los colores. Ya que estas operaciones son específicas de la pantalla, estos TRAPs no forman parte del sistema redireccionable de E/S. Esto significa que puede ser posible escribir emuladores de controlador de pantalla que se pueden acceder con un TRAP #3.

7.3.1 Controladores de pantalla del usuario

SD.EXTOP   TRAP #3   D0=9

Llama a una operación extendida

Parámetros de llamada     Parámetros retornados
 
D1 pasa a rutina usuario D1 devuelto por la rutina del usuario
D2 pasa a rutina usuario D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 pasa a rutina usuario A1 devuelto por la rutina del usuario
A2 dirección comienzo rutina A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este comando se puede llamar a una rutina proporcionada por el usuario, como si formara parte de controlador estándar de pantalla. El periodo de espera y el ID del canal se pasan en D3 y A0 como es usual. A2 contiene la dirección de comienzo de la rutina de usuario. Los demás registros D1, D2 y A1 pueden ser asignados por el programa de aplicación si se requiere.

7.3.2 Buscando el tamaño de la ventana actual

SD.PXENQ   TRAP #3   D0=A

Obtiene tamaño ventana y posición del cursor (en puntos)

Parámetros de llamada     Parámetros retornados
 
D1  D1 preservado
D2  D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1 base del bloque pedido A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este TRAP se puede averiguar el tamaño de la ventana asignada al canal definido. También se obtiene la posición actual del cursor dentro de esa ventana. Todas las posiciones se obtienen en coordenadas de puntos. El tamaño y la posición vienen en un bloque de petición de cuatro palabras. A1 apunta a la base de este bloque. Su formato es:

 base  dimensión X de la ventana
 base+2  dimensión Y de la ventana
 base+4  posición X del cursor
 base+6  posición Y del cursor

La posición superior izquierda es 0,0.

SD.CHENQ   TRAP #3   D0=B

Obtiene tamaño ventana y posición del cursor (en caracteres)

Parámetros de llamada     Parámetros retornados
 
D1  D1 preservado
D2  D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1 base del bloque pedido A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este TRAP se puede averiguar el tamaño de la ventana asignada al canal definido. También se obtiene la posición actual del cursor dentro de esa ventana. Todas las posiciones se obtienen en coordenadas de caracteres. El tamaño y la posición vienen en un bloque de petición de cuatro palabras. A1 apunta a la base de este bloque. Su formato es:

 base  dimensión X de la ventana
 base+2  dimensión Y de la ventana
 base+4  posición X del cursor
 base+6  posición Y del cursor

La posición superior izquierda es 0,0.

7.3.3 Control de ventanas

SD.BORDR   TRAP #3   D0=C

Pone el ancho y color del borde

Parámetros de llamada     Parámetros retornados
 
D1.B color D1 indefinido
D2.W ancho D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1  A1 preservado
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Esta llamada se usa para redefinir el borde de una ventana. El valor por defecto es 0. El ancho del borde es doblado en los bordes verticales y cae dentro de los límites originales de la ventana. Cuando se cambia el ancho del borde, el cursor se pone en posición de inicio (0,0).

Todos los TRAPs que se llamen a continuación para definir la posición del cursor y los límites de la pantalla usan el tamaño nuevo de la ventana.

Las definiciones de color se tratan en la sección 7.3.9. En este TRAP disponemos de una definición nueva de color. Si definimos el color como $80 produciremos un borde transparente, lo que significa que no se altera el contenido original del borde.

SD.WDEF   TRAP #3   D0=D

Redefine una ventana

Parámetros de llamada     Parámetros retornados
 
D1.B color del borde D1 indefinido
D2.W ancho del borde D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1 base bloque ventana A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la ventana no cabe en la página

Descripción:

Esta llamada permite redefinir la posición y el diseño de una ventana. El contenido de la ventana anterior no se mueve ni se modifica, pero el cursor se reposiciona en la esquina superior izquierda de la nueva ventana. El bloque de ventana contiene 4 palabras como siguen:

 base  ancho ventana
 base+2  alto ventana
 base+4  origen X
 base+6  origen Y

Todos los TRAPs que se lancen a partir de éste para definir la posición del cursor y los límites de la ventana usarán el nuevo tamaño reducido de la ventana.

Las definiciones de color se tratan en la sección 7.3.9.

7.3.4 Control del cursor

SD.CURE   TRAP #3   D0=E

Habilita el cursor

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP hace que se habilite el cursor en la ventana definida por el ID del canal. Siempre que se lance un TRAP para leer o editar una línea en una ventana, el cursor se habilitará automáticamente. No devolverá ningún error si el cursor ya está habilitado, en cuyo caso, este TRAP sólo se asegura de que lo esté.

SD.CURS   TRAP #3   D0=F

Suprime el cursor

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 preservado
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Esta llamada hace que desaparezca el cursor en el canal especificado. Si la ventana no tuviera ya el cursor, esta llamada no devolverá error.

SD.POS   TRAP #3   D0=10

Posiciona el cursor (coordenadas de caracteres)

Parámetros de llamada     Parámetros retornados
 
D1.W número de columna D1 indefinido
D2.W número de línea D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición está fuera de la ventana

Descripción:

Este TRAP coloca el cursor en una posición absoluta de la pantalla, usando coordenadas de caracteres. La posición del cursor es la esquina superior izquierda del siguiente rectángulo de carácter. La posición de los rectángulos de carácter es relativa a la esquina superior izquierda de la ventana. Si el TRAP devuelve un error, el cursor no cambia de posición. Este TRAP cancela todas las nuevas líneas pendientes.

SD.TAB   TRAP #3   D0=11

Posiciona el cursor en una columna de caracteres

Parámetros de llamada     Parámetros retornados
 
D1.W número de columna D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición cae fuera de la ventana

Descripción:

Este TRAP hace que se tabule el cursor a la columna especificada en el registro D1. El cursor se sitúa en la esquina superior izquierda del siguiente rectángulo de carácter. La posición de los rectángulos de carácter es relativa a la esquina superior izquierda de la ventana. Si el TRAP devuelve un error, el cursor no cambia de posición. Este TRAP cancela todas las nuevas líneas pendientes.

SD.NL   TRAP #3   D0=12

Posiciona el cursor en una nueva línea de caracteres

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición está fuera de la ventana

Descripción:

Este TRAP posiciona el cursor al principio de la siguiente línea de caracteres. El cursor se posiciona en la parte superior izquierda del siguiente rectángulo de carácter. La posición de los rectángulos de carácter es relativa a la esquina superior izquierda de la ventana. Si el TRAP devuelve un error, el cursor no cambia de posición. Este TRAP cancela todas las nuevas líneas pendientes.

SD.PCOL   TRAP #3   D0=13

Posiciona el cursor en el carácter anterior

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición está fuera de la ventana

Descripción:

Este TRAP posiciona el cursor en el carácter anterior. El cursor se posiciona en la parte superior izquierda del siguiente rectángulo de carácter. La posición de los rectángulos de carácter es relativa a la esquina superior izquierda de la ventana. Si el TRAP devuelve un error, el cursor no cambia de posición. Este TRAP cancela todas las nuevas líneas pendientes.

SD.NCOL   TRAP #3   D0=14

Posiciona el cursor en el siguiente carácter

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición está fuera de la ventana

Descripción:

Este TRAP posiciona el cursor en el siguiente carácter de la derecha. El cursor se posiciona en la parte superior izquierda del siguiente rectángulo de carácter. La posición de los rectángulos de carácter es relativa a la esquina superior izquierda de la ventana. Si el TRAP devuelve un error, el cursor no cambia de posición. Este TRAP cancela todas las nuevas líneas pendientes.

SD.PROW   TRAP #3   D0=15

Posiciona el cursor en la línea anterior

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición está fuera de la ventana

Descripción:

Mueve el cursor a la línea anterior. El cursor se posiciona en la parte superior izquierda del siguiente rectángulo de carácter. La posición de los rectángulos de carácter es relativa a la esquina superior izquierda de la ventana. Si el TRAP devuelve un error, el cursor no cambia de posición. Este TRAP cancela todas las nuevas líneas pendientes.

SD.NROW   TRAP #3   D0=16

Posiciona el cursor en la línea siguiente

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición está fuera de la ventana

Descripción:

Este TRAP posiciona el cursor en la línea siguiente. El cursor se posiciona en la parte superior izquierda del siguiente rectángulo de carácter. La posición de los rectángulos de carácter es relativa a la esquina superior izquierda de la ventana. Si el TRAP devuelve un error, el cursor no cambia de posición. Este TRAP cancela todas las nuevas líneas pendientes.

SD.PIXP   TRAP #3   D0=17

Posiciona el cursor usando coordenadas de puntos

Parámetros de llamada     Parámetros retornados
 
D1.W coordenada X D1 indefinido
D2.W coordenada Y D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  la posición está fuera de la ventana

Descripción:

Con este TRAP se puede posicionar el cursor dentro de la pantalla. Todas las coordenadas son relativas a la esquina superior izquierda de la pantalla, que es la posición 0,0. La nueva línea pendiente dentro de la pantalla será cancelada. Si devuelve un error, el cursor no se mueve.

7.3.5 'Scroll' de las ventanas

SD.SCROL   TRAP #3   D0=18

Hace 'scroll' de una ventana

Parámetros de llamada     Parámetros retornados
 
D1.W distancia del 'scroll' D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP hace que se mueva toda la ventana, hacia arriba o hacia abajo, el número de puntos que indica el registro D1. Las líneas que aparecen nuevas al hacer el 'scroll' se rellenan con el color del papel. Un valor positivo hace que se mueva la ventana hacia abajo. Una ventana de texto se suele mover hacia arriba, y requiere un valor negativo.

Ver también SD.SCRTP y SD.SCRBT para el 'scroll' parcial.

SD.SCRTP   TRAP #3   D0=19

Hace 'scroll' de la parte superior de una ventana

Parámetros de llamada     Parámetros retornados
 
D1.W distancia del 'scroll' D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP hace 'scroll' del contenido de la parte superior de la ventana. La división entre la parte superior e inferior de la ventana viene dada por la línea del cursor, que no se mueve. Las líneas que aparecen nuevas al hacer el 'scroll' se rellenan con el color del papel. Un valor positivo hace que se mueva la ventana hacia abajo. Una ventana de texto se suele mover hacia arriba, y requiere un valor negativo.

SD.SCRBT   TRAP #3   D0=1A

Hace 'scroll' de la parte inferior de una ventana

Parámetros de llamada     Parámetros retornados
 
D1.W distancia del 'scroll' D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP hace 'scroll' del contenido de la parte inferior de la ventana. La división entre la parte superior e inferior de la ventana viene dada por la línea del cursor, que no se mueve. Las líneas que aparecen nuevas al hacer el 'scroll' se rellenan con el color del papel. Un valor positivo hace que se mueva la ventana hacia abajo. Una ventana de texto se suele mover hacia arriba, y requiere un valor negativo.

7.3.6 Movimiento lateral de ventanas

SD.PAN   TRAP #3   D0=1B

Mueve una ventana lateralmente

Parámetros de llamada     Parámetros retornados
 
D1.W distancia a mover D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP hace que toda la ventana se mueva lateralmente el número de puntos deseado hacia la izquierda (argumento negativo) o hacia la derecha (argumento positivo). El espacio que se deja se rellena con el color del papel.

SD.PANLN   TRAP #3   D0=1E

Mueve laterlamente la línea del cursor

Parámetros de llamada     Parámetros retornados
 
D1.W distancia a mover D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP hace que se mueva lateralmente la línea del cursor el número de puntos deseado hacia la izquierda (argumento negativo) o hacia la derecha (argumento positivo). El espacio que se deja se rellena con el color del papel. La línea del cursor puede tener 10 ó 20 puntos de altura, dependiendo del tamaño de caracteres seleccionado.

SD.PANRT   TRAP #3   D0=1F

Mueve lateralmente el final de la línea del cursor

Parámetros de llamada     Parámetros retornados
 
D1.W distancia a mover D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP hace que se mueva lateralmente la parte derecha de la línea del cursor el número de puntos deseado hacia la izquierda (argumento negativo) o hacia la derecha (argumento positivo). El espacio que se deja se rellena con el color del papel. La parte derecha incluye el carácter sobre el que está situado el cursor.

7.3.7 Limpiando las ventanas

SD.CLEAR   TRAP #3   D0=20

Limpia toda una ventana

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este TRAP se puede limpiar una ventana completa. Todos los puntos de la ventana se ponen del color del papel. Se pueden limpiar otras partes de la ventana mediante los TRAPs SD.CLRTP, SD.CLRBT, SD.CLRLN y SD.CLRRT que limpian la parte superior, inferior, línea del cursor y final de la línea del cursor. La línea del cursor no se considera en la parte superior ni en la inferior de la ventana.

SD.CLRTP   TRAP #3   D0=21

Limpia la parte superior de una ventana

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este TRAP se puede limpiar la parte superior de una ventana. Todos los puntos del área designada se ponen del color del papel. La línea del cursor hace de división entre la parte superior e inferior de la ventana (pero no está incluida en ninguna de ellas). También se pueden limpiar otras partes de la ventana.

SD.CLRBT   TRAP #3   D0=22

Limpia la parte inferior de una ventana

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este TRAP se puede limpiar la parte inferior de una ventana. Todos los puntos del área designada se ponen del color del papel. La línea del cursor hace de división entre la parte superior e inferior de la ventana (pero no está incluida en ninguna de ellas). También se pueden limpiar otras partes de la ventana.

SD.CLRLN   TRAP #3   D0=23

Limpia la línea del cursor

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este TRAP se puede limpiar la línea del cursor. Todos los puntos del área designada se ponen del color del papel. Se limpia la altura completa del tamaño de carácter (10 ó 20 puntos).

SD.CLRRT   TRAP #3   D0=24

Limpia la parte derecha de la línea del cursor

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Con este TRAP se puede limpiar la parte derecha de la línea del cursor. Todos los puntos de la parte derecha de la línea se ponen del color del papel. Se limpia la altura completa del tamaño del carácter (10 ó 20 puntos).

7.3.8 Cambio del tipo de caracteres

SD.FOUNT   TRAP #3   D0=25

Pone o quita el tipo de caracteres

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 base de los caracteres A1 indefinido
A2 base 2o tipo caracteres A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 DF  dispositivo lleno

Descripción:

Los caracteres que van a salir a la pantalla se almacenan en una matriz de 5×9 puntos dentro de un rectángulo de 6×10. Esto asegura que los caracteres no se tocarán cuando se sitúen en celdas adyacentes. Hay un tipo por defecto y otro alternativo, dentro del QL, pero también se pueden seleccionar juegos de caracteres definidos por el usuario. El juego de caracteres por defecto incluye los códigos ASCII desde $20 a $7F, y el segundo se extiende desde $80 a $BF.

Cuando se cambia el juego, se selecciona el defecto, si la dirección base que se le proporciona es 0. El juego debe almacenarse en memoria en un formato especial. Por debajo de cierto valor, los caracteres serán inválidos ($1F en el defecto). Desde el siguiente valor ($1F en el defecto) son válidos un número determinado de caracteres ($61 en el defecto). El formato es como sigue:

 $00  carácter válido más pequeño (octeto)
 $01  número de caracteres válidos − 1 (octeto)
 $02 a $0A  9 octetos de puntos del 1er carácter válido
 $0B a $13  9 octetos de puntos del 2o carácter válido
 $14 a $1B  etc.

Los puntos válidos se almacenan en los bits 6 al 2 (inclusive) de cada octeto de definición de carácter. La fila superior de cada carácter se deja en blanco, y por lo tanto no se debe almacenar con las otras filas.

Si el carácter no es válido en el primer juego, se usa el segundo. Si tampoco es válido en el segundo, se usa el carácter más bajo del segundo juego.

7.3.9 Poniendo los colores

En el QL disponemos de dos modos de pantalla. El modo 8 es el de más baja resolución, 256×256 puntos con 8 colores más parpadeo. El modo 4 es el de más alta resolución, 512×256 puntos con 4 colores sin parpadeo. Los códigos de los colores son:

colormodo 256modo 512
0negronegro
1azulnegro
2rojorojo
3magentarojo
4verdeverde
5cyanverde
6amarilloblanco
7blancoblanco

Además de los colores anteriores, se pueden crear áreas punteadas con dos colores, dentro de un cuadro de 2×2 puntos. Cuando se crea un área grande de este tipo, el punteado produce un efecto muy interesante.

El color base se coloca siempre en los bits 2 a 0 del octeto de color. Los bits 5 a 3 contienen el XOR del color y la plantilla del punteado. Si el segundo color es cero, el color aparece sólido. Los bits 7 y 6 se usan para indicar la plantilla de punteado, como se ve a continuación:


00sssbbb un punto de (sss XOR bbb) por cada cuatro puntos


01sssbbb barras horizontales de (sss XOR bbb)


10sssbbb barras verticales de (sss XOR bbb)


11sssbbb plantilla ajedrezada

SD.RECOL   TRAP #3   D0=26

Cambia los colores de una ventana

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador lista colores A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Se pueden cambiar los colores de una ventana sin alterar la información que contiene. Este TRAP cambia cada uno de los ocho colores por otros nuevos. Algunos ordenadores cambian los atributos de la pantalla por 'hardaware', lo que permite que cambien los colores rápidamente, sin embargo, en el QL es mucho más lento ya que tiene que cambiar el valor de cada posición de memoria.

La lista para el cambio de color es de ocho octetos de longitud. Contiene los colores requeridos para cada uno de los existentes en la ventana. Cada uno de los colores nuevos debe estar en el rango de 0 a 7. En modo de 4 colores sólo se necesita rellenar los octetos 0, 2, 4 y 6.

SD.SETPA   TRAP #3   D0=27

Pone el color del papel

Parámetros de llamada     Parámetros retornados
 
D1.B color D1 preservado
D2  D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

El controlador de pantalla usa tres colores. Este TRAP se usa para poner el color del papel, que es el color de fondo de la ventana, y es con el que se rellena el espacio que aparece cuando se hace 'scroll', se mueve lateralmente o se limpia la ventana. Ver también SD.SETST y SD.SETIN para conocer la descripción de cada uno de los colores y su uso.

SD.SETST   TRAP #3   D0=28

Pone el color del punteado

Parámetros de llamada     Parámetros retornados
 
D1.B color D1 preservado
D2  D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

El controlador de pantalla usa tres colores. Este TRAP se usa para poner el color del punteado, que es el color que usa el generador de caracteres para resaltar el fondo de palabras o caracteres individuales. Por lo tanto, este color aparecerá siempre que se impriman caracteres en la pantalla. Ver también SD.SETPA y SD.SETIN para conocer la descripción de cada uno de los colores y su uso.

SD.SETIN   TRAP #3   D0=29

Pone el color de la tinta

Parámetros de llamada     Parámetros retornados
 
D1.B color D1 preservado
D2  D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

El controlador de pantalla usa tres colores. Este TRAP se usa para poner el color de la tinta, que es el color que se usa para escribir caracteres y dibujar gráficos. Ver también SD.SETST y SD.SETPA para conocer la descripción de cada uno de los colores y su uso.

7.3.10 Cambio de los atributos de caracteres

SD.SETFL   TRAP #3   D0=2A

Pone el modo parpadeo

Parámetros de llamada     Parámetros retornados
 
D1.B atributo de parpadeo D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP pone el modo parpadeo en los caracteres impresos. Si el atributo que se pasa en el registro D1 es 0, los caracteres se imprimen sin parpadeo, si no es 0, los caracteres que se impriman a continuación serán parpadeantes.

SD.SETUL   TRAP #3   D0=2B

Pone el modo subrayado

Parámetros de llamada     Parámetros retornados
 
D1.B atributo de subrayado D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP pone el modo subrayado en los caracteres impresos. Si el atributo que se pasa en el registro D1 es 0, los caracteres se imprimen sin subrayado, si no es 0, los caracteres que se impriman a continuación serán subrayados.

SD.SETMD   TRAP #3   D0=2C

Pone el modo en carácter o dibujo

Parámetros de llamada     Parámetros retornados
 
D1.W modo D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP permite definir la manera en que se producen los caracteres. Los siguientes modos son válidos:
D1=−1  Se hace XOR de la tinta con el fondo.
D1=0  El fondo del carácter está punteado, se dibuja con el color de la tinta.
D1=1  El fondo del carácter es transparente, por lo que no se puede escribir encima, se dibuja en el color de la tinta.

SD.SETSZ   TRAP #3   D0=2D

Pone el tamaño y espacio del carácter

Parámetros de llamada     Parámetros retornados
 
D1.W ancho carácter / espaciado D1 indefinido
D2.W alto carácter / espaciado D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP se usa para seleccionar el alto, ancho y espacio de los caracteres dentro de su rectángulo. El generador de caracteres soporta directamente dos anchos y altos de estándar. El ancho simple es de 5 puntos en un espacio de 6 u 8 puntos. El doble ancho es de 10 puntos en un espacio de 12 ó 16 puntos. El usuario puede producir otros espacios con controladores propios de pantalla, pero no son soportados directamente por este TRAP. El valor por defecto en modo simple es de 5 puntos en un cuadrado de 6. El valor por defecto en modo doble es de 10 puntos en un espacio de 12. En el modo de 8 colores solamente se pueden usar caracteres de doble ancho. Las llamadas con D1=0 ó 1 en modo de ocho colores aparecerán como si la llamada se hubiera hecho con D1 igual a 2 ó 3, pero no se genera error.

Disponemos de los siguientes anchos/espacio de caracteres:
 0  ancho simple (5 puntos) en espacio de 6
 1  ancho simple (5 puntos) en espacio de 8
 2  ancho doble (10 puntos) en espacio de 12
 3  ancho doble (10 puntos) en espacio de 16

Los siguientes valores son los de altura/espaciado:
 0  altura simple (9 puntos) en espacio de 10
 1  altura doble (18 puntos) en espacio de 20

7.3.11 Relleno de bloques

SD.FILL   TRAP #3   D0=2E

Rellena un bloque rectangular en una ventana

Parámetros de llamada     Parámetros retornados
 
D1.B color D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 base definición bloque A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 OR  el bloque está fuera de la ventana

Descripción:

Este TRAP modifica un bloque rectangular dentro de una ventana. La definición del bloque consiste en 4 palabras en el siguiente formato:

 base  ancho del bloque en puntos
 base+2  alto del bloque en puntos
 base+4  origen X del bloque (relativo al origen de ventana)
 base+6  origen Y del bloque (relativo al origen de ventana)

El color elegido puede escribirse directamente a la pantalla (de forma que cubra todo lo que hay en ella), o hacer XOR con el contenido de la misma. La manera particular de rellenarla se controla mediante el modo de impresión/dibujo que se haya definido con SD.SETMD (TRAP #3 con D0=$2C). También se pueden usar colores con punteado. Se puede conseguir una gran rapidez en el cambio de colores, dentro de un área particular de la ventana, poniendo el modo impresión/dibujo en modo −1 (XOR).

Truco útil: Resulta más rápido dibujar líneas horizontales y verticales con este TRAP que con el de dibujar una línea.

7.3.12 Traps de gráficos

SD.POINT   TRAP #3   D0=30

Dibuja un punto

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador pila aritmética A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP dibuja un punto dentro de una ventana. Opera del mismo modo que el comando POINT de SuperBASIC. Si el punto cae fuera de la ventana, no se dibuja. Los parámetros que necesita se le deben dar en la pila aritmética en formato de coma flotante (apuntado por A1). Se deben asignar por lo menos 240 octetos en la pila antes de llamarlo. Las coordenadas se refieren a un origen arbitrario (0,0 por defecto) con una escala arbitraria (la altura de la ventana por defecto es 100). Todos estos datos se pueden alterar mediante SD.SCALE.

Los parámetros requeridos son:
 0(A1)  coordenada Y
 6(A1)  coordenada X

Tenga en cuenta que 6(A1) significa 6 octetos después del punto que direcciona A1.

SD.LINE   TRAP #3   D0=31

Dibuja una línea

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador pila aritmética A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP dibuja una línea dentro de una ventana. Opera del mismo modo que el comando LINE de SuperBASIC. Si alguna parte de la línea cae fuera de la ventana, ésta no se dibuja. Los parámetros que necesita se le deben dar en la pila aritmética en formato de coma flotante (apuntado por A1). Se deben asignar por lo menos 240 octetos en la pila antes de llamarlo. Las coordenadas se refieren a un origen arbitrario (0,0 por defecto) con una escala arbitraria (la altura de la ventana por defecto es 100). Todos estos datos se pueden alterar mediante SD.SCALE.

Los parámetros requeridos son:
 0(A1)  coordenada Y del final de la línea
 6(A1)  coordenada X del final de la línea
 $C(A1)  coordenada Y del principio de la línea
 $12(A1)  coordenada X del principio de la línea

Tenga en cuenta que 6(A1) significa 6 octetos después del punto que direcciona A1.

SD.ARC   TRAP #3   D0=32

Dibuja un arco

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador pila aritmética A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP dibuja un arco dentro de una ventana. Opera del mismo modo que el comando ARC de SuperBASIC. Si alguna parte de la línea cae fuera de la ventana, ésta no se dibuja. Los parámetros que necesita se le deben dar en la pila aritmética en formato de coma flotante (apuntado por A1). Se deben asignar por lo menos 240 octetos en la pila antes de llamarlo. Las coordenadas se refieren a un origen arbitrario (0,0 por defecto) con una escala arbitraria (la altura de la ventana por defecto es 100). Todos estos datos se pueden alterar mediante SD.SCALE.

Los parámetros requeridos son:
 0(A1)  ángulo del arco
 6(A1)  coordenada Y del final de la línea
 $C(A1)  coordenada X del final de la línea
 $12(A1)  coordenada Y del principio de la línea
 $18(A1)  coordenada X del principio de la línea

Tenga en cuenta que 6(A1) significa 6 octetos después del punto que direcciona A1.

SD.ELIPS   TRAP #3   D0=33

Dibuja una elipse

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador pila aritmética A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP dibuja una elipse dentro de una ventana. Opera del mismo modo que el comando CIRCLE de SuperBASIC. Si alguna parte de la línea cae fuera de la ventana, ésta no se dibuja. Los parámetros que necesita se le deben dar en la pila aritmética en formato de coma flotante (apuntado por A1). Se deben asignar por lo menos 240 octetos en la pila antes de llamarlo. Las coordenadas se refieren a un origen arbitrario (0,0 por defecto) con una escala arbitraria (la altura de la ventana por defecto es 100). Todos estos datos se pueden alterar mediante SD.SCALE.

Los parámetros requeridos son:
 0(A1)  ángulo de rotación
 6(A1)  radio de la elipse
 $C(A1)  excentricidad de la elipse
 $12(A1)  coordenada Y del centro
 $18(A1)  coordenada X del centro

Tenga en cuenta que 6(A1) significa 6 octetos después del punto que direcciona A1.

SD.SCALE   TRAP #3   D0=34

Pone la escala para dibujar en la pantalla

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador pila aritmética A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP es el mismo que el SCALE de SuperBASIC. Permite alterar el factor de escala que usan todos los TRAPs gráficos. Se cambian dos facetas: el origen de los gráficos y la longitud máxima del eje de la X. El TRAP se puede usar para mover la ventana que se está usando alrededor de un espacio de gráficos mucho más amplio. Los parámetros que requiere este TRAP deben estar en la pila aritmética, en formato de coma flotante (apuntados por A1). Se deben asignar 240 octetos de la pila como mínimo antes de llamar a este TRAP.

La altura por defecto es 100 y el origen 0,0.

Los parámetros requeridos son:
 0(A1)  coordenada Y de la línea inferior de la ventana
 6(A1)  coordenada X del punto más a la izquierda
 $C(A1)  longitud del eje X (altura de la ventana)

Tenga en cuenta que 6(A1) significa 6 octetos después del punto que direcciona A1.

SD.FLOOD   TRAP #3   D0=35

Pone o quita el formato de relleno

Parámetros de llamada     Parámetros retornados
 
D1.L octeto de estado D1 indefinido
D2  D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador pila aritmética A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP pone o quita el relleno de gráficos de forma similiar a como lo hace el comando FILL de SuperBASIC. Si se ha puesto el relleno, las formas no reentrables se rellenarán con el color de la tinta a medida que se dibujan. Una vez que la figura ha sido completamente cerrada, se debe volver a llamar a este TRAP para comenzar a rellenar la siguiente figura. El único parámetro especial que se pasa a la rutina es el octeto de estado. Se pone a 0 cuando se quita el relleno de áreas, y a 1 para que funcione.

SD.GCUR   TRAP #3   D0=36

Define la posición del cursor gráfico

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2.L preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 apuntador pila aritmética A1 indefinido
A2  A2 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP es el mismo que el CURSOR de SuperBASIC, con cuatro parámetros. Permite posicionar el cursor gráfico en cualquier parte de la ventana del canal definido. Los parámetros que requiere este TRAP deben estar en la pila aritmética, en formato de coma flotante (apuntados por A1). Se deben asignar 240 octetos de la pila como mínimo antes de llamar a este TRAP. Las coordenadas se refieren a la esquina superior izquierda de la ventana. Los dos primeros parámetros fijan el origen del cursor gráfico, los otros dos colocan el cursor en una posición relativa al primer punto.

Los parámetros requeridos son:
 0(A1)  coordenada gráfica X
 6(A1)  coordenada gráfica Y
 $C(A1)  puntos hacia la derecha
 $12(A1)  puntos hacia abajo

Tenga en cuenta que 6(A1) significa 6 octetos después del punto que direcciona A1.

7.4 TRAPs del sistema de manejo de ficheros

La selección de TRAPs de manejo de ficheros, que se incluye en esta sección de la Utilización de E/S, cubre el manejo general de ficheros. La apertura y cierre de ficheros se trató en el capítulo 6, mientras que la lectura y escritura se hizo en la sección 7.1. Esta sección trata de las estructuras particulares de ficheros y de las utilidades.

Entre las utilidades se han incluido las operaciones necesarias para obtener información sobre el medio de almacenamiento, leer y escribir una cabecera de fichero, y cargar y salvar ficheros completos a y desde memoria.

El nivel de soporte para ficheros estructurados lo proporciona el TRAP de posicionamiento del apuntador. Este apuntador se puede dirigir a cualquier octeto de un fichero, desde donde se puede leer una cadena de octetos de longitud arbitraria (ver 7.1). Con esta facilidad, se puede manejar cualquier estructura de fichero que se requiera. Las bases de datos requieren algún método de asegurarse de que se han escrito todos los datos en el fichero deseado, y de que ya no hacen falta en memoria. Se puede usar este TRAP para liberar la memoria intermedia del fichero y asegurarse de que todos los datos han llegado a su destino.

FS.CHECK   TRAP #3   D0=40

Comprueba todas las operaciones pendientes en un fichero

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP comprueba si se han completado todas las operaciones pendientes en un fichero. Si se han completado, la llamada retorna sin errores; si hay alguna operación pendiente, devuelve el código de error NC (no completado). Esta comprobación es necesaria, ya que cualquier intento de una operación de lectura o escritura a un fichero, o cambio de un apuntador de fichero, hace uso de la memoria intermedia. Esto significa que los bloques físicos requeridos del fichero en cuestión, son transferidos dentro del área de bloques del QL. Este manejo de la memoria intermedia continúa aunque las llamadas que causan la operación retornen completas.

FS.FLUSH   TRAP #3   D0=41

Libera la memoria intermedia de un fichero

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2  D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Esta llamada asegura que todos los datos que hay en el área de bloques de memoria se escriben al fichero correspondiente. Es muy importante que se haga esta llamada en los casos en los que se debe comprobar que se han salvado todos los ficheros, antes de realizar otra operación. No es suficiente asumir que el TRAP se ha completado correctamente, ya que este tipo de retorno no implica que se hayan transferido los datos al fichero correspondiente.

FS.POSAB   TRAP #3   D0=42

Posiciona el apuntador absoluto de un fichero

Parámetros de llamada     Parámetros retornados
 
D1.L posición en el fichero D1.L nueva posición
D2  D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 EF  fin del fichero

Descripción:

Este TRAP nos permite posicionar el apuntador del fichero en un punto determinado del mismo. Si el TRAP retorna con un error de fin de fichero, el apuntador se pone al límite más cercano (que es 0 o el final del fichero).

FS.POSRE   TRAP #3   D0=43

Posiciona el apuntador del fichero relativo a la posición anterior

Parámetros de llamada     Parámetros retornados
 
D1.L desplazamiento apuntador fichero D1.L nueva posición
D2  D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1  A1 indefinido
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 EF  fin del fichero

Descripción:

Este TRAP nos permite posicionar el apuntador del fichero en un punto determinado, relativo a la posición anterior. Si el TRAP retorna con un error de fin de fichero, el apuntador se pone al límite más cercano (que es 0 o el final del fichero). Si se pone este desplazamiento a 0, el TRAP nos devolverá la posición actual en el registro D1. Aunque la llamada retorne como no completada, el apuntador se pondrá, y la tarea continuará cargando el bloque que contiene el siguiente octeto dentro de la memoria.

FS.MDINF   TRAP #3   D0=45

Obtiene información sobre el medio

Parámetros de llamada     Parámetros retornados
 
D1  D1.L sectores vacíos/buenos
D2  D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1 apuntador a 10 octetos de memoria intermedia A1 fin del nombre del medio
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Este TRAP nos proporciona el nombre del medio, el espacio disponible y la capacidad. Para hacer todo esto, se debe abrir el directorio del fichero. El nombre del medio es de 10 octetos de longitud, con espacios a la derecha. A1 debe apuntar a 10 octetos de memoria disponible, antes de hacer la llamada. La palabra más significativa de D1 contiene el número de sectores vacíos, y la menos significativa el número de sectores buenos que contiene el medio. Los sectores son de 512 octetos de longitud.

FS.HEADS   TRAP #3   D0=46

Pone cabecera de fichero

Parámetros de llamada     Parámetros retornados
 
D1  D1.W longitud cabecera
D2  D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1 base bloque cabecera A1 fin definición cabecera
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto

Descripción:

Todos los ficheros tienen una cabecera que contiene información sobre el fichero. Este TRAP prepara los 14 primeros octetos de esta cabecera. El formato estándar para los ficheros con directorio es de 64 octetos de longitud y es el siguiente:

$00longitud del fichero (palabra larga)
$04acceso al fichero (octeto) - es 0 en QDOS v1.03
$05tipo de fichero (octeto). Para ficheros ordinarios y programas BASIC, el tipo de fichero es cero. Para programas ejecutables es 1.
$068 octetos de información dependiente del tipo. Para programas ejecutables (tipo 1), los 4 primeros octetos contienen el tamaño asignado por defecto al espacio de datos del programa.
$0Elongitud del nombre del fichero
$10nombre del fichero (hasta 36 caracteres)
$34reservado para información de fecha (no implementado en las primeras versiones del QL)

Cuando el TRAP trata con dispositivos serie puros, la longitud de la cabecera en D1 será espuria (=15). Esto se debe a que, cuando se mande la cabecera a un dispositivo serie, los 14 octetos de la cabecera van precedidos por un octeto a $FF.

FS.HEADR   TRAP #3   D0=47

Lee la cabecera de un fichero

Parámetros de llamada     Parámetros retornados
 
D1  D1.W longitud cabecera leída
D2.W longitud memoria intermedia D2 preservado
D3.W periodo de espera D3 preservado
 
A0 ID del canal A0 preservado
A1 base de la memoria intermedia de lectura A1 alto de la memoria intermedia de lectura
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NC  no completado
 NO  el canal no está abierto
 BO  rebosamiento de la memoria intermedia

Descripción:

La llamada de lectura de cabecera de fichero se usa para que un job pueda conocer las características más relevantes de un fichero, incluida su longitud. Esta información nos permite asignar espacio suficiente (usando uno de los TRAPs #1) para cargar el fichero.

A1 apunta a la memoria intermedia de lectura que debe tener 14 octetos como mínimo. En el caso de que se use para un dispositivo serie, la longitud de la cabecera retornada en D1 es espuria (=15). A la vuelta del TRAP, la memoria intermedia contendrá la información de la cabecera del fichero.

El apuntador del fichero está diseñado de forma que apunta a la posición cero, que es el primer octeto de datos del fichero. Las fronteras de los bloques en un controlador de directorio estándar están en las posiciones 512*n-64.

FS.LOAD   TRAP #3   D0=48

Carga un fichero en memoria

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2.L longitud del fichero D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 dirección base de carga A1 dirección alta después carga
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NO  el canal no está abierto

Descripción:

Este TRAP permite cargar todo un fichero en memoria. Antes de intentarlo se debe reservar suficiente espacio para él. Si este espacio va a estar en el área de programas transitorios, debe ser asignado mediante un TRAP #1 antes de intentar cargarlo. El periodo de espera debe ser infinito (D3=-1). También es importante asegurarse de que A1 contiene una dirección par, ya que los programas sólo se pueden cargar en frontera de palabra.

FS.SAVE   TRAP #3   D0=49

Salva un fichero desde memoria

Parámetros de llamada     Parámetros retornados
 
D1  D1 indefinido
D2.L longitud del fichero D2 preservado
D3.W periodo de espera D3.L preservado
 
A0 ID del canal A0 preservado
A1 dirección base fichero A1 dirección alta fichero
A2  A2 preservado
A3  A3 preservado

Error devuelto:

 NO  el canal no está abierto
 DF  unidad llena

Descripción:

Este TRAP permite salvar un fichero desde memoria. D3 debe ser puesto a -1 antes de llamarlo, y A1 debe ser par para que se sitúe en frontera de palabra cuando se cargue.


Anterior Tabla de contenidos Siguiente
Asignación de Entrada/Salida   Utilidades por vector