Sinclair QL Programación Avanzada
Anterior Siguiente

8. Utilidades por vector

8.1 Introducción

Nota: Documento por revisar

En esta sección tenemos un gran variedad de rutinas de la ROM que pueden ser usadas en aplicaciones muy diferentes. Las utilidades por vector se llaman así porque se acceden tomando sus direcciones de una tabla de vectores (apuntadores al principio de cada rutina). Esto significa que las rutinas funcionarán en futuras versiones del QDOS a pesar de que se puedan haber cambiado sus direcciones.

Acceso a las rutinas por medio de la tabla de vectores

La tabla de vectores se extiende desde la dirección $C0 de la ROM hasta la $12B. Las entradas son de una palabra y apuntan a la dirección real de inicio de las rutinas correspondientes. Ya que las entradas están formadas por una palabra en vez de dobles palabras, todas las rutinas deben estar en las primeras 32K de memoria. Estas rutinas no comprueban el espacio de la pila, por lo que debe haber por lo menos 64 octetos disponibles para las rutinas ordinarias y 96 para las aritméticas. Para acceder a las rutinas se deben usar las siguientes líneas de código máquina:

MOVE.W aa.aaa,An aa.aaa es el vector
JSR (An) salta a la subrutina en aa.aaa

Si la utilidad pone un código de estado en D0, el registro de estado del 68008 se pondrá de acuerdo con él a su regreso de la rutina.

Estas rutinas se pueden dividir en cinco grandes grupos, definidos por los requerimientos del código que las llama.

Rutinas en Modo Supervisor

En ciertas sutuaciones, el código que no está dentro del QDOS llama a rutinas en modo supervisor. Esto puede ocurrir, por ejemplo, en parte de los controladores de dispositivo usados por los TRAPs #2 o #3. Hay varias reglas a las que se debe atener el código que las llama:

1.El código que las llama debe estar en modo supervisor antes de hacer la llamada.
2.El código que las llama no debe haber sido iniciado por una interrupción.
3.A6 debe apuntar a la base de las variables del sistema.

Hay disponibles las sigientes rutinas en Modo Supervisor:

Vec. Nombre Tipo Descripción

C0 MM.ALCHP SM Asigna área común
C2 MM.RECHP SM Libera área común
E8 IO.SERQ SM Dirige el manejo de las colas
E8 IO.SERIO SM Manejo general de ES


Rutinas de TRAP simplificadas

Hay un grupo de TRAPs que se usan una y otra vez. Para reducir el código requerido para estos TRAPs, donde los parámetros se ajustan a un formato común, se pueden usar las rutinas por vector simplificadas. Estas rutinas aparecen listadas debajo. Todas se deben llamar en modo usuario.

Vec. Nombre Tipo Descripción

C4 UT.WINDW ST Prepara una ventana con el nombre dado
C6 UT.CON ST Prepara una ventana de consola
C8 UT.SCR ST Prepara una ventana de pantalla
CA UT.ERRO ST Escribe un mensaje de error en el canal 0
CC UT.ERR ST Escribe un mensaje de error en otro canal
CE UT.MINT ST Convierte un entero en ASCII
D0 UT.MTEXT ST Manda un mensaje a un canal

Rutinas de utilidad general

Estas rutinas se puden usar desde cualquier código. No hay requisitos especiales.

Vec Nombre Tipo Descripción

D2 UT.LINK GU Conecta un item a una lista
D4 UT.UNLNK GU Desconecta un item de una lista
D8 MM.ALLOC GU Asigna un espacio en el área común
DA MM.LNKFR GU Conecta espacio libre en el área común
DC IO.QSET GU Prepara a una cola
DE IO.QTEST GU Mira el estado de una cola
E0 IO.QIN GU Pone un octeto en una cola
E2 IO.QOUT GU Extrae un octeto de una cola
E4 IO.QEOF GU Pone la marca de EOF en una cola
122 IO.NAME GU Decodifica un nombre de dispositivo

Rutinas de utilidad del BASIC

Las rutinas de utilidad del BASIC están compuestas por rutinas de soporte de procedimientos BASIC y el paquete aritmético. Estas rutinas pueden ser usadas por cualquier código, pero debe asegurarse de que las direcciones pasadas a las rutinas son relativas a A6.

Vec Nombre Tipo Descripción

E6 UT.CSTR BU Compara a dos cadenas
EC CN.DATE BU Toma fecha y hora
EE CN.DAY BU Toma día de la semana
F0 CN.FTOD BU Convierte coma flotante a ASCII
F2 CN.ITOD BU Convierte un entero a ASCII
F4 CN.ITOBB BU Convierte un octeto a ASCII binario
F6 CN.ITOBW BU Convierte una palabra a ASCII binario
F8 CN.ITOBL BU Convierte una palabra larga a ASCII binario
FA CN.ITOHB BU Convierte un octeto hex a ASCII
FC CN.ITOHW BU Convierte una palabra hex a ASCII
FE CN.ITOHL BU Convierte una palabra larga hex a ASCII
100 CN.DTOF BU Convierte ASCII en coma flotante
102 CN.DTOI BU Convierte ASCII en entero
104 CN.BTOIB BU Convierte ASCII en un octeto binario
106 CN.BTOIW BU Convierte ASCII en una palabra binaria
108 CN.BTOIL BU Convierte ASCII a una palabra larga binaria
10A CN.HTOIB BU Convierte ASCII en un octeto hex
10C CN.HTOIW BU Convierte ASCII en una palabra hex
10E CN.HTOIL BU Convierte ASCII en una palabra larga hex
110 BP.INIT BP Procedimiento básico de iniciación
112 CA.GTINT BP Obtiene enteros (palabra)
114 CA.GTFP BP Obtiene coma flotante (6 octetos)
116 CA.GTSTR BP Obtiene cadenas
118 CA.GTLIN BP Obtiene enteros largos (palabra larga)
11A BV.CHRIX BP Reserva espacio en la pila aritmética
11C RI.EXEC BP Ejecuta una operación
11E RI.EXECB BP Ejecuta una lista de operaciones
120 BP.LET BP Retorna valores de parámetros

Rutinas de soporte de microdrives

Las rutinas de soporte de microdrives se han puesto en vectores para simplificar la escritura de utilidades que necesita acceder a determinados sectores (ej. programas de recuperación de ficheros).

Vec. Nombre Tipo Descripción

124 MD.READ MD Lee un sector
126 MD.WRITE MD Escribe un sector
128 MD.VERIN MD Verifica un sector
12A MD.SECTR MD Lee una cabecera de sector

8.2 Rutinas en Modo Supervisor

Las rutinas en modo supervisor se acceden normalmente mediante TRAP#1. Sin embargo, bajo ciertas circunstancias resulta útil poder llamar a estas rutinas desde el código que no está residente en el QDOS. Por ejemplo, controladores de dispositivos que se acceden mediante un TRAP#2, pueden necesitar usar rutinas en modo supervisor. Las que describimos aquí están relaccionadas con el manejo del área común y con ES simple.

El código que las llama debe cumplir las siguientes especificaciones:

1.El código que las llama debe estar en modo supervisor antes de hacer la llamada
2.El código que las llama no debe haber sido iniciado por una interrupción.
3.A6 debe apuntar a la base de las variables del sistema

MM.ALHP VECTOR C0

Asigna espacio en el área común

Parámetros de llamada Parámetros retornados

D1.L espacio requerido D1.L espacio asignado
D2 D2 indefinido
D3 D3 indefinido

