Página Tres

Las ubicaciones 768 a 831 ($300 a $33F) se utilizan para el manejador de dispositivos y vectores a las rutinas del manejador (dispositivos S:, P:, E:, D:, C:, R: y K:). Un manejador de dispositivo es una rutina utilizada por el sistema operativo para controlar la transferencia de datos en ese dispositivo en particular para la tarea asignada (como leer, escribir guardar, etc.).


Decimal HexadecimalNombreDescripción
768$300DDEVIC

ID del bus de serie del dispositivo (tipo de dispositivo de serie) establecido por el manejador, no modificable por el usuario. Los valores son:


  • Unidades de disco D1 al D4 49–52 ($31-$34)
  • Impresora P1 64 ($40)
  • Impresora P2 79 ($4F)
  • Puertos RS232 R1 al R4 80–83 ($50-$53)
769$301DUNITNúmero de unidad de disco o dispositivo: de uno a cuatro, configurado por el usuario.
770$302DCOMND

El número de la operación de disco o dispositivo (comando) que se realizará, establecido por el usuario o por el controlador del dispositivo antes de llamar a SIO. Los comandos del bus serie son:


  • Leer 82 ($52)
  • Escribe (con verificar) 87 ($57)
  • Estatus 83 ($53)
  • Poner (sin verificar) 80 (0)
  • Formato 33 ($21)
  • Descargar 32 ($20)
  • Leer dirección 84 ($54)
  • Leer giro 81 ($51)
  • Motor encencido 85 ($55)
  • Verificar sector 86 ($56)

Todos los anteriores son comandos de dispositivo de disco, excepto escribir y estatus, que también son comandos de impresora (sin verificación).

771$303DSTATSEl código de estado al regresar al usuario. También se usa para establecer la dirección de los datos; si el dispositivo debe enviar o recibir una trama de datos. El controlador de dispositivos utiliza este byte para indicar a SIO qué hacer después de enviar y confirmar la trama de comando. Antes de la llamada SIO, el controlador examina el BIT 6 (uno es igual a recibir datos) y el BIT 7 (uno es igual a enviar datos). Si ambos bits son cero, entonces no hay transferencia de datos asociada con la operación. Ambos bits establecidos en uno no son válidos. SIO lo usa para indicar al controlador el estado de la operación solicitada después de la llamada SIO.
772, 773$304, $305DBUFLO/HIDirección de búfer de datos del origen o destino de los datos que se van a transferir o la información de estado del dispositivo (o los datos del sector del disco). Establecido por el usuario, no es necesario establecerlo si no hay datos transferidos, como en una solicitud de estado.
774$306DTIMLOEl valor de tiempo de espera para el controlador en unidades de un segundo, proporcionado por el controlador para que SIO lo use. El valor de tiempo de espera del casete es 35, poco más de 37 segundos. Los valores del temporizador son 64 segundos por 60 unidades de medida. Inicializado a 31.
775$307DUNUSEByte no utilizado.
776, 777$308, $309DBYTLO/HIEl número de bytes transferidos hacia o desde el búfer de datos (o del disco) como resultado de la operación más reciente, establecida por el controlador.
También se utiliza para el conteo de datos de sectores defectuosos. Hay un pequeño error en SIO que provoca acciones incorrectas del sistema cuando el último byte en un búfer está en una ubicación de memoria que termina en $FF, como $A0FF.
778, 779 $30A, $30BDAUX1/2

Se utiliza para información específica del dispositivo, como el número de sector del disco para la operación de lectura o escritura. Cargado hasta las posiciones 572, 573 ($23C, $23D) por SIO.


Sólo hay cinco comandos soportados por el manejador de disco: GET sector (82; $52), PUT sector (80; $50), PUT sector con VERIFY (87; $57), STATUS request (83; $53) y FORMAT entire disk (33; $21). No hay comando para FORMATAR una porción del disco; esto lo hace el chip formateador/controlador INS 1771–1 en la propia unidad y no es accesible al usuario. Hay una nueva ROM de unidad de disco para reemplazar la actual versión «C». Se trata de la ROM «E». No sólo es más rápida que las ROMs anteriores, sino que también permite formatear sectores del disco de forma selectiva. Atari aún no ha anunciado si esta nueva ROM 810 estará disponible. Para más información, consulte el Manual del usuario del sistema operativo.