A0 A0 base del área asignada
A1 A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

OM no hay memoria

Descripción:

Esta rutina permite asignar área común. El espacio debe ser suficiente para contener una entrada de cabecera (ver Apéndice R). Este espacio extra es de 16 octetos para entradas simples, o de 24 octetos para los canales de IOSS. En A0 le devuelve la dirección base del área común y no la base del área que puede usar (ver TRAP#1 con D0=18 o 19). El espacio asignado en el área común se rellena con ceros. La descripción del área común se da en las secciones 5.2.4 y 5.2.5.

MM.RECHP VECTOR C2

Libera espacio en el área común

Parámetros de llamada Parámetros retornados

D1. D1. indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 Base área a liberar A0 indefinido
A1 A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

ninguno

Descripción:

Esta rutina libera espacio que ha sido asignado previamente en el área común.


IO.SERQ VECTOR E8

Maneja directamente la cola de ES serie

Parámetros de llamada Parámetros retornados

D0 número de rutina D0 error devuelto
D1. valor IOSS estándar D1. Valor IOSS estándar
D2 valor IOSS estándar D2 valor IOSS estándar
D3.W tiempo de espera D3 preservado

A0 ID del canal A0 base del área asignada
A1 valor IOSS estándar A1 valor IOSS estándar
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

BP acción indefinida

Descripción:

Esta es una rutina de manejo directo de colas. Para usarla, es necesario asegurarse que las palabras largas 7 y 8 del bloque de definición de canal (ver página siguiente) apuntan a las colas de entrada y salida respectivamente. Se puede inhibir la entrada, poniendo la palabra larga 7 a ceros, y la salida poniendo la palabra larga 8 a ceros.

El tipo particular de operación que se realiza se define con el contenido del registro D0, como en el TRAP#3. Los valores permitidos para D0 son $00, $01, $02, $03, $05, $07, $46, $47 y $49. Los valores estándar del IOSS (subsistema de entrada/salida) son los que se pasarían a las rutinas asociadas del TRAP#3.

Para acciones indefinidas, IO.SERQ debolverá el ERR.BP (si se pide un TRAP#3 inválido).

Bloque de definición de canal

Cada vez que se abre un canal nuevo, se construye un bloque de definición de canal, donde se mantiene toda la información cpncerniente al mismo, como el controlador de dispositivo que se ha de usar, el job propietario y el número y estado del canal.

CH.LEN $00 4 longitud del bloque
CH.DRIVR $04 4 dirección del controlador
CH.OWNER $08 4 job propietario
CH.RFLAG $0C 4 dirección que se manda cuando se libera espacio
CH.TAG $10 2 ID del canal
CH.STAT $12 1 estado:

0= OK
-1= A1 absoluto
$80= A1 relativo a A6
negativo= esperando

CH.ACTN $13 1 acción almacenada para el job en espera
CH.JOBWT $14 4 ID del job esperando por E/S
*
* definición extendida de canal para manejo de colas serie
*
CH.QIN $18 4 apuntador a cola de entrada (o cero)
CH.QOUT $1C 4 apuntador a cola de salida (o cero)


IO.SERIO VECTOR EA

Manejo general de ES serie

Parámetros de llamada Parámetros retornados

D0 número de rutina D0 error devuelto
D1. valor IOSS estándar D1. valor IOSS estándar
D2 valor IOSS estándar D2 valor IOSS estándar
D3.W tiempo de espera D3 preservado

A0 ID del canal A0 base del área asignada
A1 valor IOSS estándar A1 valor IOSS estándar
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

BP acción indefinida

Descripción:

Esta rutina se usa cuando la rutina IO.SERQ no es suficiente.

Como IO.SERQ, el tipo particular de la operación a realizar se define con el registro D0, como en el TRAP#3. Los valores permitidos para D0 son $00, $01, $02, $03, $05, $07, $46, $47, $48 y $49. Cualquier otro valor hará que devuelva D0=ERR.BP. Los valores estándar de IOSS (subsistema de entrada/salida) se refieren a los valores que se deben pasar a las rutinas del TRAP#3.

IO.SERIO requiere que se le proporcione la dirección de tres rutinas para comprobar, la entrada pendiente, recoger octetos y mandar octetos. Las direcciones de entrada de estas rutinas se deben colocar en tres palabras a continuación de la instrucción CALL, en el siguiente orden:

palabra1 comprueba entrada pendiente (siguiente octeto devuelto en D1)
palabra2 recoger un octeto (octeto en D1)
palabra3 mandar un octeto (octeto en D1)

Puede ser dificil de implementar si se ponen direcciones absolutas, por lo que es mejor poner las direcciones de las rutinas en el bloque de definición física para el controlador (apuntado por el registro A3) cuando se inicializa el controlador de dispositivo. Hay varias maneras de hacerlo. Aquí le doy un par de sugerencias:

Ejemplo 1

código en $28(A3) o posición similar

Hex Nemotécnicos de Ensamblador

387800E8 MOVE.W $E8,A4
4E94 JSR (A4)
DC.L TEST dirección rutina de comprobar
DC.L FETCH dirección rutina de recoger
DC.L SEND dirección rutina mandar
4E75 RTS

Este código se llama con:

JSR $28(A3)


Ejemplo 2

Hex Nemotécnicos de Ensamblador

DC.L TEST dirección rutina de comprobar
DC.L FETCH dirección rutina de recoger
DC.L SEND dirección rutina mandar
4E75 RTS

Este código se llama con:

PEA $28(A3)
MOVE.W $E8,A4
JMP (A4)

Las tres rutinas de servicio deben devolver los códigos de error en D0. Los otros registros D1 a D3 y A1 a A3 pueden ser cambiados.

8.3 Rutinas de TRAP simplificadas

Estas rutinas se usan para operaciones muy comunes. Todas se deben llamar en modo usuario.

UT.WINDW VECTOR C4

Prepara una ventana con el nombre dado

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador al nombre A0 ID del canal
A1 apunt. Bloque parámet. A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

BN nombre de dispositivo inválido
OM no hay memoria
NO no hay canales
OR ventana fuera de la pantalla

Descripción:

Esta rutina abre una ventana usando el nombre suministrado. La sentencia CALL va seguida por un bloque de parámetros de 4 octetos que define el color del borde, el punteado, el papel y la tinta. También se define el ancho del borde.

El formato del bloque de parámetros es:

00 octeto color del borde
01 octeto ancho del borde
02 octeto color papel/punteado
03 octeto color de la tinta

UT.CON VECTOR C6

Prepara una ventana de consola

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 A0 ID del canal
A1 apunt. Bloque parámet. A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

OM no hay memoria
NO no hay canales
OR ventana fuera de la pantalla

Descripción:

Esta rutina abre una ventana de consola. La sentencia CALL va seguida por un bloque de parámetros de 4 octetos y 4 palabras que define el color del borde, el punteado, el papel y la tinta. También se define el ancho del borde, el tamaño de la ventana (se da como origen la esquina superior izquierda), el ancho y la altura de la ventana.

El formato del bloque de parámetros es:

00 octeto color del borde
01 octeto ancho del borde
02 octeto color papel/punteado
03 octeto color de la tinta
04 palabra ancho de la ventana
06 palabra alto de la ventana
08 palabra origen X
0A palabra origen Y


UT.SCR VECTOR C8

Prepara una ventana de pantalla

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 A0 ID del canal
A1 apunt. Bloque parámet. A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

OM no hay memoria
NO no hay canales
OR ventana fuera de la pantalla

Descripción:

Esta rutina abre una ventana de pantalla. La sentencia CALL va seguida por un bloque de parámetros de 4 octetos y 4 palabras que define el color del borde, el punteado, el papel y la tinta. También se define el ancho del borde, el tamaño de la ventana (se da como origen la esquina superior izquierda), el ancho y la altura de la ventana.

El formato del bloque de parámetros es:

00 octeto color del borde
01 octeto ancho del borde
02 octeto color papel/punteado
03 octeto color de la tinta
04 palabra ancho de la ventana
06 palabra alto de la ventana
08 palabra origen X
0A palabra origen Y

UT.ERRO VECTOR CA

Escribe un mensaje de error al canal 0


Parámetros de llamada Parámetros retornados

D0.L Código de error D0.L preservado
D1 D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 ID del canal A0 preservado
A1 A1 preservado
A2 A2 preservado
A3 A3 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina se debe llamar con el número de error, del mensaje que se va a imprimir, en el registro D0. El mensaje de error se imprimirá en el canal 0.

UT.ERR VECTOR CC

Escribe un mensaje de error en un canal dado

Parámetros de llamada Parámetros retornados

D0.L Código de error D0.L preservado
D1 D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 ID del canal A0 preservado
A1 A1 preservado
A2 A2 preservado
A3 A3 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina se debe llamar con el número de error, del mensaje que se va a imprimir, en el registro D0. El mensaje de error se imprimirá en el canal especificado en A0.


UT.MINT VECTOR CE

Convierte un entero a ASCII y lo manda a un canal

Parámetros de llamada Parámetros retornados

D1.W valor entero D1 indefinido
D2 D2 indefinido
D3 D3 -1 (si A0=0, D3=0)

A0 ID del canal A0 preservado
A1 A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

NC no completado (solo para canal 0)
NO el canal no está abierto
DF unidad llena

Descripción:

Esta rutina convierte el entero, pasado en D1, en ASCII. La cadena ASCII resultante se manda al canal especificado en A0. Al final de la cadena ASCII se le añade un espacio.

Las rutinas en modo supervisor de servicio de interrupciones, y UT.ERRO pueden llamra a esta rutina con A0=0. Si se está usando el canal de comandos, la rutina intentará usar el canal 1. Esta operación no está recomendada por Sinclair, pero parece que funciona.

UT.MTEXT VECTOR D0

Manda un mensaje a un canal

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3 -1 (si A0=0, D3=0)

A0 ID del canal A0 preservado
A1 base del mensaje A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

NC no completado (solo para canal 0)
NO el canal no está abierto
DF unidad llena

Descripción:

Esta rutina manda un mensaje a un canal. El mensaje debe estar en un cadena de caracteres apuntada por A1, y debe ir precedido por una palabra que contiene el número de caracteres. Si se requiere, el usuario debe incluir un <LF> al final del mensaje.

Las rutinas en modo supervisor de servicio de interrupciones, llaman a esta rutina con A0=0. Si el canal de comandos está en uso, la rutina intentará usar el canal 1. Esta operación no está recomendada por Sinclair, pero parece que funciona.

8.4 Rutinas de interés general

8.4.1 Manejo de listas encadenadas

UT.LINK VECTOR D2

Conecta un item a una lista

Parámetros de llamada Parámetros retornados

D1 D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 base del item A0 preservado
A1 apuntador item anterior A1 actualizado
A2 A2 preservado
A3 A3 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina conecta un item a una lista encadenada. Se le deben pasar dos parámetros a esta rutina, el primero es la dirección del item que se va a conectar (en A0), el segundo es el apuntador a un item de la lista (en A1). Si este apuntador es al primero de la lista, el nuevo item se conectará al principio. Si no, se conectará después del item al que apunta.

Cuando se prepara una nueva lista, el apuntador al primer item debe ser cero.

Tenga en cuenta que se deben reservar cuatro octetos al principio de cada item, para el apuntador.

Ver en la sección 5.4.5 la descripción de las listas encadenadas.

UT.UNLK VECTOR D4

Desconecta un item de una lista

Parámetros de llamada Parámetros retornados

D1 D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 base del item A0 preservado
A1 apuntador item anterior A1 actualizado
A2 A2 preservado
A3 A3 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina desconecta un item de una lista encadenada. Se le deben pasar dos parámetros a esta rutina, el primero es la dirección del item que se va a desconectar (en A0), el segundo es el apuntador a un item de la lista (en A1). El único requerimiento de este item es que sea el anterior al que va a ser desconectado de la lista. Puede ser también un apuntador al apuntador a la lista encadenada.

Ver en la sección 5.4.5 descripción de las listas encadenadas.

8.4.2 Manejo del area de usuario

MM.ALOC VECTOR D8

Asigna espacio en el área de usuario

Parámetros de llamada Parámetros retornados

D1.L longitud requerida D1.L longitud asignada
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador al apuntador al espacio libre A0 base del área asignada
A1 A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

OM no hay memoria

Descripción:

La asignación del área del usuario, se lleva a cabo en unidades de ocho octetos. Se asignan dos palabras largas por cada espacio en el área. La primera contiene la longitud del espacio y la segunda es un apuntador relativo al siguiente espacio libre. Se usan apuntadores relativos para asegurarse que el área de usuario es reubicable. Se puede usar toda el área asignada, siempre que se recuerde en alguna parte la longitud de los items. Cuando se asigna el área, la primera palabra larga del espacio contiene la longitud del área, de forma que puede ser retenida por el código del usuario si se necesita.

El código de usuario debe mantener un apuntador a la siguiente área de espacio libre. A0 apunta a este apuntador, antes de llamar a esta rutina. Si no queda espacio libre en el área de usuario, este apuntador será cero.

Vea la sección 5.2.5 que se trata de las áreas de usuario. El TRAP del gestor MT.ALLOC es la versión atómica de esta rutina de utilidad.

MM.LNKFR VECTOR DA

Conecta un espacio libre (devuelto) al área de usuario

Parámetros de llamada Parámetros retornados

D1.L longitud requerida D1.L indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 base nuevo espacio A0 indefinido
A1 apuntador al apuntador al espacio libre A1 indefinido
A2 A2 indefinido
A3 A3 indefinido

Error devuelto:

ninguno

Descripción:

Esta rutina permite conectar en el área de usuario, espacios libres devueltos. Estos espacios pueden tener dentro de ellos áreas que se asignaron mediante MM.ALLOC.

Para conectar un área de RAM, se debe conectar un bloque inexistente.

Para expandir un bloque, el área de RAM contígua a la parte alta, se debe conectar a ella. También se puede usar memoria de trabajo propiedad del Job, aunque esto es menos eficiente que usar memoria contígua.

El código de usuario debe mantener un apuntador a la siguiente área de espacio libre. A1 apunta a este apuntador, antes de llamar a esta rutina. Si no hay espacio libre, el puntador debe ser cero.

Vea la sección 5.2.5 donde se habla del área de usuario. El TRAP del gestor MT.LNKFR es la versión atómica de esta rutina.

8.4.3 Rutinas de manejo de colas

IO.QSET VECTOR DC

Prepara una cola

Parámetros de llamada Parámetros retornados

D1. longitud requerida de la cola D1 indefinido
D2 D2 preservado
D3 D3 preservado

A0 A0 preservado
A1 apuntador a la cola A1 preservado
A2 A2 preservado
A3 A3 indefinido

Error devuelto:

ninguno

Descripción:

Esta rutina prepara una cola. La longitud requerida se pasa en D1 y un apuntador a la cola e A2.

En la sección 9.7 puede encontrar una descripción general de las colas de E/S.

Nota: D1 debe ser una palabra larga hasta 32767 como máximo.


IO.QTEST VECTOR DE

Comprueba el estado de una cola

Parámetros de llamada Parámetros retornados

D1. D1. Siguiente octeto
D2 D2 espacio libre
D3 D3 preservado

A0 A0 preservado
A1 A1 preservado
A2 apuntador a la cola A2 preservado
A3 A3 indefinido

Error devuelto:

NC cola vacía
EF se ha llegado al final del fichero

Descripción:

Esta rutina comprueba el estado de una cola. En el registro D2 nos devuelve el espacio libre, y en D1 el siguiente octeto que se va a recoger (el octeto no es recogido por esta rutina). Si la cola está vacía, devuelve ERR.NC.

En la sección 9.7 puede encontrar una descripción general de las colas de E/S.


IO.QIN VECTOR E0

Pone un octeto en la cola

Parámetros de llamada Parámetros retornados

D1. octeto a poner D1. preservado
D2 D2 preservado
D3 D3 preservado

A0 A0 preservado
A1 A1 preservado
A2 apuntador a la cola A2 preservado
A3 A3 indefinido

Error devuelto:

NC la cola está llena

Descripción:

Esta rutina pone un octeto en una cola. El octeto se le pasa en D1.

En la sección 9.7 hay una descripción general de las colas E/S.

IO.QOUT VECTOR E2

extrae un octeto de una cola

Parámetros de llamada Parámetros retornados

D1. D1. Siguiente octeto
D2 D2 preservado
D3 D3 preservado

A0 A0 preservado
A1 A1 preservado
A2 apuntador a la cola A2 preservado
A3 A3 indefinido

Error devuelto:

NC la cola está vacía
EF se la llegado al final del fichero

Descripción:

Esta rutina saca un octeto de una cola. El octeto lo devuelve en D1.

En la sección 9.7 hay una descripción general de las colas de E/S.


IO.QEOF VECTOR E4

Pone un marcador de fin de fichero en una cola

Parámetros de llamada Parámetros retornados

D1. D1. preservado
D2 D2 preservado
D3 D3 preservado

A0 A0 preservado
A1 A1 preservado
A2 apuntador a la cola A2 preservado
A3 A3 indefinido

Error devuelto:

NC la cola está llena

Descripción:

Esta rutina pone un marcador de fin de fichero en una cola.

En la sección 9.7 hay una descripción general de las colas de E/S.


8.4.4 Utilidad de nombre de dispositivo

IO.NAME VECTOR 122

Decodifica un nombre de dispositivo

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador al nombre A0 preservado
A1 A1 indefinido
A1 A1 indefinido
A3 apuntador a parámetros A3 preservado

Error devuelto:

NF no reconocido
BN nombre reconocido, pero parámetros inválidos

Esta rutina es una ayuda muy útil para decodificar los nombres de dispositivos. Comprueba el nombre de dispositivo y evalúa los parámetros adicionales.

ERR.NF retorna directamente a la instrucción siguiente a la llamada, ERR.BN retorna 2 octetos después de la llamada, y si no hubo errores retorna 4 octetos después de la llamada. La descripción del nombre del dispositivo (en ASCII) comienza 6 octetos después de la instrucción de llamada.

8.5 Rutinas de utilidad del SuperBASIC

Las rutinas de utilidad del BASIC pueden ser llamadas desde cualquier código, pero todas las direcciones que se pasan deben ser relativas a A6.

8.5.1 Comparación de cadenas

UT.CSTR VECTOR E6

Compara dos cadenas

Parámetros de llamada Parámetros retornados

D0.B tipo de comparación D0.L -1, 0 +1
D1 D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 base cadena 0 A0 preservado
A1 base cadena 1 A1 preservado
A2 A2 preservado
A3 A3 preservado
A6 dirección base A6 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina compara dos cadenas. La primera cadena está apuntada por (A6, A0) y la segunda por (A6,A1). Después de la llamada, D0 contiene uno de tres posibles valores, -1 si la primera cadena es menor, 0 si son iguales, y +1 si es mayor.

Para hacerse una idea de como trabaja esta rutina, es necesario tener una idea clara de como se comparan las cadenas. Esto es bastante complicado en el QL, ya que existen diferentes opciones de comparación.

Comparaciones

Dos cadenas que se comparan darán uno de los siguientes resultados:

Menor que las cadenas se comparan hasta que se encuentra una diferencia de caracteres (o un segmento de la cadena en caso de números). La primera cadena es menor que la segunda, de acuerdo con un orden definido (ver más adelante).

Igual a todos los caracteres y/o números de las dos cadenas son iguales y están en el mismo orden.

Mayor que las cadenas se comparan hasta que se encuentra una diferencia. El valor de la primera cadena es mayor que el de la segunda de acuerdo con un orden de comparación definido (ver más adelante).

Orden de comparación

Desde el punto de vista del orden de comparación de cadenas, es necesario que podamos clasificarlas en un tipo de orden de directorio. Este orden están bien definido y puede ser modificado seleccionando uno de los cuatro modos.

El espacio está definido como el primer carácter.

Los signos de puntuación van en el orden estándar ASCII, excepto el '.' que es el último.

Todos los signos de puntuación están delante de las letras o dígitos (ej. A? va antes que AA?).

Como una opción especial, los números entre caracteres se comparan por orden numérico (ej. Size6B va antes que Size12B y también Size.12 va antes que Size6.4).

Todos los dígitos o números, van antes que las letras (ej. car1 va antes que cart1).

Una letra mayúscula va delante de la correspondiente minúscula, pero después que la letra minúscula anterior (ej. Car va antes que car pero después de aid).

Como selección especial, se pueden tratar las mayúsculas como equivalentes de la minúsculas.

Resúmen de los ordenes

ESPACIO
!?#$%&()*+.-/:;<=>?@-[\]^_£{|}~'·
Dígitos o números
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxZz

Tenga en cuenta que este orden es para la versión inglesa, para otras versiones puede cambiar ligeramente.

Tipos de comparación

Se pueden seleccionar varios tipos de comparación, dependiendo del tipo de aplicación en la que se use la comparación de cadenas.

Tipo 0 se hace directamente carácter por carácter. Se disstinguen mayúsculas de minúsculas.

Tipo 1 es el mismo que le tipo 0, pero no se diferencian las mayúsculas de las minúsculas.

Tipo 2 en los números embebidos, se usa el orden numérico en la comparación, en vez del código del carácter. Se distingue entre mayúsculas y minúsculas

Tipo 3 es como el tipo 2, pero no se distingue entre mayúsculas y minúsculas.

La comparción de ficheros y nombres de variables usa el tipo 1.

Los operadores BASIC <, <=, =, >=, > y <> usan el tipo 2.

El operador BASIC == (equivalencia) usa el tipo 3.

8.5.2 Rutinas de conversión

CN.DATE VECTOR EC.

Devuelve una cadena ASCII con el día y la hora

Parámetros de llamada Parámetros retornados

D1.L fecha (valor interno) D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 A0 preservado
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 preservado
A3 A3 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina convierte el tiempo en una cadena ASCII en formato de palabra larga. La cadena toma la forma:

aaaa mmm dd hh:mm:ss

donde aaaa es el año, mmm es el mes, dd es día, hh la hora, mm los minutos y ss los segundos. La cadena resultante se pone en la pila a la que apunta A1. Se requieren 22 octetos en la pila.

Ver también CN.DAY que nos da el día de forma similar.

CN.DAY VECTOR EE

Devuelve una cadena ASCII con el día de la semana

Parámetros de llamada Parámetros retornados

D1.L fecha (valor interno) D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 A0 preservado
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 preservado
A3 A3 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina convierte el tiempo en una cadena ASCII en formato de palabra larga con el día de la semana. La cadena toma la forma de la tres primeras letras del día de la semana. La cadena resultante se pone en la pila a la que apunta A1. Se requieren 6 octetos en la pila.

Ver también CN.DAY que nos da el día de forma similar.

CN.FTOD VECTOR F0

Convierte un número de coma flotante en una cadena ASCII

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte un número de coma flotante en la pila (apuntado por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0).

CN.ITOD VECTOR F2

Convierte un entero en una cadena ASCII decimal

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte un número entero en la pila (apuntado por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0), formando un número decimal.


CN.ITOBB VECTOR F4

Convierte un octeto en una cadena ASCII en binario

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte un octeto en la pila (apuntado por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) formando un número binario de 8 caracteres. Por ejemplo, si se convierte el octeti $C5, producirá los caracteres '11000101'.

CN.OTOBW VECTOR F6

Convierte una palabra a una cadena ASCII en binario

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte una palabra en la pila (apuntado por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0), formando un número binario de 16 caracteres.


CN.ITOBL VECTOR F8

Convierte una palabra larga en una cadena ASCII en binario

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte una palabra larga en la pila (apuntada por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0), formando un número binario de 32 caracteres.

CN.ITOHB VECTOR FA

Convierte un octeto en una cadena ASCII hexadecimal

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte un octeto en la pila (apuntado por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0), formando un número hexadecimal de dos dígitos.

CN.ITOHW VECTOR FC

Convierte una palabra en una cadena ASCII en hexadecimal

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte una palabra en la pila (apuntada por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0), formando un número hexadecimal de cuatro dígitos.


CN.ITOHL VECTOR FE

Convierte una palabra larga en una cadena ASCII hexadecimal

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

indefinido

Descripción:

Esta rutina convierte una palabra larga en la pila (apuntada por A1) en una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0), formando un número hexadecimal de ocho dígitos.


CN.DTOF VECTOR 100

Convierte una cadena ASCII de coma flotante en un número de coma flotante

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión (ej 1..0)

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en un número de coma flotante en la pila (apuntado por A1). Si hay error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.


CN.DTOI VECTOR 102

Convierte una cadena ASCII decimal en un entero

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión (ej 1A)

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en un número entero de una palabra larga de longitud en la pila (apuntado por A1). Si hay un error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.


CN.BTOIB VECTOR 104

Convierte una cadena ASCII binaria de 8 bits en un octeto

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión (ej 10110201)

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en un octeto en la pila (apuntado por A1). Si hay error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.

Nota: esta rutina no funciona en QDOS V1.03 y anteriores.

CN.BTOIW VECTOR 106

Convierte cadena ASCII de 16 bits binarios en una palabra

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en una palabra en la pila (apuntado por A1). Si hay un error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.

NOTA: esta rutina no funciona en QDOS V1.03 y anteriores.


CN.BTOIL VECTOR 108

Convierte una cadena ASCII binaria de 32 bits en una palabra larga

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en una palabra larga en la pila (apuntado por A1). Si hay un error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.

NOTA: esta rutina no funciona en QDOS V1.03 y anteriores


CN.HTOIB VECTOR 10A

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión (ej 1E4R)

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en un octeto en la pila (apuntado por A1). Si hay un error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.

NOTA: esta rutina no funciona en QDOS V1.03 y anteriores.

CN.HTOIW VECTOR 10C

Convierte una cadena ASCII de 4 caracteres en una palabra

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en una palabra en la pila (apuntado por A1). Si hay un error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.

NOTA: esta rutina no funciona en QDOS V1.03 y anteriores.


CN.HTOIL VECTOR 10E

Convierte una cadena ASCII de 8 caracteres en una palabra larga

Parámetros de llamada Parámetros retornados

D0 D0 indefinido
D1 D1 indefinido
D2 D2 indefinido
D3 D3 indefinido
D7 0 o apuntador al final de memoria intermedia D7 preservado

A0 apuntador a mem. Int. A0 apuntador a mem. Int.
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 A3 indefinido


Errror devuelto:

XP error en conversión

Descripción:

Esta rutina convierte una cadena de caracteres ASCII en una memoria intermedia (apuntada por A0) en una palabra larga en la pila (apuntado por A1). Si hay un error, A0 y A1 permanecen sin cambio. Si termina correctamente, A0 apunta al siguiente carácter en la memoria intermedia.

NOTA: esta rutina no funciona en QDOS V1.03 y anteriores.


8.5.3 Rutinas de soporte de procedimientos BASIC

Estas rutinas se listan solamente para asegurarse de que la sección de utilidades por vector está completa. Solamente se da una explicación somera de su modo de opración. Para una explicación más detallada de los términos usados y la compresión de su manejo y aplicaciones, refierase al capítulo 10 de Intercomunicación con el SuperBASIC.

BP.INIT VECTOR 110

Inicializa un procedimiento o función en la tabla de nombres del BASIC.

Parámetros de llamada Parámetros retornados

D1 D1 preservado
D2 D2 preservado
D3 D3 preservado

A0 A0 preservado
A1 apunt. Lista definición A1 indefinido
A2 A2 preservado
A3 A3 preservado

Error devuelto:

ninguno

Descripción:

Esta rutina de soporte permite conectar procedimientos o funciones BASIC en la lista de tablas de nombres del BASIC. A1 apunta al principio de la lista de definición de procedimientos antes de llamar a la rutina. Ver sección 10.7.2 para más detalles.ç

CA.GINIT VECTOR 112

Obtiene parámetros enteros del BASIC

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3.W número de argumentos obtenidos
D4 D4 indefinido
D6 D6 indefinido

A0 A0 indefinido
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 apunt. Primer param. A3 preservado
A5 apunt. Último param. A5 preservado

Error devuelto:

BP parámetros inválidos
XP error en la expresión

Descripción:

Esta rutina obtiene un número indeterminado de argumentos de procedimiento enteros (palabra), y los pone en la pila aritmética. A3 apunta al principio de los parámetros y A5 al final de los parámetros. Todas las referencias se deben hacer relativas a A6. Para más detalles ver la sección 10.7.4.


CA.GTFP VECTOR 114

Obtiene parámetros de coma flotante del BASIC

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3.W número de argumentos obtenidos
D4 D4 indefinido
D6 D6 indefinido

A0 A0 indefinido
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 apunt. Primer param. A3 preservado
A5 apunt. Último param. A5 preservado

Error devuelto:

BP parámetros inválidos
XP error en la expresión

Descripción:

Esta rutina obtiene un número indeterminado de argumentos de procedimiento, de coma flotante (6 octetos), y los pone en la pila aritmética. A3 apunta al principio de los parámetros y A5 al final de los parámetros. Todas las referencias se deben hacer relativas a A6. Para más detalles ver la sección 10.7.4.

CA.GTSTR VECTOR 116

Obtiene parámetros de cadena del BASIC

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3.W número de argumentos obtenidos
D4 D4 indefinido
D6 D6 indefinido

A0 A0 indefinido
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 apunt. Primer param. A3 preservado
A5 apunt. Último param. A5 preservado

Error devuelto:

BP parámetros inválidos
XP error en la expresión

Descripción:

Esta rutina obtiene un número indeterminado de argumentos de procedimiento en forma de cadenas (2+n(impar) o 3+n(par) octetos), y los pone en la pila aritmética. A3 apunta al principio de los parámetros y A5 al final de los parámetros. Todas las referencias se deben hacer relativas a A6. Para más detalles ver la sección 10.7.4.

CA.GTLIN VECTOR 118

Obtiene parámetros enteros largos, del BASIC

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido
D3 D3.W número de argumentos obtenidos
D4 D4 indefinido
D6 D6 indefinido

A0 A0 indefinido
A1 apuntador a la pila A1 apuntador a la pila
A2 A2 indefinido
A3 apunt. Primer param. A3 preservado
A5 apunt. Último param. A5 preservado

Error devuelto:

BP parámetros inválidos
XP error en la expresión

Descripción:

Esta rutina obtiene un número indeterminado de argumentos de procedimiento en forma de enteros (palabras largas), y los pone en la pila aritmética. A3 apunta al principio de los parámetros y A5 al final de los parámetros. Todas las referencias se deben hacer relativas a A6. Para más detalles ver la sección 10.7.4.


BV.CHRIX VECTOR 11A

Asigna espacio en la pila aritmética

Parámetros de llamada Parámetros retornados

D1.L #octetos requeridos D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 A0 preservado
A1 A1 preservado
A2 A2 preservado
A3 A3 preservado

Error devuelto:

indefinido

Descripción:

Esta rutina permite asignar espacio en la pila aritmética, para las rutinas de usuario. Las rutinas de obtención de argumentos, reservan por sí mismas suficiente espacio en la pila. En el registro D1 se le pasa el número de octetos que debe asignar. Ver sección 10.7.3 para más detalles.

BP.LET VECTOR 120

Retorna un valor de parámetro al BASIC

Parámetros de llamada Parámetros retornados

D1. D1 indefinido
D2 D2 indefinido
D3 D3 indefinido

A0 A0 preservado
A1 A1 preservado
A2 A2 preservado
A3 apunt. a entr. de tabla A3 apunt. a entr. de tabla

Error devuelto:

BP parámetros inválidos

Descripción:

Esta rutina permite devolver valores a un procedimiento o función a través de una lista de parámetros. Los parámetros deben estar en la pila aritmética, antes de llamarla. Deben estar en la forma requerida por los parámetros de llamada. A3 apuntará a la entrada correspondiente en la tabla de nombres. D0 dará el código de error. Ver sección 10.7.6 para más detalles.

8.5.4 Las rutinas aritméticas

El paquete aritmético del QL se encuentra disponible para ser usado en dos formas. La primera es RI.EXEC que permite realizar una operación simple, como la suma de dos números. La otra forma es RI.EXECB que permite realizar una lista completa de operaciones.

El 68008 es capaz de realizar operaciones aritméticas en octetos, palabras y palabras largas, de forma que no necesita que lo soporten las rutinas aritméticas. Todas las operaciones se realizan en formato de coma flotante. Antes de entrar en particularidades, es neceario comprender unos pocos conceptos básicos.

A diferencia del 68008, no hay registros para almacenar datos, en el paquete aritmético. Todas las operaciones se realizan desde y hacia la pila aritmética. Por ejemplo, si tenemos dos variables BASIC VAL1 y VAL2 almacenadas en cualquier lugar de la memoria, para que se puedan sumar, cada una deber ser copiada desde la memoria a la pila aritmética. Se ejecuta una operación ADD con RI.EXEC y se pone en la pila. Desde donde se puede volcar de nuevo a la memoria.

La pila aritmética opera hacia abajo desde (A6,A1.L). Los valores que se toman son los que hay en lo alto de la pila (llamado TOS) y el valor de debajo (llamado NOS). Algunas operaciones se realizan solamente con el TOS y el resultado se coloca en el lugar que ocupaba esta. Hay otras operaciones que operan con ambos, TOS y NOS.

(A6,A1.L) apunta al TOS mientras que el NOS lo apuntan 6(A6,A1.L). La figura 8.1 nos muestra el formato de la pila.


Figura 8.1 - La pila de coma flotante

Los números de coma flotante en el QL, se almacenan en forma de una palabra larga para la mantisa y dos octetos de exponente (los cuatro bits más significativos van a ceros). Aquí se puede ver:


Figura 8.2 - Formato de almacenamiento de los números de coma flotante.

El valor de coma flotante es:

mantisa * (2^(exponente - $800 - $1F))

El paquete de coma flotante acepta dos tipos de código de operación. Los códigos entre $01 y $30 son operaciones de aritmética real. Los otros códigos se extienden a una palabra negativa entre $FFFF y $FF31 inclusive y son instrucciones de carga y almacenamiento de números en coma flotante en las direcciones dadas por (A6.L+A4.L+((cod.oper OR $FF00) AND $FFEE)). Si el bit cero del código de operación es 0, es de carga. Si es 1, la operación es de almacenamiento. La carga hace que se decremente A6 en 6 octetos y el almacenamiento hace que A1 se incremente en 6. El NOS viejo se convierte en TOS nuevo.

Códigos de operación del paquete aritmético

Cód. Nombre Cambio de A1 Operación

00 RI.TERM
02 RI.NINT +4 busca el entero más cercano a TOS
04 RI.INT +4 trunca TOS en un entero
06 RI.NLINT +2 entero largo más cercano a TOS
08 RI.FLOAT -4 convierte TOS de entero a coma flotante
0A RI.ADD +6 suma TOS a NOS
0C RI.SUB +6 resta TOS de NOS
0E RI.MULT +6 multiplica TOS por NOS
10 RI.DIV +6 divide TOS entre NOS
12 RI.ABS 0 pone TOS en positivo
14 RI.NEG 0 niega TOS
16 RI.DUP -6 duplica TOS
18 RI.COS 0 saca el coseno de TOS
1A RI.SIN 0 saca el seno de TOS
1C RI.TAN 0 saca la tangente de TOS
1E RI.COT 0 saca la cotangente de TOS
20 RI.ASIN 0 saca el arco de TOS
22 RI.ACOS 0 saca el coseno de TOS
24 RI.ATAN 0 saca el arco tangente de TOS
26 RI.ACOT 0 saca el arco cotangente de TOS
28 RI.SQRT 0 extrae la raíz cuadrada de TOS
2A RI.LN 0 saca el logarítmo natural de TOS
2C RI.LOG10 0 saca el logaritmo en base 10 de TOS
2E RI.EXP 0 saca el exponencial de TOS
30 RI.POWFP +6 eleva NOS a la potencia TOS

00 RI.LOAD clave operando, si bit=0 es cargar
01 RI.STORE clave operando, si bit=1 es salvar


RI.EXEC VECTOR 11C

Ejecuta una operación aritmética

Parámetros de llamada Parámetros retornados

D0.W código de operación D0 código de error
D1 D1 preservado
D2 D2 preservado
D3 D3 preservado
D7 debe ser puesto a cero D7 preservado

A0 A0 preservado
A1 apunt. Pila aritmética A1 actualizado
A2 A2 preservado
A3 A3 preservado
A4 apunt. Área variables A4 preservado


Error devuelto:

OV rebasamiento aritmético

Descripción:

Esta rutina permite realizar una operación con el paquete aritmético, como se ha descrito en la primera parte de esta sección. El código de operación se pasa como una palabra en D0. A1 apunta a la pila aritmética. A4 apunta a la base del área de variables. Tenga en cuenta que, en el QDOS V1.03 y anteriores, se debe poner el registro D7 a ceros.

RI.EXECB VECTOR 11E

Ejecuta una lista de operaciones aritméticas

Parámetros de llamada Parámetros retornados

D1 D1 preservado
D2 D2 preservado
D3 D3 preservado
D7 debe ser puesto a cero D7 preservado

A0 A0 preservado
A1 apunt. Pila aritmética A1 actualizado
A2 A2 preservado
A3 apunt. Lista operaciones A3 preservado
A4 apunt. Área variables A4 preservado


Error devuelto:

OV rebasamiento aritmético

Descripción:

Esta rutina permite realizar una lista de operaciones con el paquete aritmético, como se ha descrito en la primera parte de esta sección. Los códigos de operación se pasan como una tabla de octetos, apuntada por A3. A1 apunta a la pila aritmética. A4 apunta a la base del área de variables. Tenga en cuenta que, en el QDOS V1.03 y anteriores, se debe poner el registro D7 a ceros.

8.5.5 SINH como función residente

Este programa de ejemplo nos muestra cómo usar las utilidades que se han descrito al principio de esta sección. Vamos a construir una función residente para calcular el valor de SINH(x) donde 'x' es un valor de coma flotante.

Ahora nos vamos a referir al listado del programa SINH al final de esta subsección.

Se llama a la rutina de inicialización de un procedimiento BASIC. Esto hace que se encadene a la lista de procedimiento/función del BASIC, el bloque de definición de procedimiento en PROC_TAB. Una vez iniciado de esta forma, podemos acceder a la rutina SINH como si fuera otra función de BASIC.

Una vez se ha entrado la rutina SINH, asigna espacio en la pila aritmética, para 12 números de coma flotante (usando BV.CHRIX). Los parámetros que se pasan a la función se pueden obtener usando CA.GTFP. En este paso, dará un error si le pasamos más, o menos, de un parámetro.

El algoritmo estándar para calcular la función SINH es:

sinh x = (e^x - e^-x))/2

Ahora debemos preparar la pila aritmética para poner en ella todos los valores requeridos. Si al parámetro le llamamos 'X', ponemos 'X', '1.8' y '0.5' en la pila. Las dos constantes se usarán más adelante.

La secuencia de operaciones que realiza el paquete aritmético es:

carga X en Tos
toma el exponencial de TOS
carga 1.0 en TOS
carga exp(X) en TOS
divide NOS por TOS para generar exp(-X)
resta NOS de TOS
carga 0.5 en la pila en TOS
multiplica TOS por NOS
pone TOS de vuelta en X
y retaura A1

En este punto tenemos el resultado de SINH(X) en lo alto de la pila, de modo que devolvemos este valor como el valor de la función, A1 (apuntador a la pila) se almacena en BV_RIP.

*
* SINH
*
BP.INIT EQU $110
CA.GTFP EQU $114
BV.CHRIX EQU $11A
RI.EXECB EQU $11E
RI.SUB EQU $0C
RI.MULT EQU $0E
RI.DIV EQU $10
RI.EXP EQU $2E
RI.STORE EQU $1
*
BV_RIP EQU $58
*
ERR.BP EQU -15
*
LEA PROC_TAB(PC),A1 carga dirección procedimiento
MOVE.W BP.INIT,A2 tabla definición y añadelo
JSR (A2) a la tabla de BASIC
MOVEQ #0,D0 retorno sin error
RTS
*
PROC_TAB
DC.W 0 No procedimientos
DC.W 0 fin procedimientos
DC.W 1 una función
DC.W SINH-*
DC.B 4,'SINH',0 5 octetos + 0 para alinear
DC.W 0 fin de funciones
*
* función SINH
*
SINH
MOVEQ #72,D1 reserva espacio para 12
MOVE.W BV.CHRIX,A2 números de coma flotante
JSR (A2)
*
MOVE.W CA.GTFP,A2 toma uno de los números
JSR (A2) de coma flotante
BNE.S SINH_RTS .... hooop
SUBQ.W #1,D3 pero solo queremos uno
BNE.S ERR_BP
*
LEA 6(A1),A4 alto del apuntador de pila
CLR.W -2(A6,A1.L) pon 1.0
MOVE.L #08014000,-6(A6,A1.L)
CLR.W -8(A6,A1.L) pon 0.5
MOVE.L #08004000,-12(A6,A1.L)
SUB.W #12,A1
LEA OP_TAP(PC),A3 prepara tabla de operaciones
MOVE.W RI.EXECB,A2 usa paquete aritmético
JSR (A2)
*
ADD.W #12,A1 limpia pila aritmética
MOVE.L A1,BV_RIP(A6)
MOVEQ #2,D4 y pone tipo
SINH_RTS
RTS
ERR_BP
MOVEQ #ERR.BP,D0
RTS
*
* contenido de la pila RI
*
RIS_VAL EQU -6
RIS_1.0 EQU -12
RIS_0.5 EQU -18
RIS_EXP EQU -24
*
OP_TAB
DC.B RIS_VAL Pila x
DC.B RI.EXP exp(x)
DC.B RIS_1.0 exp(x),1.0
DC.B RIS_EXP exp(x),1.0,exp(x)
DC.B RI.DIV exp(x),exp(-)
DC.B RI.SUB exp(x)-exp(-x)
DC.B RIS_0.5 exp(x)-exp(-x),0.5
DC.B RI.MULT (exp(x)-exp(-x))/2
DC.B RIS_VAL+RI.STORE
DC.B 0