Las posiciones 780 a 793 ($30C a $319) son para usos varios.
Las posiciones 794 a 831 ($31A a $33F) son tablas de direcciones de manejadores. Para utilizar estos DCBs, el usuario debe proporcionar los parámetros requeridos a este bloque y luego hacer un JSR en lenguaje de máquina a $E453 (58451) para E/S de disco o $E459 (58457; el punto de entrada SIO) para otros dispositivos.

780, 781$30C, $30DTIMER1Valor inicial del temporizador de velocidad en baudios.
782$30EADDCORIndicador de corrección de adición para los cálculos de velocidad de transmisión que implican los registros de temporizador.
783$30FCASFLGModo casete cuando está activado. Utilizado por SIO para controlar el flujo del programa a través del código compartido. Cuando se pone a cero, la operación actual es una operación SIO estándar; cuando es distinto de cero, es una operación de casete.
784, 785$310, $311TIMER2alor final del temporizador. El temporizador uno y el temporizador dos contienen tiempos de referencia para el inicio y el final del periodo de recepción del patrón de bits fijo. El primer byte de cada temporizador contiene el valor VCOUNT (54283; $D40B), y el segundo byte contiene el valor actual del reloj en tiempo real de la posición 20 ($14). La diferencia entre los valores del temporizador se utiliza en una tabla de búsqueda para calcular el intervalo de los nuevos valores para la velocidad de transmisión que se pasa a la posición 750, 751 ($2EE, $2EF).
786, 787$312, $313TEMP1Registro de almacenamiento temporal de dos bytes utilizado por SIO para el cálculo de VCOUNT durante las rutinas del temporizador de baudios. Ver ubicación 54283 ($D40B).
788$314TEMP2Registro de almacenamiento temporal.
789$315TEMP3Registro de almacenamiento temporal.
790$316SAVIOGuarda el puerto de entrada de datos serie utilizado para detectar, y actualizado después de, la llegada de cada bit. Se utiliza para retener el estado del BIT 4 de la posición 53775 ($D20F; registro de entrada de datos serie).
791$317TIMFLGIndicador de tiempo de espera para la corrección de la tasa de baudios, utilizado para definir un valor de tasa de baudios fallido. Inicialmente se establece en uno, y se decrementa durante la operación de E/S. Si llega a cero (después de dos segundos) antes de que se lea el primer byte del registro de casete, se abortará la operación.
792$318STACKPRegistro de puntero de pila SIO. Apunta a un byte de la pila que se está utilizando en la operación actual (ubicaciones 256 a 511; $100 a $1FF).
793$319TSTATTitular temporal del estatuto para la localidad 48 ($30).
794, 831$31A, $33FHATABS

Tabla de direcciones de gestores. Se reservan 38 bytes para un máximo de 12 entradas de tres bytes por manejador, los dos últimos bytes se ponen a cero. En el arranque, la tabla HATABS se copia desde ROM.
Los dispositivos que se van a arrancar, como la unidad de disco, añaden la información de su manejador al final de la tabla. Cada entrada tiene el nombre del dispositivo (C,D,E,K,P,S,R) en código ATASCII y la dirección del manejador (LSB/MSB). Los bytes no utilizados se ponen a cero. FMS busca en HATABS desde la parte superior una entrada «D:» de dispositivo, y cuando no la encuentra, entonces establece el vector de dispositivo al final de la tabla para que apunte al vector FMS en 1995 ($7CB). CIO busca un carácter manejador de abajo hacia arriba. Esto permite que los nuevos handlers tengan prioridad sobre los antiguos. Al pulsar RESET se borran de HATABS todas las entradas de handlers excepto las residentes.


  • 794 $31A ID del dispositivo de impresión (P:), inicializado a 58416 ($E430).
  • 797 $31D ID de dispositivo de casete (C:), inicializado a 58432 ($E440).
  • 800 $320 ID del editor de pantalla (E:), inicializado a 58368 ($E400).
  • 803 $323 ID manejador de pantalla (S:), inicializado a 58384 ($E410).
  • 806 $326 ID de manejador de teclado (K:), inicializado a 58400 ($E420).

HATABS puntos de entrada no utilizados:
809 ($329), 812 ($32C), 815 ($32F), 818 ($332), 821 ($335), 824 ($338), 827 ($33B), y 830 ($33E). Estos se numeran secuencialmente del uno al ocho. Sólo hay dos bytes en la última entrada (sin usar), ambos puestos a cero. Cuando DOS está presente, añade una entrada a la tabla con el código ATASCII para la letra «D» y un vector a la dirección 1995 ($7CB).


El formato de la tabla HATABS es:


  • Nombre del dispositivo
  • Dirección de la tabla de vectores
  • Más entradas
  • Relleno cero hasta el final de la tabla

La entrada anterior de la tabla de direcciones del manejador de dispositivo para el manejador específico apunta al primer byte (byte bajo/byte alto) de la tabla de vectores que comienza en 58368 ($E400). Cada manejador está diseñado con el siguiente formato:


  • vector OPEN
  • vector CLOSE
  • vector GET BYTE
  • vector PUT BYTE
  • vector GET STATUS
  • Vector SPECIAL
  • Saltar al código de inicialización (JMP LSB/MSB)

CIO utiliza la ZIOCB (ver ubicación 32; $20) para pasar parámetros a la IOCB de origen, los registros A, Y y X y CIO. Es posible agregar su propio controlador de dispositivo (s) a OS siguiendo estas reglas:


  1. Cargue su rutina, con los buffers necesarios en la dirección apuntada por MEMLO: localización 743 ($2E7).
  2. Añade el tamaño de tu rutina al valor de MEMLO y vuelve a introducir el resultado en MEMLO.
  3. Guarda el nombre y la dirección de tu controlador en la tabla de direcciones de manejadores; HATABS.
  4. Cambie los vectores para que el SO vuelva a ejecutar los pasos anteriores si se ha pulsado RESET. Esto se hace normalmente ajustando las posiciones 12 ($C: DOSINIT) y 10 ($A; DOSVEC).

Ver las columnas «Insight: Atari» en COMPUTE!, enero y abril de 1982, para más detalles. El programa APX «T: A Text Display Device» es un buen ejemplo de aplicación manejadora de dispositivos.
Ver De Re Atari para más información sobre el DCB y HATABS, incluyendo el uso de un manejador null.


Las posiciones 832 a 959 ($340 a $3BF) están reservadas para los ocho IOCB's (bloques de control de entrada/salida). Los IOCB's son canales para la transferencia de información (bytes de datos) dentro y fuera del Atari, o entre dispositivos.
Se utilizan para decirle al ordenador qué operación realizar, cuántos datos mover y, si es necesario, dónde se encuentran los datos a mover. Cada bloque tiene 16 bytes reservados para él.


¿Qué es un IOCB? Cada vez que imprimes algo en la pantalla o en la impresora, cada vez que cargas o guardas un fichero, cada vez que ABRES un canal, estás utilizando un IOCB. En algunos casos, las operaciones tienen funciones automáticas de abrir y cerrar incorporadas (como LPRINT). En otros, debes decirle al Atari que haga cada paso según lo necesites. Algunos IOCB's están dedicados a un uso específico, como el cero para la visualización en pantalla. Otros pueden usarse para cualquier función de E/S que desee. La información que colocas después del comando OPEN le dice a CIO cómo quieres que se transfieran los datos hacia o desde el dispositivo. Es SIO y los manejadores que hacen la transferencia real de datos.