8.6 Rutinas de soporte de microdrives

Normalmente se accede a los datos almacenados en los microdrives a través del sistema redireccionable de ES. El manejo general de ficheros y el acceso de datos, se deben realizar a través del IOSS. Sin embargo, en ciertas aplicaciones es necesario tener un mayor control de la lectura y escritura de datos en los microdrives. El QDOS no proporciona una selección de rutinas para este tipo de aplicaciones.

Probablemente encontrará útil referirse al apéndice D antes de leer el resto de esta sección.

Ya que no es posible posicionar la cabeza del microdrive en un sector particular de la cinta, es necesario encontrar la posición correcta leyendo los datos de la cinta. La secuencia que se sigue para encontrar un sector es:

1.selecciona la unidad requerida
2.para cada sector requerido;
lee las cabeceras de sector hasta que encuentra el que está buscando
realiza la operación requerida en 100us (escribir) o 2ms (leer/verificar)
3.libera la unidad

Las siguientes secciones describen cada una de estas operaciones en detalle. Las variables del sistema y los registros 'hardaware' usados en las rutinas son:

SV_TMODE $A0 copia y transmite el registro de modo

SV_MDRUN $EE = 0 si mdv está en marcha, si no, = # unidad

PC_TCRL $18002 trasmite registro de control
bits 0-2 velocidad de transmisión
bits 3,4 modo de transmisión (10=microdrive selecc.)
bit 7 salida directa

PC_MCTRL $18020 registro de control de microdrive
bit 0 selecciona bit de microdrive
bit 1 selecciona reloj microdrive
bit 2 0=leer, 1=escribir
bit 3 1=modo borrado

Una rutina para seleccionar y deseleccionar puede ser esta:

SELECT MOVEQ #3,D2 reloj alto/bit selcc. puesto
SUBQ.W #1,D1
BRA.S SEL_LOOP
*
DESELECT MOVEQ #2,D2 reloj alto/bit selecc. quitado
MOVEQ #7, D1
*
SEL_LOOP MOVE.B D2,(A3) reloj alto
MOVEQ #60,D0 espera
ROR.L D0,D0 ..... 150 ciclos (20us)
AND.B #1,D2 reloj bajo
MOVE.B D2,(A3)
MOVEQ #60,D0 espera
ROR.L D0,D0 ..... 150 ciclos (20us)
MOVEQ #2,D2 reloj alto de nuevo
DBRA D1,SEL_LOOP
RTS

8.6.1 Seleccionar un microdrive

Para seleccionar un microdrive particular, se debe usar la siguiente secuencia:

entrar en modo supervisor
poner en A6 la base de las variables del sistema (MT.INF)
esperar a que pare el mdv (SV_MDRUN (A6)=0)
inhabilitar interrupciones
esperar al menos 250ms para limpiar trasmisión serie
cargar $18020 en A3
ponerse en modo microdrive, ej.:

MOVEQ #$E7,D0 desenmascarar modo trasmisión
AND.B SV_TMODE(A6),D0 ... desde modo compuesto
OR.B #$10,D0 poner modo microdrive
MOVE.B D0,-$1E(A3) .... en chip de periféricos
MOVE.B D0,SV_TMODE(A6) ... y en variables sistema

cargar en D1.W el número del microdrive requerido llamar a la rutina SELECT

8.6.2 Buscar un sector

En D1.W ponemos el número del sector que buscamos, y en A3 cargamos $18020 (registro de control microdrive).

SEARCH MOVE.W $1000,D0 hacer 1000 intentos
*
SEARCH_LOOP MOVEM.W D0/D1,-(SP)
*
SEARCH_LI MOVE.W $12A,A2 llama a MD.SECTR
JSR $4000(A2)
BRA.S BAD_MEDIUM devol. error medio erróneo
BRA.S SEARCH_LI devol. no cabecera sector
MOVEM.W (SP)+,D0/D1 sector correcto?
DBEQ D0,SEARCH_LOOP
RTS

La rutina SEARCH devuelve EQ si se ha encontrado el sector, en si no se ha encontrado. En este punto es en donde se debe usar una de las rutinas de leer, escribir o verificar.

8.6.3 Deseleccionar u microdrive