Puedes fácilmente hacer POKE de los valores necesarios en las posiciones de memoria y usar una subrutina en lenguaje de máquina a través de una función USR para llamar al CIO directamente (sin embargo, aún debes usar una sentencia OPEN y CLOSE para el canal). Esto es útil porque BASIC sólo soporta transferencia de datos de registro o de un solo byte, mientras que el CIO manejará E/S de buffer completo. Vea la dirección de entrada del CIO, ubicación 58454 ($E456), para más detalles. Estos bloques se utilizan de la misma manera que la página cero IOCB (localizaciones 32 a 47; $20 a $2F). El SO toma la información aquí, la mueve a la ZIOCB para ser usada por la ROM CIO, luego devuelve la información actualizada al área de usuario cuando termina la operación.


Note que cuando BASIC encuentra un comando DOS, CIERRA todos los canales excepto el cero. Consulte el Manual de Hardware Atari y el Manual de Interfaz 850 para un uso más detallado de estas localizaciones.


Decimal HexadecimalNombreDescripción
832, 847$340,$34FIOCB0

Bloque de control de E/S (IOCB) cero. Normalmente se usa para el editor de pantalla (E:). Puedes hacer POKE 838,166 y POKE 839,238 y enviar todo a la impresora en vez de a la pantalla (POKE 838,163, y POKE 839,246 para enviar todo de nuevo a la pantalla).
Puedes usar esto en un programa para alternar entre la pantalla y la copia impresa cuando el usuario lo solicite. Esto te ahorrará múltiples codificaciones PRINT y LPRINT.
También puede utilizar estas ubicaciones para transferir datos a otros dispositivos, ya que apuntan a la dirección de la rutina «poner un byte» del dispositivo. Consulte el Manual del Sistema Operativo para más información. A la posición 842 se le puede dar el valor 13 para leer de la pantalla y 12 para escribir en la pantalla. POKE 842,13 pone al Atari en «modo tecla RETURN» ajustando el byte auxiliar uno (ICAX1) a entrada y salida de pantalla. POKEando 842 con 12 lo devuelve al modo de entrada de teclado y salida de pantalla. El primer modo permite el uso dinámico de la pantalla para actuar sobre los comandos por los que se mueve el cursor.
Puedes utilizar este modo de «lectura forzada» para leer datos de la pantalla en BASIC sin intervención del usuario. Por ejemplo, en el siguiente programa, las líneas 100 a 200 serán borradas por el propio programa a medida que se ejecuta.

10 GRAPHICS 0:POSITION 2,4
20 PRINT 100:PRINT 150:PRINT 200
25 PRINT "CONT"
30 POSITION 2,0
50 POKE 842,13:STOP
60 POKE 842,12
70 REM SE BORRARAN LAS SIGUIENTES LINEAS
100 PRINT "BORRAR..."
150 PRINT "BORRAR..."
200 PRINT "BORRADO!"	

Véase COMPUTE!, agosto de 1981, para una muestra de esta poderosa técnica. Véase el Tutorial Tricky nº 1 de Santa Cruz (listas de visualización) para otra aplicación. Los últimos cuatro bytes (844 a 847; $34C a $34F en este caso) son bytes de reserva (auxiliares) en todos los IOCB's.
Cuando se está en un modo GRÁFICO distinto de cero, el canal cero se ABRE para el área de la ventana de texto. Si la ventana está ausente y se ABRE el canal cero, toda la pantalla vuelve al modo cero. Un comando BASIC NEW o RUN cierra todos los canales excepto el cero. Abrir un canal a S: o E: siempre borra la pantalla.
Ver COMPUTE!, Octubre 1981,para un ejemplo de uso de un IOCB con el grabador de programas de cassette, y Septiembre 1981 para otro uso con la impresora Atari 825.