Se debe usar la siguiente secuencia para deseleccionar un microdrive determinado:

llamar a DESELECT
quitar el modo; ej.

MOVEQ #$E7,D0 desenmascarar modo trasmisión
AND.B SV_TMODE(A6),D0 ... desde modo compuesto
MOVE.B D0,-$1E(A3) ... en chip de periféricos
MOVE.B D0,SV_TMODE(A6) .... y en variables sistema

Poner modo usuario y habilitar interrupciones


MD.READ VECTOR 124

Lee un sector de un microdrive

Parámetros de llamada Parámetros retornados

D1 D1 número de fichero
D2 D2 número de bloque

D7 D7 indefinido

A0 A0 indefinido
A1 apuntador al final de la memoria intermedia A1 apuntador al final de la memoria intermedia
A2 A2 indefinido
A3 $18020 A3 $18020

Error devuelto:

normal = ha fallado
retorno+2 = OK

Descripción:

Esta rutina lee un sector de un microdrive. Todos los registros, excepto A3 y A6, son volátiles. A3 debe apuntar al registro de control de microdrive, a la entrada, y se deben inhabilitar las interrupciones. A la vuelta, no se pone D0, pero tiene dos posibles retornos; el normal que implica que ha fallado la lectura, y el normal más dos que indica que ha leido correctamente.