848, 863$350, $35FIOCB1IOCB primero.
864, 879$360, $36FIOCB2IOCB segundo.
880, 895$370, $37FIOCB3IOCB tercero.
896, 911$380, $38FIOCB4IOCB cuarto.
912, 927$390, $39FIOCB5IOCB quinto.
928, 943$3A0, $3AFIOCB6IOCB sexto. La sentencia GRAPHICS abre el canal seis para la visualización en pantalla (S:), por lo que una vez que salga del modo cero, no podrá utilizar el canal seis a menos que primero emita una sentencia CLOSE#6. Si cierra este canal, no podrá usar los comandos DRAWTO, PLOT o LOCATE hasta que reabra el canal. El comando LOAD cierra el canal seis; también cierra todos los canales excepto el cero.
944, 959$3B0, $3BFIOCB7IOCB siete. LPRINT utiliza automáticamente el canal siete para su uso. Si el canal está abierto para algún otro uso y se realiza una LPRINT, se producirá un error, el canal se cerraran y las LPRINT posteriores funcionarán.
El comando LIST también utiliza el canal siete, incluso si el canal siete ya está abierto. Sin embargo, cuando finaliza la LIST, cierra el canal siete.
El comando LOAD utiliza el canal siete para transferir programas hacia y desde la grabadora o el disco. LIST (excepto en la pantalla de visualización), LOAD y LPRINT también cierran todas las voces de sonido.
El comandos RUN desde cinta o disco y guarda utilizan el canal siete, al igual que LIST.
960, 999$3C0, $3E7PRNBUFEstas posiciones de la memoria del computador definen una zona especial para la comunicación con la impresora. Cada byte que se desee imprimir debe pokearse en estas posiciones, pero si utilizamos el comando del BASIC LPRINT esta operatoria es automática.
1021, 1151$3FD, $47FCASBUF

Búfer de casete. Estas ubicaciones son utilizadas por el manejador de casete para leer y escribir datos en la grabadora de programa (cinta).
Los 128 ($80) bytes de datos para cada registro de casete se almacenan comenzando en 1024 ($400 – página cuatro). El tamaño actual del buffer se encuentra en la posición 650 ($28A). La posición 61 ($3D) apunta al byte actual que se está escribiendo o leyendo. CASBUF también se utiliza en el proceso de arranque del disco; el primer registro del disco se lee en este buffer.


Un registro de casete consta de 132 bytes: dos bytes de control ajustados a 85 ($55; alternando ceros y unos) para la medición de la velocidad en la rutina de corrección de la tasa de baudios; un byte de control (ver más abajo); 128 bytes de datos (comparados con los 125 bytes de datos de un sector de disco), y un byte de suma de comprobación. Sólo los bytes de datos se almacenan en el buffer del casete. Ver De Re Atari para más información sobre el grabador de cassette.


Valores del bytes de control


  • 250 ($FA) : Sigue un registro parcial. El número real de bytes se almacena en el último byte del registro (127).
  • 252 ($FC) : Registro completo; siguen 128 bytes.
  • 254 ($FE) : Registro de fin de archivo (EOF); seguido de 128 bytes cero.

Las posiciones 1152 a 1791 ($480 a $6FF) son para requerimientos de RAM de usuario (entorno externo), dependiendo de la cantidad de RAM disponible en la máquina. Siempre que no utilice el paquete FP o BASIC, tiene 640 ($280) bytes libres aquí.


Las posiciones 1152 a 1279 ($480 a $4FF) son 128 ($80) bytes libres. El paquete de coma flotante, cuando se utiliza, requiere las posiciones 1406 a 1535 ($57E a $5FF).


Decimal HexadecimalNombreDescripción
1406$57ELBPR1LBUFF prefijo uno.
1407$57FLBPR2LBUFF prefijo dos.
1408, 1535$580, $5FFLBUFFBuffer de línea BASIC; 128 bytes. Utilizado como buffer de resultado de salida para la rutina FP a ASCII en 55526 ($D8E6). El buffer de entrada es apuntado por las posiciones 243, 244 ($F3, $F4).
1504$5E0PLYARGArgumentos polinómicos (uso FP).
1510, 1515$5E6, $5EBFPSCRUso del bloc de notas FP.
1516, 1535$5EC, $5FFFPSCR1Ídem. El final del buffer se llama LBFEND.