El vector de esta rutina apunta $4000 octetos antes del código real. Se puede usar el siguiente código para invocarla:

MOVE.W aa.aaaa,An
JSR $4000(An)
RET1.W si retorna en este punto, ha fallado
RET2.W si retorna aquí, ha leido correctamente

MD.WRITE VECTOR 126

Escribe un sector en un microdrive

Parámetros de llamada Parámetros retornados

D1 D1 indefinido
D2 D2 indefinido

D7 D7 indefinido

A0 A0 indefinido
A1 apuntador al final de la memoria intermedia A1 apuntador al final de la memoria intermedia
A2 A2 indefinido
A3 $18020 A3 $18020

Error devuelto:

ninguno

Descripción:

Esta rutina escribe un sector de un microdrive. Todos los registros, excepto A3 y A6, son volátiles. A3 debe apuntar al registro de control de microdrive, a la entrada, y se deben inhabilitar las interrupciones. Antes de llamar MD.WRITE, el apuntador de la pila debe apuntar a dos palabras; la primera es el número de fichero, y la segunda el número de bloque del sector que se está escribiendo.

El vector de esta rutina apunta $4000 octetos antes del código real. Se puede usar el siguiente código para invocarla:

MOVE.W aa.aaaa,An
JSR $4000(An)


MD.VERIN VECTOR 128

Verifica un sector de un microdrive

Parámetros de llamada Parámetros retornados

D1 D1 número de fichero
D2 D2 número de bloque

D7 D7 indefinido

A0 A0 indefinido
A1 apuntador al final de la memoria intermedia A1 apuntador al final de la memoria intermedia
A2 A2 indefinido
A3 $18020 A3 $18020

Error devuelto:

normal = ha fallado
retorno+2 = OK

Descripción:

Esta rutina verifica un sector de un microdrive. Todos los registros, excepto A3 y A6, son volátiles. A3 debe apuntar al registro de control de microdrive, a la entrada, y se deben inhabilitar las interrupciones. A la vuelta, no se pone D0, pero tiene dos posibles retornos; el normal que implica que ha fallado la lectura, y el normal más dos que indica que ha leido correctamente.

El vector de esta rutina apunta $4000 octetos antes del código real. Se puede usar el siguiente código para invocarla:

MOVE.W aa.aaaa,An
JSR $4000(An)
RET1.W si retorna en este punto, ha fallado
RET2.W si retorna aquí, ha leido correctamente


MD.SECTR VECTOR 12A

Lee una cabecera de sector de un microdrive

Parámetros de llamada Parámetros retornados

D1 D1
D2 D2

D7 D7 número de sector

A0 A0 indefinido
A1 apuntador al final de la memoria intermedia A1 apuntador al final de la memoria intermedia
A2 A2 indefinido
A3 $18020 A3 $18020

Error devuelto:

normal = medio inválido
retorno+2 = cabecera de un sector inválida
retorno+4 = OK

Descripción:

Esta rutina lee una cabecera de sector de un microdrive. Todos los registros, excepto A3 y A6, son volátiles. A3 debe apuntar al registro de control de microdrive, a la entrada, y se deben inhabilitar las interrupciones. A la vuelta, no se pone D0, pero tiene dos posibles retornos; el normal que indica que el medio está mal, el normal más dos que implica que la cabecera del sector está mal, y el normal más 4 que indica que ha leido correctamente.

El vector de esta rutina apunta $4000 octetos antes del código real. Se puede usar el siguiente código para invocarla:

MOVE.W aa.aaaa,An
JSR $4000(An)
RET1.W si retorna en este punto, medio erróneo
RET2.W si retorna aquí, cabecera inválida
RET3.W si retorna aquí, ha leido correctamente


Anterior Tabla de contenidos Siguiente
Utilidades de Entrada/Salida   Controladores de dispositivo