Mapping the Atari - Revised Edition, por Ian Chadwick

MAPA DE MEMORIA


Las ubicaciones 0 a la 255 ($0 a la $FF) se denominan "Página1 Cero" y tienen especial importancia para los programadores de lenguaje ensamblador, ya que la máquina accede a estas ubicaciones de manera rápida y sencilla.

Las ubicaciones 0 a la 127 ($0 a la $7F) están reservadas y se les conoce como la Página Cero del Sistema Operativo2. Las ubicaciones 128 a la 255 ($80 a la $FF) corresponden a la memoria RAM de la Página Cero usada por BASIC y el usuario. Las ubicaciones 0 a la 1792 ($0 a la $700) corresponden a la memoria RAM del Sistema Operativo y (si el cartucho o cartridge está presente) del BASIC de 8K (Excepto la Página Seis). Las ubicaciones 0 a la 8191 ($0 a la $1FFF) son las mínimas requeridas para la operación del sistema (8192 = 8K).

Las ubicaciones 2 a la 7 no se limpian en ninguna operación de inicio.


1 Una página corresponde a 256 bytes consecutivos de memoria. La primera ubicación de una página tiene la dirección $xx00, y la última tiene la dirección $xxFF. (N. del T.)

2 El Sistema Operativo es el programa que viene de fábrica en la memoria ROM de los computadores Atari. No confundir con el DOS, el Sistema Operativo del Disco, que se carga desde el disco. (N. del T.)

DECIMAL

HEXADECIMAL

ETIQUETA

 

 

0,1

0,1

LINZBS

 

 

Memoria RAM usada por LINBUG3, posteriormente reemplazada por la memoria RAM del Monitor. Vea la página 31 del listado del código fuente del Sistema Operativo. Aparentemente se usa para almacenar el valor del temporizador (timer) de VBLANK. El programa Metrónomo del libro De Re Atari utiliza la ubicación 0. También se utiliza en el cross-assembler4 del Sistema Operativo de Atari.


3 LINBUG es el cross-assembler con el que Atari Inc. desarrolló el Sistema Operativo de sus computadores. (N. del T.)

4 Un "cross assembler" es un ensamblador que se ejecuta en un computador con un tipo de procesador, pero que genera un código objeto que será utilizado en un computador con otro tipo de procesador. (N. del T.)

2,3

2,3

CASINI

 

 

Vector5 de inicialización de la unidad de cassette: Si el arranque (boot) desde cassette fue exitoso, el Sistema Operativo hace un JSR6 al contenido de estas direcciones de memoria . Esta dirección se extrae de los primeros 6 bytes del archivo de arranque desde cassette. El primer byte se ignora. El segundo contiene el número de registros, el tercero y el cuarto contienen el byte bajo y alto de la dirección de carga, y el quinto y sexto contienen los bytes bajo y alto de la dirección de inicialización.

Luego de la carga, el control salta a la dirección de carga más 6 (en el caso de una carga multietapa) o a CASINI (en el caso de una inicialización). Para transferir el control al programa, haga un JSR a DOSVEC (10 y 11; $A y $B).


5 Un vector son 2 direcciones de memoria consecutivas que almacenan la dirección de una subrutina, en formato byte bajo seguido del byte alto. (N. del T.)

6 JSR es una instrucción o mnemónico del lenguaje ensamblador que se utiliza para invocar a una subrutina. Es similar al comando GOSUB del BASIC. (N. del T.)

4,5

4,5

RAMLO

 

 

Puntero de la RAM para la comprobación de memoria que se ejecuta al encender el equipo. También almacena la dirección de arranque del disco (normalmente 1798 ($706)), que es utilizada por la rutina de continuación del arranque.

6

6

TRAMSZ

 

 

Registro temporal del tamaño de la memoria RAM; se utiliza durante la secuencia de encendido del equipo para comprobar la disponibilidad de memoria RAM. Posteriormente, este valor se asigna a RAMTOP (ubicación 106 ($6A)). Una lectura a esta ubicación devuelve un 1 cuando el cartucho BASIC o el cartucho A (el de la izquierda) es insertado en el equipo.

7

7

TSTDAT

 

 

Registro de datos de comprobación de la memoria RAM. Una lectura a esta ubicación devuelve un 1 cuando el cartucho B (el de la derecha) es insertado en el equipo.

RAMLO, TRAMSZ y TSTDAT se utilizan para comprobar el tamaño de la RAM al encender el equipo. Al arrancar el DOS, RAMLO y TRAMSZ también actúan como almacenamiento temporal de la dirección de continuación del arranque. Posteriormente, TRAMSZ y TSTDAT se utilizan para indicar, respectivamente, si el cartucho A (el de la izquierda) o el cartucho B (el de la derecha) fueron insertados o no en el equipo (Un valor distinto de 0 indica que se ha insertado un cartucho), o si se debe arrancar desde el disco.

Las ubicaciones 8 a la 15 ($8-$F) son establecidas en 0 solo en el arranque en frío (coldstart) del equipo.

8

8

WARMST

 

 

Bandera de inicio en caliente (warmstart). Si el valor de esta ubicación es igual a 0, el equipo está en medio del proceso de encendido; si es igual a 255, se encuentra en medio de un RESET normal. El arranque en caliente es similar a presionar la tecla RESET, por lo que no se deben borrar la memoria, ni las variables, ni los programas. El valor inicial de WARMST es 0 y su valor no cambia, a menos que se le haga POKE a esta ubicación o hasta que se presione por primera vez el botón RESET; en dicho caso su valor será 255 ($FF).

El arranque en caliente normalmente se dirige a la ubicación almacenada en el vector de la ubicación 58484 ($E474). Cuando se presiona la tecla RESET, WARMST es comprobado por medio del registro de estado de la NMI7 en la ubicación 54287 ($D40F) para ver si se debe reiniciar o no el software o si se debe volver a arrancar desde el disco.


7 Una NMI (Non-Maskable Interrupt - Interrupción No Enmascarable) es un tipo de interrrupción de hardware que no se puede ignorar. En los computadores Atari, las NMI son generadas por el chip ANTIC, y se usan para el despliegue de la señal de video y el control de la tecla RESET. (N. del T.)

9

9

BOOT?8

 

 

Indicador de éxito de la bandera de arranque. Un valor 255 en esta ubicación provoca el bloqueo del sistema si se pulsa la tecla RESET. Si BOOT? es igual a 1, entonces el arranque desde disco fue exitoso; si es igual a 2, entonces el arranque desde cassette fue exitoso. Si es igual a 0, entonces no se pudo arrancar desde ninguno de estos dispositivos.

Si se establece en 2, entonces se usa el vector del cassette de las ubicaciones 2 y 3 al hacer un RESET. Si se establece en 1, entonces se usa el vector del DOS de las ubicaciones 10 y 11 ($A y $B). El arranque en frío intenta realizar un arranque desde cassette y de disco y guarda en esta ubicación el éxito o fracaso de la operación. BOOT? es comprobado durante el arranque tanto del disco como del cassette.


8 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

10,11

A,B

DOSVEC

 

 

Vector de inicio del software de disco (o sin cartucho). Esta es la ubicación a la que salta BASIC cuando se invoca al DOS. El usuario puede configurarlo para que apunte a su propia rutina, pero al hacer un RESET, DOSVEC vuelve a su valor original. Para evitar esto, puede hacer POKE en la ubicación 5446 con el byte menos significativo de la dirección de su vector, hacer POKE en la ubicación 5450 con el byte más significativo y volver a guardar el DOS usando la opción "WRITE DOS FILES" (GRABAR DOS) del menú. Las ubicaciones 10 y 11 generalmente contienen los valores 159 y 23 ($9F y $17), respectivamente. Esto permite que la sección DUP.SYS del DOS se cargue cuando sea invocada. Inicialmente se configura con el vector del modo "pizarrón9" (ubicación 58481; $E471--al que se invoca escribiendo "BYE" o "B." desde el BASIC). Si no hay ninguna dirección cargada en el vector DOS, también se dirige a la dirección almacenada en el vector de ejecución del cassette. Si crea un archivo AUTORUN.SYS que no termina con una instrucción RTS10, debe establecer el valor de BOOT? en 1 y la dirección 580 ($244) en 0.


9 El modo "pizarrón" es el modo en que arranca el computador Atari 400/800 cuando no se ha insertado el cartucho BASIC. Se identifica por el texto "ATARI COMPUTER - MEMO PAD" en la primera línea de la pantalla. (N. del T.)

10 RTS es una instrucción o mnemónico del lenguaje ensamblador que se utiliza para retornar desde una subrutina. Es similar al comando RETURN del BASIC. (N. del T.)

12,13

C,D

DOSINI11

 

 

Dirección de inicialización del arranque desde disco. También se utiliza para almacenar la dirección de ejecución (RUN) del arranque desde cassette, la que luego se mueve a CASINI (2, 3). Cuando se enciende el equipo sin un disco o cassette de arranque, el valor de DOSINI es igual a 0 en ambas ubicaciones.


11 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

14,15

E,F

APPMHI

 

 

Límite superior de la memoria de aplicaciones y puntero al final de su programa BASIC. Esta ubicación es utilizada tanto por el Sistema Operativo como por BASIC. Contiene la ubicación más baja que puede utilizar para configurar una pantalla y su Display List (Lista de Despliegue12,) (Esta ubicación también corresponde a la dirección más alta que pueden utilizar los programas y sus datos, y debajo de la cual no se puede colocar la RAM de la pantalla). Si se debe extender la RAM de la pantalla o de la Lista de Despliegue por debajo de esta dirección, el controlador de la pantalla no hará OPEN del dispositivo "S:". La memoria por encima de esta dirección se puede utilizar para el despliegue de la pantalla y otros datos (gráficos PM, etc.).

Si un intento de cambio de modo gráfico amplía la memoria de pantalla por debajo de APPMHI, entonces la pantalla se configurará como modo GRAPHICS 0, se actualizará el valor de MEMTOP (ubicaciones 741 y 742; $2E5 y $2E6) y se devolverá un error al usuario. De lo contrario, la memoria es lo suficientemente amplia para iniciar el editor de pantalla, así que el cambio de modo tiene efecto y se actualiza el valor de MEMTOP. Esta es una de las 5 ubicaciones utilizadas por el Sistema Operativo para realizar un seguimiento de la memoria tanto del usuario como del despliegue de la pantalla.

Al encender el equipo, el Sistema Operativo inicializa esta ubicación en 0. Recuerde que no puede configurar una Lista de Despliegue por debajo de la dirección especificada aquí.

Si utiliza el área debajo de la Lista de Despliegue para almacenar sus conjuntos de caracteres, gráficos PM o lo que sea, asegúrese de configurar APPMHI por encima de la última dirección utilizada, para que la pantalla o los datos de la Lista de Despliegue no desciendan y destruyan sus propios datos. Para obtener más información, consulte RAMTOP en la ubicación 106 ($6A), MEMTOP en las ubicaciones 741 y 742 ($2E5 y $2E6), PMBASE en la ubicación 54279 ($D407) y CHBASE en la ubicación 54281 ($D409).

Las ubicaciones 16 a la 127 ($10 a la $7F) son inicializadas en 0 tanto en el arranque en frío como en caliente.


12 Una Display List o Lista de Despliegue es un pequeño conjunto de instrucciones (programa) que le indica al chip ANTIC cómo mostrar los datos en la pantalla. (N. del T.)

16

10

POKMSK

 

 

Interrupciones del chip POKEY: el servicio de las IRQ utiliza y altera esta ubicación. Corresponde al registro sombra (shadow) 13 de la ubicación 53774 ($D20E). Para deshabilitar la tecla BREAK, haga POKE con 112 ($70) en esta ubicación y en la ubicación 53774. Si los siguientes bits se establecen en 1, entonces se habilitan las siguientes interrupciones (Los valores decimales de estos bits están entre paréntesis):

BIT
DECIMAL
FUNCIÓN
7
128
Se habilita la tecla BREAK.
6
64
Se habilita la interrupción de la "otra tecla".
5
32
Se habilita la interrupción de datos listos de la entrada serie.
4
16
Se habilita la interrupción de datos requeridos de la salida serie.
3
8
Se habilita la interrupción de transmisión finalizada de la salida serie.
2
4
Se habilita la interrupción del temporizador POKEY #4 (Sólo en la versión "B" o posterior del Sistema Operativo).
1
2
Se habilita la interrupción del temporizador POKEY #2.
0
1
Se habilita la interrupción del temporizador POKEY #1.

Al habilitar la interrupción del temporizador, los registros AUDF asociados serán utilizados como temporizadores y generarán una solicitud de interrupción cuando su conteo llegue a 0. Para una explicación completa, vea las ubicaciones 528 a la 535 ($210 a la $217) y las ubicaciones del chip POKEY, a partir de la ubicación 53760 ($D200). Al encender el equipo, el valor predeterminado de esta ubicación es igual a 192 ($C0).

También puede desactivar la tecla BREAK haciendo POKE con 64 ($40) en esta ubicación y en la ubicación 53774, o con cualquier número menor a 128 ($80). El problema con estos simples POKEs es que la tecla BREAK se vuelve a habilitar cuando se presiona la tecla RESET, cuando se ejecuta la primera instrucción PRINT que despliegue algo en la pantalla, cuando se ejecuta cualquier comando OPEN que acceda a la pantalla (S: o E:), o cuando se ejecuta la primera instrucción PRINT luego de un comando OPEN o GRAPHICS. En caso de que se estén ejecutando dichos comandos, para desactivar continuamente la tecla BREAK es mejor usar una subrutina que verifique frecuentemente los bits de habilitación durante las operaciones de entrada y salida, y que haga POKEs en las ubicaciones adecuadas con un valor menor a 128.

Por ejemplo:

1000 BREAK = PEEK(16) - 128: IF BREAK < 0 THEN RETURN
1010 POKE 16, BREAK: POKE 53774, BREAK: RETURN

La nueva memoria ROM con la versión "B" del Sistema Operativo incluye un vector para la interrupción de la tecla BREAK, lo que permite a los usuarios crear sus propias rutinas para procesar la interrupción de la forma en que deseen. Se encuentra en las ubicaciones 566 y 567 ($236 y $237).


13 Para cada registro Hardware (registro correspondiente a algún chip como ANTIC, POKEY, etc.) se tiene un registro Sombra asociado. Los registros sombra son utilizados en la etapa 2 del proceso VBLANK, donde su contenido es copiado a su correspondiente registro hardware. (N. del T.)

17

11

BRKKEY

 

 

Un 0 en esta ubicación indica que se presionó la tecla BREAK. Cualquier otro número indica lo contrario. Al presionar la tecla BREAK durante una operación de Entrada/Salida, esta ubicación devuelve el valor 128 ($80). Esta ubicación es monitoreada por los controladores del teclado, el editor de pantalla, cassette y pantalla. Vea sugerencias de cómo deshabilitar la tecla BREAK en la ubicación 16 ($A). Las versiones más recientes del Sistema Operativo proporcionan un vector adecuado para las interrupciones asociadas a la tecla BREAK. El código de estado de cancelación de la tecla BREAK se almacena en la ubicación STATUS (48; $30). Esta ubicación también se verifica durante todas las rutinas de E/S, de desplazamiento (scroll) y de dibujo. Durante la rutina del controlador del teclado, el código de estado se almacena en la ubicación DSTAT (76; $4C). Al encender el equipo, BRKKEY se establece en 0. El estado de cancelación de la tecla BREAK se indica estableciendo en 1 el bit 7 de la ubicación 53774 ($D20E). Consulte la nota relativa al vector de la tecla BREAK en la ubicación anterior.

18,19,20

12,13,14

RTCLOK14

 

 

Reloj interno en tiempo real. El valor de la ubicación 20 se incrementa en cada ejecución de la Etapa 1 de la interrupción VBLANK (es decir, cada 1/60 de segundo o, lo que es lo mismo, en cada jiffy), hasta que llega a 255 ($FF). Luego, la ubicación 19 se incrementa en 1 y la ubicación 20 se establece en 0 cada 4,27 segundos. Cuando la ubicación 19 llega a 255, la ubicación 20 se establece en 0 y la ubicación 18 se incrementa en 1 cada 18,2 minutos (ó 65.536 fotogramas de TV). Para poder utilizar estas ubicaciones como un temporizador en segundos, pruebe lo siguiente:

TIEMPO = INT((PEEK(18) * 65536 + PEEK(19) * 256 + PEEK(20))/60)

Para ver el conteo en jiffies, elimine el "/60" al final. Para ver el conteo en minutos, cambie "/60" a "/360". El máximo valor del reloj en tiempo real es 16.777.215. Cuando alcanza este valor, se establece en 0 en el siguiente incremento del VBLANK. Este valor es el resultado de elevar 256 al cubo (es decir, 256 * 256 * 256), que es el máximo número de incrementos en cada registro del reloj. El reloj en tiempo real siempre es actualizado en cada VBLANK, independiente de si el código que se está procesando es crítico o no con respecto al tiempo.

Un jiffy es mucho tiempo para el computador. Puede procesar más de 8000 ciclos de máquina en ese tiempo. Piense en lo que puede hacerse en un intervalo del VBLANK (un jiffy). En términos humanos, un jiffy puede durar más de 20 minutos, tal como lo demuestra la frase "Estaré listo en un santiamén"15. Compare esta con la frase frecuentemente citada: "Estaré listo en un minuto", usada por los programadores comprometidos para describir un marco de tiempo de más de una hora.

Los usuarios pueden hacer POKE en estos registros de reloj con valores adecuados para su propio uso. El reloj en tiempo real siempre se actualiza durante el intervalo del VBLANK. Otros registros temporizadores, como los de las ubicaciones 536 a la 544 ($218 a la $220), no siempre se actualizan cuando el Sistema Operativo ejecuta código crítico en el tiempo.

A continuación, se muestra una forma de utilizar el reloj en tiempo real como si fuera un temporizador de retardo:

10 GOSUB 100 
.
.
.
100 POKE 20,0: POKE 19,0 
110 IF NOT PEEK(19) THEN 110
120 RETURN

La línea 110 espera hasta que el valor de la ubicación 19 sea igual a 0, y luego le pasa el control a la sentencia RETURN. Para ver un programa útil de un pequeño reloj en tiempo real que se despliega mientras usted programa en BASIC, consulte la revista COMPUTE! de agosto de 1982. Vea también el libro De Re Atari, allí encontrará otro programa de reloj en tiempo real.


14 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

15 "Estaré listo en un santiamén" es la traducción al español de la frase en inglés "I'll be ready in a jiffy", donde en este caso "jiffy" significa un instante, o momento breve. (N. del T.)

21,22

15,16

BUFADR

 

 

Registro de dirección indirecto del búfer (Página Cero). Puntero temporal al búfer del disco actual.

23

17

ICCOMT

 

 

Comando para el vector de CIO (Central Input/Output - Entrada/Salida Central). Almacena el comando CIO. Se utiliza para encontrar el desplazamiento en la tabla de comandos para el vector correcto de la rutina del controlador.

24,25

18,19

DSKFMS

 

 

Puntero del administrador de archivos del disco. En DOS se le conoce como JMPTBL. Se usa como un vector al FMS (File Manager System - Sistema Administrador de Archivos).

26,27

1A,1B

DSKUTL

 

 

Puntero de las utilidades del disco. En DOS se le conoce como BUFADR. Apunta al área guardada para el búfer utilizado por el paquete de utilidades (búfer de datos; DBUF) o por el área del programa (ubicación MEMLO ; 743 y 744; $2E7 y $2E8).

28

1C

PTIMOT

 

 

Tiempo de espera de la impresora, consultado en cada solicitud de estado de la impresora. Su valor inicial es 30, que representa 32 segundos (el valor es de 64 segundos cada 60 incrementos de este registro). El tiempo de espera típico para la impresora Atari 825 es de 5 segundos. Este valor es establecido por el software del controlador de la impresora, y es actualizado luego de cada operación de solicitud de estado de la impresora. El estado del tiempo de espera específico se obtiene desde la ubicación 748 ($2EC), el que es cargado allí por SIO.

La nueva ROM de la versión "B" del Sistema Operativo aparentemente ha resuelto el problema de tiempo de espera que atormenta a la ROM "A"; el problema se manifiesta cuando la impresora o unidad de disco se suspende (al agotarse el tiempo de espera) periódicamente por unos segundos, provocando graves ataques de ansiedad a los usuarios que piensan que sus Ataris han muerto misteriosamente. Esto se agrava cuando uno, creyendo que el proceso de E/S ha finalizado, extrae un disco desde la unidad y esta, luego de que el tiempo de espera se consume, vuelve a ponerse en funcionamiento de manera inesperada, intentando escribir o leer desde un disco inexistente. Llegado este punto, tanto el sistema como el usuario colapsan. Para más información sobre la nueva ROM del Sistema Operativo, vea el apéndice.

29

1D

PBPNT16

 

 

Puntero del búfer de impresión; apunta a la posición (byte) actual en el búfer de impresión. Varía de 0 hasta el valor almacenado en la ubicación 30.


16 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

30

1E

PBUFSZ

 

 

Tamaño del búfer de impresión del registro de la impresora para el modo actual. Normalmente el tamaño del búfer y de la línea son iguales a 40 bytes. La impresión de doble ancho equivale a 20 bytes (la mayoría de las impresoras utilizan sus propios códigos de control para lograr una impresión expandida); la impresión lateral equivale a 29 bytes (Solo para la impresora Atari 820).

La solicitud de estado de la impresora es igual a 4. El valor inicial de PBUFSZ es igual a 40. El controlador de la impresora verifica si el mismo valor se encuentra en PBPNT y, si es así, envía el contenido del búfer a la impresora.

31

1F

PTEMP

 

 

Registro temporal utilizado por el controlador de la impresora para almacenar el valor del carácter que se envía a la impresora.


Las ubicaciones 32 a la 47 ($20 a la $2F) corresponden al ZIOCB (Page Zero Input-Ouput Control Block - Bloque de Control de Entrada-Salida de la Página Cero). ZIOCB usa la misma estructura que los IOCB que se encuentran en las ubicaciones 832 a la 959 ($340 a la $3BF). El ZIOCB se utiliza para comunicar datos de control de E/S entre el CIO y los controladores de los dispositivos. Cuando se inicia una operación CIO, la información almacenada en el canal del IOCB se mueve aquí para ser usada por las rutinas CIO. Cuando la operación finaliza, la información actualizada se devuelve al área del usuario.

32

20

ICHIDZ

 

 

Número índice del controlador. Establecido por el Sistema Operativo como el índice de la tabla de nombres de dispositivo del archivo abierto actualmente. Si no hay ningún archivo abierto en este IOCB (es decir, el IOCB está libre), entonces este registro se establece en 255 ($FF).

33

21

ICDNOZ17

 

 

Número de dispositivo o número de unidad. En DOS se le conoce como MAXDEV, e indica el número máximo de dispositivos. Su valor inicial es igual a 1.


17 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

34

22

ICCOMZ

 

 

Byte del código de comando establecido por el usuario para definir el formato del resto del IOCB, y qué operación de E/S se debe realizar.

35

23

ICSTAZ

 

 

Estado de la última acción IOCB devuelta por el dispositivo, establecida por el Sistema Operativo. Puede o no ser el mismo estado que devuelve el comando STATUS.

36,37

24,25

ICBALZ/HZ

 

 

Dirección del búfer para la transferencia de datos, o la dirección del nombre del archivo que se usa en comandos como OPEN, STATUS, etc.

38,39

26,27

ICPTLZ/HZ

 

 

Dirección de la rutina para poner un byte, establecida por el Sistema Operativo. Corresponde a la dirección, menos 1 byte, de la rutina "poner un byte" del dispositivo. En un comando CLOSE, apunta al mensaje "IOCB NOT OPEN" (IOCB no abierto) del CIO.

40,41

28,29

ICBLLZ/HZ

 

 

Conteo en bytes del largo del búfer utilizado por las operaciones PUT y GET. Por cada byte transferido, el valor almacenado en esta ubicación disminuye en 1.

42

2A

ICAX1Z

 

 

Primer byte de información auxiliar utilizado por el comando OPEN para especificar el tipo de acceso que necesita el archivo.

43

2B

ICAX2Z

 

 

Variables de trabajo de CIO, también utilizada por algunas funciones del puerto serie. Segundo byte de información auxiliar.

44,45

2C,2D

ICAX3Z/4Z

 

 

Utilizado por los comandos NOTE y POINT del BASIC para la transferencia de números de sectores del disco. Los siguientes 4 bytes, hasta la ubicación 47, también se denominan ICSPRZ y se definen como bytes sobrantes para uso por parte del CIO local.

46

2E

ICAX5Z

 

 

Corresponde al byte que se accede dentro del sector almacenado en las ubicaciones 44 y 45. También se utiliza para almacenar el Número de IOCB, multiplicado por 16. Cada bloque de un IOCB tiene una longitud de 16 bytes. Otras fuentes indican que el registro X del microprocesador 6502 también contiene esta información.

47

2F

ICAX6Z

 

 

Byte sobrante. También denominado CIOCHR, corresponde a una ubicación de almacenamiento temporal del byte del carácter en la operación PUT actual.


48

30

STATUS

 

 

Registro de almacenamiento de estado interno. Las rutinas SIO en la ROM utilizan este byte para almacenar el estado de la operación SIO actual. Para ver la lista de valores de estado, consulte la página 166 del Manual del Usuario del Sistema Operativo. STATUS utiliza la ubicación 793 ($319) como almacenamiento temporal. La ubicación STATUS también se utiliza como registro de almacenamiento de los valores de tiempo de espera, la interrupción de la tecla BREAK y los errores durante la ejecución de rutinas SIO.

49

31

CHKSUM

 

 

Suma de comprobación de la trama18 de datos (data frame), utilizada por SIO: suma de un solo byte con acarreo al bit menos significativo. La suma de comprobación corresponde al valor del número de bytes transmitidos (255; $FF). Cuando el número de bytes transmitidos es igual a la suma de comprobación, se establece en 1 el indicador de envío de suma de comprobación de la ubicación 59 ($3B). CHKSUM utiliza las ubicaciones 53773 ($D20D) y 56 ($38) para la comparación de valores (bytes transmitidos).


18 En el contexto de redes de computadores, una trama es una serie sucesiva de bits que transportan información (datos, comandos, etc.). (N. del T.)

50,51

32,33

BUFRLO/HI

 

 

Puntero al búfer de datos cuyo contenido se transmite durante una operación de E/S. Es utilizada por SIO y el DCB (Device Control Block - Bloque de Control de Dispositivos). Apunta al byte que se va a enviar o recibir. Los bytes son transferidos hacia el registro de retención de salida serie-paralelo (un registro de 8 bits), o son transferidos desde el registro de retención de entrada en la ubicación 53773 ($D20D). El registro BUFRLO/HI es una ubicación de un sólo byte que se utiliza para almacenar los 8 bits que serán transmitidos un bit a la vez (es decir, en serie) desde o hacia el dispositivo. El computador toma los 8 bits para procesarlos cuando el registro está lleno o reemplaza otro byte en él cuando esté vacío después de una transmisión.

52,53

34,35

BFENLO/HI

 

 

Corresponde al siguiente byte después del final del búfer de datos SIO y DCB descrito en la ubicación BUFRLO/HI.

54

36

CRETRY

 

 

Número de reintentos de la trama de comandos (command frame). Su valor predeterminado es 13 ($0D). Corresponde al número de veces que un dispositivo intenta ejecutar un comando, como leer un sector o dar formato a un disco.

55

37

DRETRY

 

 

Número de reintentos del dispositivo. Su valor predeterminado es 1.

56

38

BUFRFL

 

 

Indicador de búfer de datos lleno. Si el valor de esta ubicación es igual a 255 ($FF), entonces el búfer está lleno.

57

39

RECVDN

 

 

Indicador de recepción realizada. Si el valor de esta ubicación es igual a 255 ($FF), entonces se ha realizado la recepción.

58

3A

XMTDON

 

 

Indicador de transmisión realizada. Si el valor de esta ubicación es igual a 255 ($FF), entonces se ha realizado la transmisión.

59

3B

CHKSNT19

 

 

Indicador de envío de la suma de comprobación. Si el valor de esta ubicación es igual a 255 ($FF), entonces se ha realizado el envío de la suma de comprobación.


19 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

60

3C

NOCKSM

 

 

Indica si viene o no una suma de comprobación al final de los datos. Un valor distinto de 0 en esta ubicación indica que no viene una suma de comprobación. Un valor igual a 0 indica que viene una suma de comprobación al final de la transmisión de los datos.

61

3D

BPTR

 

 

Puntero de búfer del cassette: registra el índice en la porción de datos que se están leyendo o escribiendo. Varía de 0 al valor actual almacenado en la ubicación 650 ($28A). Cuando estos valores son iguales, el búfer en la ubicación 1021 ($3FD) está vacío (en caso de lectura) o lleno (en caso de escritura). El valor de inicialización de la ubicación BPTR es 128 ($80).

62

3E

FTYPE

 

 

Tipo de IRG (Inter-record gap, espacio entre registros del cassette). El valor de esta ubicación es copiado en el ZIOCB a partir de la ubicación 43 ($2B; ICAX2Z) . El valor que el usuario almacena en DAUX2 (779; $30B) es copiado a la ubicación ICAX2Z. Los IRG normales corresponden a valores positivos distintos de 0. Los IRG continuos corresponden a un valor 0 ó negativo en esta ubicación.

63

3F

FEOF

 

 

Indicador de fin de archivo del cassette. Si el valor en esta ubicación es igual a 0, entonces no se ha llegado al EOF (End Of File - Fin del archivo). Cualquier otro valor significa que se ha alcanzado el fin del archivo. Cuando el byte de comando de un registro de datos es igual a 254 ($FE), significa que se ha alcanzado el final del archivo. Para más detalles, vea la ubicación 1021 ($3FD).

64

40

FREQ

 

 

Registro de retención del conteo de pitidos. Cuenta el número de pitidos requeridos por el controlador del cassette durante un comando OPEN para operaciones de reproducción o de grabación. 1 pitido en caso de carga de datos, o 2 pitidos en caso de grabación de datos en el cassette.

65

41

SOUNDR

 

 

Indicador de E/S ruidoso utilizado por SIO para indicar el tipo de pitido que se escucha durante las operaciones de Entrada/Salida de disco y de cassette. Haga POKE con un 0 en esta ubicación para activar operaciones de E/S silenciosas. Cualquier otro valor activa los pitidos. El valor inicial de esta ubicación es 3. La solución hardware a este problema es bajar el volumen del altavoz de su TV o monitor. Esta ubicación también se puede usar para silenciar la pista digital al reproducir cintas de voz y datos sincronizados. Para más detalles, vea la ubicación 54018.

66

42

CRITIC20

 

 

Indicador de región de E/S crítica. Cuando el valor almacenado en esta ubicación es distinto de 0, se define la operación actual como una sección crítica en el tiempo. CRITIC es comprobado en el proceso NMI luego de haber procesado la etapa 1 del VBLANK. Cuando se hace POKE en esta ubicación con un número distinto de 0, se deshabilita la acción de repetición de las teclas y cambia el sonido del timbre que suena al presionar las teclas CONTROL-2.

0 es el valor normal. Cuando se establece CRITIC en un valor distinto de 0, se suspenden una serie de procesos del Sistema Operativo, incluido el conteo de los temporizadores del sistema (Los temporizadores #2, #3, #4 y #5; vea las ubicaciones 536 a la 558; $218 a la $22E). Se sugiere no asignar ningún valor a CRITIC. Cuando se activa uno de los temporizadores, CRITIC detiene los demás para hacerlo, lo que provoca que se "pierda" una pequeña cantidad de tiempo. Cuando CRITIC es igual a 0, se ejecutarán los procedimientos de las etapas 1 y 2 del VBLANK. Cuando CRITIC es distinto de 0, solo se procesa la etapa 1 del VBLANK.


20 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

67-73

43-49

FMZSPG21

 

 

Registros de Página Cero del Sistema Administrador de Archivos del disco (FMS) (7 bytes).


21 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

67,68

43,44

ZBUFP

 

 

Puntero del búfer de Página Cero asociado al nombre del archivo en el disco del usuario para operaciones de E/S.

69,70

45,46

ZDRVA

 

 

Puntero de Página Cero asociado a la unidad de almacenamiento. El valor almacenado aquí se obtiene a partir de las ubicaciones DBUFAH y DBUFAL; 4905 y 4913 ($1329 y 1331). También se utiliza en las rutinas de "sector libre", de configuración y "obtener sector" del FMS.

71,72

47,48

ZSBA

 

 

Puntero de Página Cero asociado al búfer del sector.

73

49

ERRNO

 

 

Número de error de E/S del disco. Inicializado en 159 ($9F) por el FMS.

74

4A

CKEY

 

 

Bandera de solicitud de arranque en frío desde cassette. Comprueba si la tecla START ha sido presionada y, si es así, CKEY se establece en 1. Los cassettes de arranque automático se cargan presionando la tecla START al momento de encender el equipo. En respuesta al pitido, presione el botón PLAY en la unidad de cassette.

75

4B

CASSBT

 

 

Indicador de arranque desde cassette. El computador Atari intenta arrancar tanto del disco como del cassette de manera simultánea. Un 0 aquí significa que no se arrancó de manera correcta desde el cassette. Para más detalles, vea la ubicación 9.

76

4C

DSTAT

 

 

Registro de estado de la pantalla y del teclado utilizado por el controlador de la pantalla. También se utiliza para indicar que la memoria es demasiado pequeña para el modo de pantalla solicitado, un error de cursor fuera de rango y el estado de cancelación causado por el uso de la tecla BREAK.

77

4D

ATRACT

 

 

Temporizador e indicador del modo atracción. El modo atracción rota los colores en la pantalla usando niveles de luminancia bajos cuando no se ha presionado ninguna tecla en el computador por mucho tiempo (Alrededor de 7 a 9 minutos). Esto ayuda a proteger la pantalla de su televisor de daños por "quemadura" que puede sufrir por dejarla encendida y sin uso por mucho rato. Esta ubicación es establecida en 0 por IRQ cada vez que se presiona una tecla. De lo contrario, es incrementada cada 4 segundos por VBLANK (Vea las ubicaciones 18 a la 20; $12 a la $14). Cuando el valor en ATRACT llega a 127 ($7F), se establece en 254 ($FE) hasta que finalice el modo atracción. Esto establece en 1 la bandera para reducir la luminancia y rotar los colores cuando el Atari está inactivo. Haga POKE con 128 ($80) en esta ubicación para ver este efecto inmediatamente: normalmente toma entre 7 y 9 minutos habilitar el modo atracción. El Sistema Operativo no puede rotar los colores generados por los DLI22, aunque su rutina DLI puede hacerlo, con una pérdida de tiempo.

Los joysticks por sí solos no establecen en 0 la ubicación 77. Para evitar que el Atari entre en modo atracción si no está utilizando ninguna entrada desde el teclado, tiene que agregar un POKE 77,0 a su programa o llamar frecuentemente a una subrutina.


22 DLI (Display List Interrupt - Interrupción de la Lista de Despliegue) es una técnica de programación que le permite al usuario combinar distintos modos gráficos en una sola pantalla. (N. del T.)

78

4E

DRKMSK

 

 

La máscara23 de oscuridad del modo atracción. Se establece en 254 ($FE) para obtener un brillo normal en la pantalla cuando el modo atracción está inactivo (Vea la ubicación 77). Cuando el modo de atracción esté activo, ponga un 246 ($F6) en esta ubicación para garantizar que la luminancia del color de la pantalla no supere el 50%. El valor inicial de esta ubicación es 254 ($FE).


23 Una máscara es un conjunto de bits que, por medio de una operación lógica binaria (AND, OR, EOR, ...), permiten extraer de manera selectiva los datos almacenados en otro conjunto de bits. Por ejemplo, podemos tener almacenada la máscara 00001111 en una ubicación de memoria y hacerle AND con otra ubicación donde se encuentran los datos de los que deseamos obtener sólo los 4 bits menos significativos (los 4 de la derecha). (N. del T.)

79

4F

COLRSH

 

 

Máscara del cambio de color. Este registro alterna los colores del modo atracción. En la etapa 2 del VBLANK se toman los registros de color y se les hace EOR con las ubicaciones 78 y 79 (Vea las ubicaciones 18 a la 20; $12 a la $14). Cuando COLRSH se establece en 0 y la ubicación 78 contiene el valor 246, la luminancia del color se reduce en un 50%. COLRSH contiene el valor actual de la ubicación 19. Por lo tanto, se le asigna un nuevo valor de color cada 4,27 segundos.

Los bytes del 80 al 122 ($50 al $7A) son utilizados por el editor y el controlador de la pantalla.

80

50

TEMP

 

 

Registro temporal utilizado por el controlador de la pantalla para mover datos desde y hacia la pantalla. También llamado TMPCHR.

81

51

HOLD1

 

 

Tiene la misma función que la ubicación 80. También se utiliza para almacenar el número de entradas de la Lista de Despliegue.

82

52

LMARGN24

 

 

Corresponde a la columna del margen izquierdo del texto (Solamente en el modo gráfico 0 o en la ventana de texto). 0 es el valor del borde izquierdo de la pantalla. El valor inicial de LMARGN es 2. Puede hacer POKE en las ubicaciones de los márgenes para configurarlos según las necesidades específicas de su programa. Por ejemplo, puede hacer POKE 82,10 para que el margen izquierdo comience 10 ubicaciones contando desde el borde de la pantalla.


24 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

83

53

RMARGN25

 

 

Corresponde al margen derecho de la pantalla de texto. Su valor inicial es 39 ($27). Ambas ubicaciones, la 82 y 83, son modificables por el usuario, pero se ignora en todos los modos excepto en el modo gráfico 0 y la ventana de texto. Los márgenes funcionan con la ventana de texto y el modo pizarrón y vuelven a sus valores predeterminados cuando se presiona la tecla RESET. Los márgenes no tienen efecto sobre el desplazamiento (scrolling) ni sobre la impresora. Sin embargo, las teclas DELETE LINE e INSERT LINE eliminan o insertan líneas de 40 caracteres (o borran una línea de programa), las que siempre comienzan en el margen izquierdo y rodean el borde de la pantalla hasta llegar al margen izquierdo nuevamente. El margen derecho se ignora en el proceso. Además, las líneas lógicas constan siempre de 3 líneas físicas sin importar qué tan largas o cortas sean.

El pitido que escucha cuando se está llegando al final de la línea lógica funciona basado en la posición del cursor en la pantalla, independientemente de los márgenes. Intente establecer el margen izquierdo en 25 (Haga POKE 82,25) y escriba unas cuantas líneas de caracteres. Aunque tenga sólo un poco más de 60 caracteres, el timbre seguirá sonando en la tercera línea de texto.


25 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

84

54

ROWCRS

 

 

Corresponde a la fila actual del cursor en la pantalla de gráficos o de texto, valor que varía entre 0 y 191 ($BF), dependiendo del modo gráfico actual (Es decir, el número máximo de filas menos 1). ROWCRS, junto con la ubicación 85 que viene a continuación, definen la posición del cursor que es usada en el próximo elemento que se lee/escribe en la pantalla. Las filas son las líneas horizontales que van de izquierda a derecha en la pantalla del televisor. La fila 0 es la línea superior; la fila 192 es el valor máximo para la línea inferior.

85,86

55,56

COLCRS

 

 

Corresponde a la columna actual del cursor en la pantalla de gráficos o texto. Los valores varían entre 0 y 319 (Para el modo gráfico 8, esta ubicación corresponde al byte más significativo), dependiendo del modo gráfico actual (Es decir, el número máximo de columnas menos 1). En los modos gráficos del 0 al 7, la ubicación 86 siempre es igual a 0. La posición inicial es 0,0 (Es decir, la esquina superior izquierda). Las columnas son las líneas verticales que van de arriba hacia abajo en la pantalla del televisor. La columna más a la izquierda es la número 0 y la columna más a la derecha tiene el valor máximo del modo gráfico en uso. El cursor hace un recorrido completo de arriba a abajo y de izquierda a derecha en la pantalla.

ROWCRS y COLCRS definen la ubicación del cursor que tendrá el próximo elemento que se leerá o escribirá en el segmento de la pantalla principal. Para el cursor de la ventana de texto, los valores en las ubicaciones 656 a la 667 ($290 a la $29B) se intercambian con los valores actuales en las ubicaciones 84 a la 95 ($54 a la $5F), y se le asigna 255 ($FF) a la ubicación 123 ($7B) para indicar que se ha realizado el intercambio. ROWCRS y COLCRS también se utilizan en las funciones DRAW y FILL del Sistema Operativo para almacenar los valores del punto final de la línea que se está dibujando. El color de la línea se almacena en la ubicación 763 ($2FB). Estos valores se cargan en las ubicaciones 96 a la 98 ($60 a la $62) para que ROWCRS y COLCRS puedan ser modificados durante la operación.

La instrucción LOCATE del BASIC no sólo examina la pantalla, sino que también mueve el cursor una posición a la derecha en la siguiente instrucción PRINT o PUT que se ejecute. Esto lo hace actualizando las ubicaciones 84 y 85, descritas más arriba. Puede anular el avance del cursor guardando el contenido de la pantalla antes del comando LOCATE y luego restaurándolo después de su ejecución. Intente lo siguiente:

100  REM: LA PANTALLA DEBE HABER SIDO ABIERTA PREVIAMENTE EN MODO LECTURA O LECTURA/ESCRITURA
110  MIRAR = PEEK(84): OBSERVAR = PEEK(85)
120  LOCATE X,Y,ESTO
130  POKE 84, MIRAR: POKE 65, OBSERVAR

Tenga en cuenta que CHR$(253) es un carácter no imprimible (el timbre) y no afecta la posición del cursor. Para ver un ejemplo del uso de COLCRS para la restauración y actualización dinámica de datos con el editor de pantalla y los IOCBs, consulte la edición de agosto de 1981 de la revista COMPUTE! .

87

57

DINDEX26

 

 

Corresponde al modo de visualización o modo de pantalla actual. Etiquetado como CRMODE en (*M). DINDEX almacena el número obtenido de los 4 bits de orden inferior del byte auxiliar #1 que ha sido abierto más recientemente con el comando OPEN. Al hacer POKE en DINDEX con un número del 0 al 11, se puede engañar al Sistema Operativo y hacerle creer que está en un modo gráfico distinto. Haga POKE en esta ubicación con un 7 después de haber ingresado al modo gráfico 8 y obtendrá una pantalla dividida con el modo gráfico 7 en la parte superior y el modo 8 debajo. Sin embargo, para poder utilizar ambas mitades de la pantalla, tiene que modificar la ubicación 89 (que se detalla a continuación) para que apunte al área de la pantalla en la que desea hacer DRAW (Para más detalles, vea las páginas de la 280 a la 283 del libro Your Atari 400/800).

Esté atento a los errores de cursor fuera de rango (número 141) al cambiar los modos gráficos de esta manera o cuando se hace PRINT o DRAW en la nueva pantalla de modo. Haga POKE en la ubicación 87 usando el número del modo gráfico BASIC, y no con el número del modo gráfico ANTIC.

¿Sabía que puede usar PLOT o DRAWTO en el modo gráfico 0? Pruebe lo siguiente:

10 GR.0 
20 PLOT 0,0: DRAWTO 10,10: DRAWTO 0,10
30 DRAWTO 39,0: DRAWTO 20,23: DRAWTO 0,20
40 GOTO 40

También puede configurar la ventana de texto para los modos gráficos que usan PRINT y DRAWTO haciendo POKE en la ubicación 87 con el modo gráfico para la ventana. Luego debe hacer POKE en las ubicaciones 88 y 89 ($58, $59) con la dirección de la esquina superior izquierda de la ventana de texto. El modo de pantalla de la ventana de texto se almacena en la ubicación 659 ($293).

Es posible que ya haya descubierto que no puede llamar a los modos gráficos del GTIA desde un comando directo. Al igual que los modos gráficos "+16", solo se pueden llamar durante un programa y la visualización en pantalla se restablece al modo gráfico 0 con la primera instrucción INPUT o PRINT (no PRINT#6) ejecutada en estos modos.

Dado que esta ubicación solo acepta modos gráficos BASIC, no puede usarla con otros modos ANTIC como el "E", el famoso modo "7 y medio", que ofrece una resolución más alta que una pantalla de 7 y 4 colores (Este modo es el que usa el programa Micropainter de Datasoft). Si no está dibujando en la pantalla y simplemente la usa para fines de visualización, siempre puede ir a la Lista de Despliegue y cambiar las instrucciones allí mismo. Pero si intenta dibujar en la pantalla, corre el riesgo de cometer un error de fuera de límites (Es decir, error número 141).

Para ver una excelente revisión del modo gráfico 7 1/2, consulte la revista Creative Computing de marzo de 1982. Puede utilizar la siguiente subrutina corta para cambiar la Lista de Despliegue a modo gráfico 7 1/2:

1000  GRAPHICS 8+16: DLIST = PEEK(560) + PEEK(561) * 256:POKE DLIST + 3,78
1010  FOR CAMBIO = DLIST + 6 TO DLIST + 204: IF PEEK(CAMBIO) = 15 THEN POKE CAMBIO,14
1020  IF PEEK (CAMBIO) = 79 THEN POKE CAMBIO,78: NEXT CAMBIO
1030  POKE 87,7:RETURN

(En realidad, 15 ($F) es el número en la Lista de Despliegue para el modo de memoria máxima. También indica los modos gráficos del 8 al 11. Las Listas de Despliegue de estos modos gráficos son idénticas). 14 corresponde al modo gráfico E de ANTIC, es decir, el modo gráfico 7 1/2. Este programa simplemente cambia el modo gráfico 8 de BASIC al modo E en la Lista de Despliegue. El valor 79 corresponde a 64 + 15. Es decir, a la pantalla del modo gráfico 8 del BASIC con el bit 6 establecido en 1 para una instrucción LMS (Load Memory Scan - Escaneo de Memoria de Carga). Para más detalles acerca de la Lista de Despliegue, consulte las ubicaciones 560 y 561 ($230, $231). No se realiza la comprobación de los otros bits en la Lista de Despliegue.

También puede hacer POKE en la ubicación 87 con los valores GTIA (del 9 al 1127). Para obtener una ventana de pseudotexto en los modos GTIA, primero haga POKE usando el número de modo en esta ubicación y luego POKE en la ubicación 623 con 64 para el modo gráfico 9, 128 para el modo gráfico 10 y 192 para el modo gráfico 11, y finalmente haga POKE en la ubicación 703 usando 4, en el Modo Programa (en el Modo Comando28, se regresa al modo gráfico 0). De esta manera, no puede leer el texto en la ventana, pero puede escribir en ella. Sin embargo, para obtener una ventana de texto real, necesita utilizar una Interrupción de la Lista de Despliegue. (Para más detalles, vea la revista COMPUTE! de septiembre de 1982). Si no tiene el chip GTIA, aún es posible simular esos modos gráficos usando DINDEX con cambios en la Interrupción de la Lista de Despliegue. Consulte la revista COMPUTE! de julio de 1981, encontrará un ejemplo de simulación de modo gráfico 10.


26 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

27 Encuentre información adicional para estos modos gráficos en la Adenda. (N. del T.)

28 En BASIC, el Modo Comando es cuando se ejecutan las instrucciones en modo directo o inmediato, sin precederlas de un número de línea. En el Modo Programa o Diferido, las instrucciones van precedidas de un número de línea, lo que establece su orden de ejecución. (N. del T.)

88,89

58,59

SAVMSC29

 

 

Aquí se almacena la dirección más baja de la memoria de la pantalla, correspondiente a la esquina superior izquierda de la pantalla (donde se desplegará el valor almacenado en esta dirección). La esquina superior izquierda de la ventana de texto se almacena en las ubicaciones 660 y 661 ($294 y $295).

Puede comprobarlo usted mismo ejecutando lo siguiente:

VENTANA = PEEK(88) + PEEK(89) * 256: POKE VENTANA,33

Esto coloca la letra "A" en la esquina superior izquierda en los modos gráficos 0, 1 y 2. En los otros modos gráficos, imprime un bloque o una barra de color. Para ver este efecto, pruebe lo siguiente:

5   REM PRIMERO LIMPIAMOS LA PANTALLA
10  GRAPHICS Z: IF Z > 59 THEN END
15  PANTALLA = PEEK (88) + PEEK (89) * 256
20  FOR N = 0 TO 255: POKE PANTALLA + N,N
25  NEXT N: FOR N = 1 TO 300: NEXT N:Z = Z + 1
30  GOTO 10

Note que se obtiene el código de carácter interno de Atari, y no el código ATASCII. Para más detalles, vea también las ubicaciones 560 y 561 ($230 y $231), y 57344 ($E000).

¿Cómo se averigua la RAM total de la pantalla? Primero, consulte la tabla a continuación y encuentre su modo gráfico. Luego multiplique la cantidad de filas por la cantidad de bytes por línea. Esto le indica cuántos bytes utiliza cada pantalla. Sume este valor a la dirección especificada por la ubicación SAVMSC, y réstele 1. Sin embargo, si a RAMTOP (ubicación 106; $6A, multiplicado por 256 para obtener la cantidad de bytes) le resta MEMTOP (ubicaciones 741 y 742; $2E5 y $2E6), verá que hay más memoria reservada que solo el área de la pantalla. El espacio extra lo ocupa la Lista de Despliegue o la ventana de texto, o simplemente no se utiliza. (Vea el segundo gráfico a continuación).

Modo
0
1
2
3
4
5
6
7
8
9-12
                     
Filas
Completa
24
24
12
24
48
48
96
96
192
192
Dividida
--
20
10
20
40
40
80
80
160
--
 
Bytes por Línea
40
20
20
10
10
20
20
40
40
40
 
Columnas por Línea
40
20
20
40
80
80
160
160
320
80
 
Memoria (1)
993
513
261
273
537
1017
2025
3945
7900
7900
 
Memoria (2)
Completa
992
672
420
432
696
1176
2184
4200
8138
8138
Dividida
--
674
424
434
694
1174
2174
4190
8112
--

(1) Según la página 45 del Manual de Referencia del Atari BASIC, la página 172 del Manual del Usuario del Sistema Operativo, y la página 360 del libro Your Atari 400/800.

(2) Según la página 274 del libro Your Atari 400/800, y la página 69 del manual del Basic Atari de Microsoft. Este es también el valor que se obtiene cuando a RAMTOP se le resta MEMTOP (Vea más arriba).

Por ejemplo, para hacer POKE a toda la RAM de la pantalla en modo gráfico 4, debe encontrar la dirección de inicio de la pantalla (PEEK(88) + PEEK(89) * 256), y luego utilizar un ciclo FOR-NEXT para hacer POKE a todas las ubicaciones especificadas anteriormente:

10 GRAPHICS 4: PANTALLA = PEEK(88) + PEEK(89) * 256
20 FOR CICLO = PANTALLA TO PANTALLA + 479: REM 48 FILAS * 10 BYTES - 1
30 POKE CICLO,35: NEXT CICLO

¿Por qué el menos 1 en el cálculo? El primer byte de la pantalla es el primero del ciclo. Si sumamos el tamaño total, nos pasaremos un byte al final del espacio, por lo que restamos 1 al total. A continuación, se explica cómo llegar al valor de la cantidad total de memoria asignada para el uso de la pantalla, la Lista de Despliegue y la ventana de texto:

Asignación total de memoria para la pantalla
 
Despliegue de la pantalla
Lista de Despliegue

GR
Ventana de texto
siempre sin uso
bytes condicionales
uso de la pantalla
bytes sin uso
bytes usados
Total

0
...
ninguno
ninguno
960
ninguno
32
992
1
160
ninguno
80
400
ninguno
34
674
2
160
ninguno
40
200
ninguno
24
424
3
160
ninguno
40
200
ninguno
34
434
4
160
ninguno
80
400
ninguno
54
694
5
160
ninguno
160
800
ninguno
54
1174
6
160
ninguno
320
1600
ninguno
94
2174
7
160
ninguno
640
3200
96
94
4190
8
160
16
1280
6400
80
176
8112

La cantidad de bytes de RAMTOP (ubicación 106; $6A) se cuenta desde la columna "Ventana de Texto" a la izquierda hacia la columna "Total". MEMTOP (ubicaciones 741 y 742; $2E5 y $2E6) apunta a un byte debajo de RAMTOP * 256, menos la cantidad de bytes en la columna Total. Si se suma 16 al modo gráfico (para que este no tenga ventana de texto), entonces los bytes condicionales no utilizados se suman al total. Luego, los bytes que normalmente se suman para la ventana de texto dejan de usarse y la Lista de Despliegue se expande ligeramente. (Vea la revista COMPUTE! de septiembre de 1981). Cuando se limpia la pantalla normalmente usando PRINT CHR$(125), el computador Atari pone ceros en la memoria comenzando en las ubicaciones 88 y 89. Continúa haciendo esto hasta que alcanza un byte menos que el contenido de RAMTOP (ubicación 106; $6A). Sin embargo, aquí tenemos una potencial fuente de conflicto con su programa: ¡CHR$(125)--CLEAR SCREEN--y cualquier comando GRAPHICS en realidad continúa borrando los primeros 64 ($40) bytes por encima de RAMTOP!.

Esto no tiene ningún efecto en BASIC, ya que este es una ROM en un cartucho30. El listado del código fuente del Sistema Operativo parece indicar que termina en RAMTOP, pero Atari asumió que no habría nada después de RAMTOP, por lo que no se proporcionaron verificaciones. No reserve ningún dato dentro de los 64 bytes a partir de RAMTOP o de lo contrario será consumido por la rutina CLEAR SCREEN, o en su defecto, evite utilizar un comando CLEAR SCREEN o GRAPHICS. Al desplazar la ventana de texto también se borran 800 bytes de memoria por encima de RAMTOP.

Puede limpiar otras áreas de memoria haciendo POKE en la ubicación SAVMC usando el bit menos significativo seguido del bit más significativo de la ubicación de comienzo del área a limpiar. Su rutina siempre debe finalizar en un límite $FF (255). (RAMTOP indica el número de páginas). Recuerde volver a hacer POKE en las ubicaciones apropiadas de la pantalla o usar un comando GRAPHICS para volver a configurar la pantalla correctamente. Puede intentar lo siguiente:

10 ABAJO=30000:ARRIBA=36863:REM DIRECCION MAS BAJA Y MAS ALTA A LIMPIAR = $7530 & $8FFF
20 RAMTOP=PEEK(106):POKE 106,INT((ARRIBA+1)/256)
30 PRUEBA=INT(ABAJO/256):POKE 89,PRUEBA
40 POKE 88,ABAJO-256*PRUEBA
50 PRINT CHR$(125):POKE 106,RAMTOP
60 GRAPHICS 0

Esto borra el área de memoria especificada y actualiza la dirección de la memoria de la pantalla. Si no se especifica un valor para la variable TOP, la limpieza de pantalla de la línea 50 continuará limpiando alegremente la memoria y, muy probablemente, provocará que su programa se bloquee. Úselo con precaución.

A continuación le mostramos un método en BASIC para guardar en el disco su pantalla actual en modo gráfico 7:

1000 PANTALLA=PEEK(88)+PEEK(89)*256
1010 OPEN #2,8,0,"D:IMAGEN"
1020 MODE=PEEK(87):PUT #2,MODE:REM GUARDAR MODO GRAFICO
1030 FOR PAN=0 TO 4:COL=PEEK(708+PAN):PUT #2,COL:NEXT PAN:REM GUARDAR REGISTROS DE COLOR
1040 FOR TV=PANTALLA TO PANTALLA+3199:BYTE=PEEK(TV):PUT #2,BYTE:NEXT TV:CLOSE #2

Para usarlo con otros modos de pantalla, tiene que cambiar el valor 3199 de la línea 1040 para adaptarlo a la RAM de su pantalla (Consulte la tabla de más arriba). Por ejemplo, GRAPHICS 7 + 16 requiere 3.839 bytes (3.840 menos 1). Puede utilizar la misma rutina con el cassette utilizando el dispositivo C:. Para recuperar su imagen, utilice los comandos GET#2 y POKE. Sin embargo, encontrará que ambas rutinas son muy lentas. En su lugar, pruebe esta rutina de guardado en lenguaje de máquina que usa los IOCBs y la rutina CIO en la ubicación 58454 ($E456):

10 DIM ML$(10),B$(10):GRAPHICS 8+16
20 B$="nombre de su foto:":Q=PEEK(559)
30 FOR N=1 TO 6:READ BYTE:ML$(N,N)=CHR$(BYTE):NEXT N
35 DATA 104,162,16,76,86,228
36 REM PLA,LDX,$10,JMP $E456
40 OPEN #1,4,0,B$
50 POKE 849,1:POKE 850,7:POKE 852,PEEK(88):POKE 853,PEEK(89):POKE 856,70:POKE 857,30:POKE 858,4
55 REM ESTOS POKES CONFIGURAN EL IOCB
60 POKE 559,0:REM APAGAR LA PANTALLA PARA ACELERAR LAS COSAS
70 X=USR(ADR(ML$)):CLOSE #1
80 POKE 559,Q:REM VUELVA A ENCENDERLA

Tenga en cuenta que este programa no guarda los registros de color, por lo que le sugiero que lo haga inmediatamente después de haber guardado la imagen. Es más fácil recuperar estos datos si están al final del archivo. Tiene que realizar los ajustes necesarios al guardar una imagen en un formato distinto al modo gráfico 8+16, como por ejemplo cambiar la cantidad total de memoria de pantalla que se va a guardar o que se usará para hacer POKE en las ubicaciones 856 y 857. Además, necesita una línea como 1000 GOTO 1000 para mantener intacta la pantalla, ya sea que esté usando un modo GTIA o un modo gráfico "+16". Para obtener más información sobre esta idea, consulte la columna de Atari en la revista InfoAge de julio de 1982. Para obtener algunas ideas sobre cómo desplazar (scrolling) la RAM de la pantalla, consulte la ubicación 54277 ($D405).


29 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

30 Sólo en los modelos Atari 400/800. En los modelos XL/XE, el BASIC viene incorporado.(N. del T.)


UNA GENERALIDAD BREVE

En este libro se usan 2 técnicas para llamar a un programa en lenguaje de máquina desde el BASIC usando el comando USR. Un método consiste en introducir los valores en una dirección específica (por ejemplo, la Página Seis) y utilizar la dirección de inicio en la llamada al comando USR, como por ejemplo X = USR(1536). Para ver un ejemplo de esta técnica, consulte la ubicación 632 ($278).

La otra técnica, utilizada anteriormente, es crear una cadena (string) (por ejemplo, ML$) a partir de la rutina, asignando a los elementos de la cadena los equivalentes decimales del código en lenguaje de máquina mediante un ciclo FOR-NEXT y READ-DATA. Para llamar a esta rutina, se debe utilizar el comando X = USR(ADR(ML$)). Esto le indica al Atari que llame a la rutina de lenguaje de máquina ubicada en la dirección donde está almacenado ML$. Esta dirección cambia con el tamaño del programa y el uso de la memoria. El método de cadena no será sobrescrito por otra rutina o dato ya que flota de forma segura en la memoria. La dirección de la cadena en sí se almacena en la tabla de cadenas y arreglos (array) de la ubicación 140 ($8C).


90

5A

OLDROW

 

 

La fila anterior del cursor gráfico. Antes de cada operación, OLDROW se actualiza con el contenido de la ubicación 84 ($54). OLDROW se utiliza para determinar la fila de inicio de los comandos DRAWTO y XIO 18 (comando FILL del Sistema Operativo).

91,92

5B,5C

OLDCOL

 

 

La columna anterior del cursor gráfico. Antes de cada operación, OLDCOL se actualiza con el contenido de las ubicaciones 85 y 86 ($55 y $56). La ubicación OLDCOL se utiliza para determinar la columna de inicio del dibujo o relleno a realizar usando los comandos DRAWTO y XIO 18 (comando FILL del Sistema Operativo).

93

5D

OLDCHR

 

 

Valor del carácter que se encuentra en la posición del cursor. Se usa para restaurarlo cuando el cursor se mueve.

94,95

5E,5F

OLDADR

 

 

Dirección de memoria de la posición actual del cursor. Se utiliza junto con la ubicación 93 (la ubicación anterior) para restaurar el carácter que se encuentra en la posición del cursor cuando éste se mueve.

96

60

NEWROW

 

 

Fila de destino de los comandos DRAWTO y XIO 18 (comando FILL).

97,98

61,62

NEWCOL

 

 

Columna de destino de los comandos DRAWTO y XIO 18 (comando FILL). NEWROW y NEWCOL se inicializan con los valores de ROWCRS y COLCRS (ubicaciones 84 a la 86; $54 a la $56), descritos un poco más arriba. Estos valores representan el punto de destino de las funciones de dibujo y relleno. Esto se hace para que las ubicaciones ROWCRS y COLCRS puedan ser modificadas durante la ejecución de estas rutinas.

99

63

LOGCOL

 

 

Columna actual de la posición del cursor en una línea lógica. El valor de LOGCOL puede variar entre 0 y 119, debido a que una línea lógica puede contener hasta 3 líneas físicas. Utilizado por el controlador de la pantalla.

100,101

64,65

ADRESS

 

 

Ubicación temporal utilizada por el controlador de la pantalla para almacenar la dirección de la Lista de Despliegue, el búfer de la línea (ubicaciones 583 a la 622; $247 a la $26E), el nuevo valor de MEMTOP después de su entrada a la Lista de Despliegue, las direcciones de la fila y la columna, el valor de DMASK, los datos a la derecha del cursor, el desplazamiento (scroll), la eliminación de caracteres, la rutina de borrado de pantalla y la dirección de la memoria de pantalla (ubicaciones 88 y 89; $58 y $59).

102,103

66,67

MLTTMP

 

 

También llamado OPNTMP y TOADR. Corresponde al primer byte utilizado en el comando OPEN como almacenamiento temporal. El controlador de la pantalla también lo utiliza como almacenamiento temporal.

104,105

68,69

SAVADR

 

 

También llamado FRMADR. Almacenamiento temporal, utilizado con la ubicación ADRESS descrita un poco más arriba, para guardar los datos debajo del cursor y los datos de la línea en movimiento en la pantalla.

106

6A

RAMTOP31

 

 

Tamaño de la memoria RAM, definido al momento de encender el equipo, obtenido desde TRAMSZ (ubicación 6), y expresado en el número total de páginas disponibles (una página equivale a 256 bytes, por lo que PEEK(106) * 256 le indica dónde cree el Atari que está la última dirección --byte-- utilizable de la RAM). MEMTOP (ubicaciones 741 y 742; $2E5 y $2E6) no puede extenderse más allá de este valor. En un Atari de 48K, RAMTOP se inicializa en 160 ($A0), la que apunta a la ubicación 40960 ($A000). La dirección más alta del usuario es un byte menos que este valor.

Inicialmente el valor de esta ubicación es el mismo que el de la ubicación 740. PEEK(740)/4 o PEEK(106)/4 devuelven la cantidad de bloques de 1K. Mediante el siguiente comando puede engañar al computador para que piense que tiene menos memoria de la que realmente hay, reservando así un área relativamente segura para sus datos (por ejemplo, para su nuevo conjunto de caracteres o sus gráficos P/M (player/missile)) o subrutinas de lenguaje de máquina:

POKE(106), PEEK(106) - # de páginas que desea reservar.

El valor de RAMTOP corresponde al número de páginas de memoria (bloques de 256 bytes) presentes. Es útil saber esto cuando se necesita cambiar la memoria RAM de la pantalla de los modos gráficos 7 y 8. Si está reservando memoria para gráficos P/M, haga POKE 54279, PEEK(106) - # de páginas que está reservando, antes de hacer POKE en la ubicación 106 con ese valor. Para comprobar si ha excedido su memoria reservando demasiado espacio, puede utilizar lo siguiente:

10 SIZE=(PEEK(106) - # de páginas) * 256
20 IF SIZE<=PEEK(144)+PEEK(145)*256 THEN PRINT "DEMASIADA MEMORIA UTILIZADA"

Si mueve RAMTOP para reservar memoria, siempre ejecute un comando GRAPHICS (funciona incluso si usa el mismo modo gráfico en el que se encuentra) inmediatamente después para que la Lista de Despliegue y los datos se muevan debajo del nuevo RAMTOP.

Debe tener en cuenta que un comando GRAPHICS y un comando CLEAR (o PRINT CHR$(125)) en realidad borran los primeros 64 bytes por encima de RAMTOP (Para obtener más información, consulte la ubicación 88; $58).

Al desplazarse por la ventana de texto de un modo gráfico, se borran hasta 800 ($320) bytes por encima de RAMTOP (El desplazamiento de la ventana de texto en realidad desplaza una pantalla en modo gráfico 0 entera de datos, por lo que las 20 líneas no vistas * 40 bytes equivalen a 800 bytes). Los gráficos P/M pueden estar seguros (a menos que se desplace la ventana de texto) ya que los primeros 384 o 768 bytes (resolución de línea doble o simple, respectivamente) no se utilizan.

Sin embargo, debe tener en cuenta ambos efectos al escribir sus programas.

Para descubrir el final /exacto/ de la memoria, utilice esta rutina (que es un poco lenta):

10 RAMTOP=106:ARRIBA=PEEK(RAMTOP)
20 BYTE=ARRIBA*256:PRUEBA=255-PEEK(BYTE):POKE BYTE,PRUEBA
30 IF PEEK(BYTE)=PRUEBA THEN ARRIBA=ARRIBA+1:POKE BYTE,255-PRUEBA
40 GOTO 20
50 PRINT "LA MEMORIA TERMINA EN ";BYTE

Una precaución: BASIC no siempre puede manejar bien la configuración de la Lista de Despliegue y de la memoria de pantalla cuando en los modos gráficos 7 y 8 se modifica esta ubicación en menos de 4K (16 páginas; 4096 bytes). Por ejemplo, pueden producirse algunos resultados extraños si utiliza PEEK(106)-8 en estos modos gráficos. Utilice un mínimo de 4K (PEEK(106)-16) para evitar estos problemas. Esto puede explicar por qué algunas personas tienen dificultades con los gráficos de player/missiles en los modos de alta resolución (modos gráficos 7 y 8). Para más detalles, vea la ubicación 54279 ($D407).

Otra alternativa para reservar memoria en la RAM superior es guardar un área debajo de MEMLO, ubicación 743 ($2E7), es decir, justo debajo de su programa BASIC. Vea también MEMTOP, en las ubicaciones 741 y 742 ($2E5 y $2E6).


31 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

107

6B

BUFCNT

 

 

Recuento del búfer: el contador del tamaño de línea lógica actual del editor de pantalla.

108,109

6C,6D

BUFSTR

 

 

Esta ubicación almacena el byte inferior del Editor (AM). Es el puntero de la rutina GETCH del editor de pantalla (ubicación 62867 para su entrada; $F593). Almacenamiento temporal. Devuelve el carácter señalado por BUFCNT, descrito en la ubicación anterior.

110

6E

BITMSK

 

 

Corresponde a la máscara de bits utilizada por el controlador de la pantalla del Sistema Operativo en las rutinas de mapeo de bits, que se encuentran en las ubicaciones 64235 a la 64305 ($FAEB a la $FB31). También se utiliza como registro de almacenamiento temporal del controlador de la pantalla.

111

6F

SHFAMT

 

 

Corresponde a la justificación (centrado) de los pixeles: indica qué tanto se deben desplazar los datos de salida de los pixeles justificados a la derecha, o qué tanto se debe desplazar los datos de entrada para justificarlos a la derecha. Antes del proceso de centrado, este valor siempre es el mismo que el de la ubicación 672 ($2A0).

112,113

70,71

ROWAC

 

 

ROWAC y COLAC (la ubicación que viene a continuación) son acumuladores funcionales para el control del trazado de puntos (plotting) de filas y columnas y las funciones de incremento y decremento.

114,115

72,73

COLAC

 

 

Esta ubicación controla la columna del trazado de puntos.

116,117

74,75

ENDPT

 

 

Punto final de la línea a trazar. Contiene el valor más grande de DELTAR o DELTAC (ubicaciones 118 y 119, que vienen a continuación) para usarse junto con ROWAC y COLAC (ubicaciones 112 y 114, las de arriba) para controlar el trazado de puntos de líneas.

118

76

DELTAR32

 

 

Fila del delta o diferencia. Contiene el valor absoluto de NEWROW (ubicación 96; $60) menos ROWCRS (ubicación 84; $54).


32 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

119,120

77,78

DELTAC

 

 

Columna del delta o diferencia. Contiene el valor absoluto de NEWCOL (ubicación 97; $61) menos el valor de COLCRS (ubicación 85; $55). Estos valores del registro delta, junto con las ubicaciones 121 y 122 que vienen a continuación, se utilizan para definir la pendiente de la línea que se dibujará.

121

79

ROWINC33

 

 

Valor de incremento o decremento de la fila (más o menos 1).


33 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

122

7A

COLINC34

 

 

Valor de incremento o decremento de la columna (más o menos 1). ROWINC y COLINC controlan la dirección de la rutina de dibujo de una línea. Los valores representan los signos derivados del valor de NEWROW (ubicación 96; $60) menos el valor de ROWCRS (ubicación 84; $54), y el valor de NEWCOL (ubicaciones 97 y 98; $61 y $62) menos el valor de COLCRS (ubicaciones 85 y 86; $55 y $56).


34 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

123

7B

SWPFLG

 

 

Control del cursor en la pantalla dividida. Si la RAM de la ventana de texto y la RAM normal están intercambiadas, esta ubicación es igual a 255 ($FF); de lo contrario, es igual a 0. En los modos de pantalla dividida, los datos del cursor de los gráficos y los datos de la ventana de texto se intercambian con frecuencia para obtener los valores asociados con el área a la que se accede y moverlos a las ubicaciones 84 a la 95 ($54 a la $5F) de la base de datos del Sistema Operativo. SWPFLG ayuda a realizar un seguimiento de qué conjunto de datos se encuentra en estas ubicaciones.

124

7C

HOLDCH

 

 

Valor de un carácter antes de que se procesen la lógica de control y el desplazamiento del mismo.

125

7D

INSDAT

 

 

Byte de almacenamiento temporal, utilizado por el controlador de la pantalla para almacenar el carácter en el que se encuentra el cursor, y la detección del final de la línea.

126,127

7E,7F

COUNTR35

 

 

Inicialmente esta ubicación almacena el valor más grande de DELTAR (ubicación 118; $76) o DELTAC (ubicación 119; $77). Este es el número de iteraciones necesarias para dibujar una línea. A medida que se dibuja cada punto de una línea, este valor disminuye. Cuando este byte es igual a 0, la línea ha sido dibujada por completo.


35 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)


Aquí comienza la memoria RAM de la Página Cero del usuario y/o del BASIC. Las ubicaciones 128 a la 145 ($80 a la $91) se usan para almacenar los punteros de sus programas BASIC. Las ubicaciones 146 a la 202 ($92 a la $CA) corresponden a la memoria RAM miscelánea del BASIC. Las ubicaciones 203 a la 209 ($CB a la $D1) no son utilizadas por BASIC. Las ubicaciones 210 a la 255 ($D2 a la $FF) corresponden al área de trabajo de las rutinas de FP (Floating Point - Coma Flotante) del Sistema Operativo. El cartucho Assembler Editor de Atari utiliza las ubicaciones 128 a la 176 ($80 a la $B0) como su RAM de Página Cero. Dado que el Sistema Operativo no utiliza esta área, usted puede utilizarla en cualquier entorno que no sea el BASIC o que no utilice cartuchos. Si está utilizando otro lenguaje como FORTH, verifique el mapa de memoria de ese programa para ver si se produce algún conflicto.

Para ver una explicación de la estructura del BASIC de Atari, especialmente la que utiliza las ubicaciones 130 a la 137 ($82 a la $89), consulte las páginas de la 26 a la 53 del libro COMPUTE!'s First Book of Atari. Estos tutoriales incluyen utilitarios para análisis de la memoria, para volcado de líneas de programas y para renumeración de líneas de código en BASIC. Vea también el libro De Re Atari, la revista BYTE de febrero de 1982, y las ubicaciones 40960 a la 49151 ($A000 a la $BFFF) de la ROM del BASIC.

128,129

80,81

LOMEM

 

 

Puntero de la memoria baja del BASIC (es decir, que se ubica en el extremo superior del espacio de memoria RAM del Sistema Operativo). Los primeros 256 bytes de la memoria a la que se apunta son el búfer de salida de los tokens que BASIC utiliza para convertir sus instrucciones en representaciones numéricas (Para más detalles acerca de los tokens, consulte las ubicaciones 136 y 137; $88 y $89). Este valor se carga desde MEMLO (ubicaciones 743 y 744; $2E7 y $2E8) durante la inicialización del equipo o la ejecución de un comando NEW (¡Y no al hacer RESET!). Recuerde actualizar este valor al cambiar MEMLO para reservar espacio para los controladores o búfers.

Cuando se ejecuta el comando SAVE en BASIC, se escriben 2 bloques de información: el primer bloque son los 7 punteros de LOMEM a STARP (ubicaciones 128 a la 141; $80 a la $8D). En el proceso, a cada uno de estos punteros de 2 bytes se le resta el valor de LOMEM, por lo que los primeros 2 bytes escritos serán 0. El segundo bloque contiene lo siguiente: la tabla de nombres de variables, la tabla de valores de variables, el programa tokenizado y la línea en Modo Inmediato.

Cuando se ejecuta el comando LOAD en BASIC, a cada uno de los punteros de 2 bytes guardados, tal como se detalló anteriormente, se le suma el valor de MEMLO (ubicaciones 743 y 744; $2E7 y $2E8). Los punteros se colocan nuevamente en la Página Cero y a los valores de RUNSTK (ubicaciones 142 y 143; $8E y $8F) y MEMTOP (ubicaciones 144 y 145; $90 y $91) se les asigna el valor contenido en STARP. Luego, se reservan 256 bytes por encima del valor en MEMLO para el búfer del token de salida, y el programa se lee inmediatamente después de este búfer.

Cuando no se ha cargado DOS ni ningún otro programa de aplicación que utilice poca memoria, LOMEM apunta a 1792 ($700). Cuando DOS 2.0 está presente, apunta a 7420 ($1CFC). Cuando cambian los valores predeterminados de la unidad y del búfer de datos (consulte las ubicaciones 1801 y 1802; $709 y $70A), esta cifra aumenta o disminuye en 128 bytes por cada búfer agregado o eliminado, respectivamente. Cuando se inicia el controlador RS-232, se deben sumar otros 1728 ($6C0) bytes utilizados.

Cuando se usa en el contexto de evaluación de expresiones, BASIC llama ARGOPS a LOMEM. Cuando BASIC encuentra cualquier tipo de expresión, coloca los resultados inmediatos en una pila36. ARGOPS apunta a la misma área de 256 bytes; para esta operación se reserva tanto la pila de argumentos como la de operadores. También se llama OUTBUFF para otra operación, la que apunta al mismo búfer de 256 bytes al que apunta ARGOPS. BASIC utiliza esta ubicación al comprobar la sintaxis de una línea y convertirla en tokens. Este búfer almacena temporalmente los tokens antes de moverlos al programa.


36 Una pila es una estructura de datos en la que el último dato en ingresar es el primero en salir de ella. (N. del T.)

130,131

82,83

VNTP

 

 

Dirección de comienzo de la VNT (Variable Name Table - Tabla de Nombres de Variables). Los nombres de las variables se almacenan en el mismo orden en que se ingresan al programa, en formato ATASCII. Se pueden tener hasta un total de 128 nombres de variables. Estas variables se almacenan como tokens que representan el número de variable en el programa BASIC tokenizado, y se numeran del 128 al 255 ($80 al $FF).

La tabla de nombres de variables almacena las variables que se utilizan en el Modo Directo e incluso las que ya no se utilizan en el programa. Esta tabla de nombres de variables no se borra al guardar (SAVE) un programa. Al cargar un nuevo programa, se reemplaza la VNT actual con la que se recupera desde el archivo. Para guardar su programa en cinta o disco sin estas variables no deseadas de la tabla, debe usar el comando LIST. LIST no guarda las tablas de nombres ni de valores de variables con su programa; almacena el programa en formato ATASCII, y no en formato tokenizado, y requiere usar el comando ENTER para cargarlo. Una vez que haya guardado su programa con el comando LIST, debe utilizar la instrucción NEW para borrar la VNT de la memoria.

Cada nombre de variable se almacena en el orden en que se ingresó, y no en su orden ATASCII. Con las variables numéricas (escalares), el bit más significativo se establece en 1 en el último carácter de su nombre. Con variables de cadena (string), el último carácter es un "$" con el bit 7 establecido en 1. Con variables del tipo arreglo, el último carácter es un "(" con el bit más significativo establecido en 1. Al establecer el bit 7 en 1, el carácter pasa a su representación inversa (es decir, en video inverso) para que pueda ser reconocido fácilmente.

Puede utilizar nombres de variables para las rutinas GOSUB y GOTO, como en este ejemplo:

10 CALCULAR = 1000
.
.
100 GOSUB CALCULAR

Esto puede ahorrar una gran cantidad de bytes para una rutina que es llamada con frecuencia. Pero recuerde, cada variable utilizada para una dirección GOSUB o GOTO utiliza uno de los 128 nombres de variables posibles. Cuando intente utilizar un programa de renumeración de líneas, el usar nombres de variables para las referencias GOTO y GOSUB puede llegar a ser una desventaja. Esto se debe a que los programas de renumeración de líneas no cambian las referencias a líneas con nombres de variables, solo a líneas con referencias numeradas.

Acá tiene una pequeña rutina que puede agregar al comienzo de su programa BASIC (o al final, si cambia los números de línea) para imprimir los nombres de las variables utilizadas en su programa. Puede ejecutar este programa en Modo Directo usando el comando GOTO:

1 POKE 1664,PEEK(130):POKE 1665,PEEK(131)
2 IF PEEK(1664)=PEEK(132) THEN IF PEEK(1665)=PEEK(133) THEN STOP
3 PRINT CHR$(PEEK(PEEK(1664)+PEEK(1665)*256));
4 IF PEEK(PEEK(1664)+PEEK(1665)*256)>127 THEN PRINT "";
5 IF PEEK(1664)=255 THEN POKE 1664,0:POKE 1665,PEEK(1665)+1:GOTO 2
6 POKE 1664,PEEK(1664)+1:GOTO 2

Vea la revista COMPUTE! de octubre de 1981.

132,133

84,85

VNTD37

 

 

Puntero a la dirección más 1 byte del fin de la tabla de nombres de variables. Cuando se tienen menos de 128 variables, esta ubicación apunta a un byte 0 ficticio. Cuando se tienen 128 variables, esta ubicación apunta al último byte más 1 del último nombre de variable.

A menudo resulta útil poder enumerar las variables de su programa. Puede hacerlo utilizando las ubicaciones 130 a la 133 de la siguiente manera:

10 VARI=PEEK(130)+PEEK(131)*256:REM Esto nos da el comienzo de la tabla.
20 FOR VARI=VARI TO PEEK(132)+PEEK(133)*256-1:? CHR$(PEEK(VARI)-128*(PEEK(VARI)>127));
21 PRINT CHR$(27+(128*(PEEK(VARI)>127)));:NEXT VARI
25 REM Encontrar el final de la tabla de nombres de variable (recuerde que la tabla llega hasta fin + 1).
26 REM Luego hace PRINTs de los caracteres < 128
30 NUM=0:FOR VARI=PEEK(130)+PEEK(131)*256 TO PEEK(132)+PEEK(131)*256-1:NUM=NUM+(PEEK(VARI)<127)
31 NEXT VARI:PRINT NUM;" Variables en uso"

Para un ejemplo posiblemente más claro de la misma rutina, pruebe esto:

1000 NUM=0:FOR CICLO=PEEK(130)+PEEK(131)*256 TO PEEK(132)+PEEK(133)*256-1
1010 IF PEEK(CICLO)<128 THEN PRINT CHR$(PEEK(CICLO));:GOTO 1030
1020 PRINT CHR$(PEEK(CICLO)-128):NUM=NUM+1
1030 NEXT CICLO:PRINT :PRINT NUM;" VARIABLES EN USO":END

37 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

134,135

86,87

VVTP

 

 

Dirección de la VVT (Variable Value Table - Tabla de Valores de las Variables). A cada variable en la tabla de nombres se le asignan 8 bytes de la siguiente manera:

Byte
1
2
3
4
5
6
7
8
Variable

Escalar
00
# variable
constante BCD de 6 bytes
Arreglo;con DIM
65
# variable
desplazamiento a partir de STARP
Primera parte del DIM,
más 1
Segunda parte del DIM,
más 1
sin DIM
64
 
 
 
 
Cadena;con DIM
129
# variable
desplazamiento a partir de STARP
largo actual
largo definido en el DIM
sin DIM
128
 
 
 
 

En las variables escalares (numéricas no dimensionadas), los bytes 3 al 8 corresponden al número en coma flotante; el byte 3 es el exponente; el byte 4 contiene los 2 dígitos decimales menos significativos y el byte 8 contiene los 2 dígitos decimales más significativos.

En las variables del tipo arreglo (array), los bytes 5 y 6 contienen el tamaño más 1 de la primera dimensión del arreglo (DIM + 1; byte menos significativo / byte más significativo), y los bytes 7 y 8 contienen el tamaño más 1 de la segunda dimensión (el segundo DIM + 1; byte menos significativo / byte más significativo).

En las variables del tipo cadena, los bytes 5 y 6 contienen la longitud actual de la variable (byte menos significativo / byte más significativo), y los bytes 7 y 8 contienen la dimensión real (hasta 32767). Existe un comando BASIC no documentado, "COM", mencionado sólo en el índice del Manual de Referencia BASIC, que se ejecuta exactamente igual que la declaración "DIM" (Vea la página 346 del libro Your Atari 400/800). Originalmente, se pretendía utilizarla para declarar variables "COMunes".

En todos los casos, el primer byte es siempre uno de los números que aparecen en la tabla anterior (rara vez, o nunca, verá valores no dimensionados en un programa). Este número define qué tipo de información de la variable viene a continuación. El siguiente byte, var # (número de variable), está en el rango del 0 al 127. El desplazamiento (offset) corresponde a la cantidad de bytes contando a partir del comienzo de STARP, en las ubicaciones 140 y 141 ($8C y $8D). Dado que a cada variable se le asignan 8 bytes, puede encontrar los valores de cada variable usando el siguiente programa:

1000 VVTP=PEEK(134)+PEEK(135)*256:INPUT VAR:REM NUMERO DE VARIABLE
1010 FOR CICLO=0 TO 7:PRINT PEEK(VVTP+CICLO+8*VAR):NEXT CICLO

donde VAR es el número de variable, entre 0 y 127.

Si desea asignar el mismo valor a cada elemento de una variable de tipo cadena a la que se le ha hecho DIM, utilice esta sencilla técnica:

10 DIM PRUEBA$(100)
20 PRUEBA$="*":REM O USE PRUEBA$(1)
30 PRUEBA$(100)=PRUEBA$
40 PRUEBA$(2)=PRUEBA$:PRINT PRUEBA$

Al asignar la primera, última y segunda variable al arreglo, en ese orden, su Atari asigna el mismo valor al resto del arreglo. Asegúrese de que el segundo y el último elemento sean iguales a la cadena, y no al valor del carácter (es decir, no utilice TEXT$(2) = "*").

Para ver un ejemplo de cómo guardar números BCD de 6 bytes en un archivo de disco, lo que es muy útil cuando se trabaja con longitudes de registros fijas, consulte el libro De Re Atari.

136,137

88,89

STMTAB

 

 

Dirección de la tabla de sentencias (la que a su vez corresponde al comienzo del programa BASIC del usuario), que contiene todas las líneas de código tokenizadas más las líneas ingresadas por el usuario en Modo Inmediato. Los números de línea se almacenan como números enteros de 2 bytes. A las líneas de Modo Inmediato se les asigna el valor predeterminado 32768 ($8000). Los primeros 2 bytes de una línea tokenizada corresponden al número de línea y el siguiente es un byte ficticio reservado para el recuento de bytes (o desplazamiento) contando desde el comienzo de esta línea hasta el comienzo de la siguiente.

A continuación viene otro byte de conteo, desde el comienzo de esta línea hasta el comienzo de la siguiente sentencia. Estos valores de conteo se establecen solo cuando se completa la tokenización de la línea y de la sentencia. La tokenización se lleva a cabo en un búfer de 256 bytes ($100) que reside al final de la RAM reservada del Sistema Operativo (indicada por las ubicaciones 128 y 129; $80 y $81). Para ver la dirección inicial de los números de línea BASIC, utilice la siguiente rutina:

10 STMTAB=PEEK(136)+PEEK(137)*256
20 NUM=PEEK(STMTAB)+PEEK(STMTAB+1)*256
30 IF NUM=32768 THEN END
40 PRINT "NUMERO DE LINEA: ";NUM;" DIRECCION: ";STMTAB
50 STMTAB=STMTAB+PEEK(STMTAB+2)
60 GOTO 20

La edición de agosto de 1982 de la revista ANTIC proporciona un programa útil para eliminar un rango de números de línea BASIC. Esta rutina se puede agregar a su programa e incluso puede ser usada para eliminarse a sí misma.

138,139

8A,8B

STMCUR38

 

 

Puntero de la sentencia BASIC actual, utilizado para acceder a los tokens que se están procesando actualmente dentro de una línea de la tabla de sentencias. Cuando BASIC está esperando que se ingresen datos desde el teclado, este puntero se establece en el comienzo del Modo Inmediato (línea 32768).

Puede proteger sus programas de ser listados o cargados (¡Solo podrán ejecutarse!) usando la dirección de la Tabla de Nombres de Variables, su longitud y la instrucción actual (ubicaciones 130 a la 133, 138 y 139). Recuerde que esto también lo limita, así que asegúrese de haber guardado una versión sin cambios antes de proceder:

32000 FOR VARI=PEEK(130)+PEEK(131)*256 TO PEEK(132)+PEEK(133)*256:POKE VARI,155:NEXT VARI
32100 POKE PEEK(138)+PEEK(139)*256+2,0:SAVE "D:ARCHIVO":NEW

Esto hace que todos los nombres de las variables sean reemplazados con un carácter RETURN39. Se pueden utilizar otros caracteres: simplemente cambie el 155 por el código ATASCII apropiado para el carácter deseado. Asegúrese de que estas sean las 2 últimas líneas de su programa y que NEW sea la última sentencia. CLOAD no funcionará, pero sí lo hará un nombre de archivo con C:.


38 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

39 ATASCII 155, también conocido como EOL (End Of Line - Fin de Línea). (N. del T.)

140,141

8C,8D

STARP

 

 

Dirección de la tabla de cadenas y arreglos y un puntero al final de su programa BASIC. Los arreglos se almacenan como números BCD (Binary-coded Decimal - Decimales Codificados en Binario) de 6 bytes, mientras que los caracteres de una cadena utilizan 1 byte cada uno. Las direcciones de las cadenas en la tabla son las mismas que las devueltas por la función ADR de BASIC. Utilice esta función siempre bajo el control del programa, ya que las direcciones en la tabla cambian según el tamaño de su programa. Intente lo siguiente:

10 DIM A$(10),B$(10)
20 A$="*":A$(10)=A$:A$(2)=A$
30 B$="&":B$(10)=B$:B$(2)=B$
40 PRINT ADR(A$),ADR(B$)
50 PRINT PEEK(140)+PEEK(141)*256:REM DIRECCION DE A$
60 PRINT PEEK(140)+PEEK(141)*256+10:REM DIRECCION DE A$ + 10 BYTES = DIRECCION DE B$

Esta tabla se expande a medida que BASIC procesa cada sentencia DIM, lo que reduce la memoria disponible. Un arreglo numérico de 10 elementos requiere 60 bytes para su almacenamiento. Una variable de tipo arreglo como DIM A(100) le toma al programa 600 bytes (100 * 6 es igual a 600). Por otro lado, un arreglo de cadenas como DIM A$(100) solo ocupará 100 bytes. Se ahorra mucha memoria si se escriben los arreglos como cadenas y recupera sus valores mediante la instrucción VAL. Por ejemplo:

10 DIM A$(10):A$="1234567890"
20 PRINT VAL(A$)
30 PRINT VAL(A$(4,4))
40 PRINT VAL(A$(3,3))+VAL(A$(8,9))

Para una discusión más detallada de STARP y VVTP, consulte la revista COMPUTE! de junio de 1982. Para ver cómo se puede guardar el área de las cadenas y los arreglos de su programa, consulte el libro De Re Atari.

142,143

8E,8F

RUNSTK

 

 

Dirección de la pila de tiempo de ejecución que contiene las entradas GOSUB (4 bytes cada una) y FOR-NEXT (16 bytes cada una). El comando POP del BASIC afecta a esta pila, extrayendo de ella una entrada a la vez por cada POP ejecutado. La pila se expande y se contrae según sea necesario mientras se ejecuta el programa.

Cada entrada GOSUB consta de 4 bytes en este orden: un 0 para indicar un GOSUB, un número de línea entero de 2 bytes en el que se produjo la llamada, y un desplazamiento dentro de esa línea para que RETURN pueda regresar y ejecutar la siguiente instrucción.

Cada entrada FOR-NEXT contiene 16 bytes en este orden: primero, el límite que puede alcanzar la variable del contador; segundo, el paso o incremento del contador. A estos 2 se les asignan 6 bytes a cada uno en formato BCD (12 bytes en total). El byte 13 es el número de variable del contador con el bit más significativo establecido en 1; el 14 y el 15 son el número de línea y el 16 es el desplazamiento de línea del comando FOR.

RUNSTK también se llama ENDSTAR; BASIC lo utiliza para señalar el final del espacio de cadenas y arreglos señalado por STARP.

144,145

90,91

MEMTOP

 

 

Puntero de la parte superior de la memoria BASIC, o el final del espacio que ocupa el programa. Es posible que aún haya espacio entre esta dirección y la Lista de Despliegue, cuyo tamaño se puede recuperar con el comando FRE(0) (que en realidad resta el valor MEMTOP que se encuentra en las ubicaciones 741 y 742; $2E5, $2E6). No debe confundirse con las ubicaciones 741 y 742, que tienen el mismo nombre pero que corresponden a una variable del Sistema Operativo. MEMTOP también se llama TOPSTK; apunta a la parte superior del espacio de la pila señalado por RUNSTK.

Cuando reserve memoria utilizando la ubicación 106 ($6A) y MEMTOP, puede agregar esta breve rutina de captura de errores:

10 TAMANO = (PEEK(106) - # numero de páginas a reservar) * 256
20 IF TAMANO <= PEEK(144) + PEEK(145) * 256 THEN PRINT " PROGRAMA DEMASIADO GRANDE": END

Las ubicaciones 146 a la 202 ($92 a la $CA) están reservadas para el uso de la ROM de 8K del BASIC. Las ubicaciones 176 a la 207 ($B0 a la $CF) están reservadas por el cartucho Assembler Editor para el uso de la Página Cero por parte del usuario. La rutina de depuración del Assembler también reserva 30 bytes en la Página Cero, distribuidos desde la ubicación 164 ($A4) a la 255 ($FF), pero no se pueden usar fuera del proceso de depuración. (Para obtener una lista de estos bytes disponibles, consulte el libro De Re Atari, Rev. 1, Apéndice A.)

186,187

BA,BB

STOPLN

 

 

Línea en la que se detuvo un programa debido a un error o al uso de la tecla BREAK, o debido a una instrucción STOP o TRAP. Es válido utilizar PEEK (186) + PEEK (187) * 256 en una sentencia GOTO o GOSUB.

195

C3

ERRSAVE

 

 

Número del código de error que provocó la detención o la invocación de la sentencia TRAP. Puede utilizar esta ubicación en una línea de un programa de la siguiente manera:

10 IF PEEK(195) <> 144 THEN 100

201

C9

PTABW

 

 

Esta ubicación especifica el número de columnas entre tabulaciones. La primera tabulación corresponde a PEEK(201). El valor predeterminado es 10. Este es el valor entre elementos separados por comas en una declaración PRINT (como PRINT A$, LOOP, C(12)), y no por el espaciado de la tecla TAB.

El número mínimo de espacios entre tabulaciones es 3. Si hace POKE 201,2, se trata como 4 espacios, y si hace POKE 201,1 se trata como 3 espacios. POKE 201,0 hace que el sistema se cuelgue cuando encuentra una declaración PRINT con comas. Para cambiar la configuración de la tecla TAB, consulte TABMAP (ubicaciones 675 a la 689; $2A3 a la $2B1). PTABW no se restablece al valor predeterminado cuando se presiona RESET o cuando se cambia el modo gráfico (a diferencia de TABMAP).

PTABW funciona en todos los modos gráficos, no solo en los modos de texto. El tamaño de los espacios entre los elementos depende del tamaño del píxel del modo gráfico en uso. Por ejemplo, en GRAPHICS 0, cada espacio tiene un carácter de ancho, mientras que en GRAPHICS 8, cada espacio tiene medio reloj de color40 de ancho (Es decir, un punto).


40 Un reloj de color (color clock) es una unidad de medida de espacio horizontal en la pantalla análoga, donde un pixel tiene medio reloj de color de ancho. (N. del T.)

203-207

CB-CF

....

 

 

Ninguno de los cartuchos BASIC o Assembler utiliza esta ubicación.

208,209

D0,D1

....

 

 

Ubicación no utilizada por BASIC. La única vez que he visto en uso alguna de estas ubicaciones fue en las revistas COMPUTE! de marzo de 1982 y octubre de 1981, cuando se utilizaron para rutinas de ordenamiento (sort) del usuario, y en la revista ANTIC de junio de 1982, donde se utilizaron como indicadores (flags) en una demostración gráfica. Los bytes 203 al 209 ($CB al $D1) son sin lugar a dudas los únicos bytes de la Página Cero que BASIC deja libres.

210,21141

D2,D3

....

 

 

Reservado para uso de BASIC u otros cartuchos.

Las ubicaciones 212 a la 255 ($D4 a la $FF) están reservadas para el uso del paquete FP (Floating Point - Coma Flotante). Las rutinas FP se encuentran en la ROM, entre las ubicaciones 55296 y 5734342 ($D800 y $DFFF). Estas ubicaciones de la Página Cero se pueden utilizar si el programa del usuario no llama al paquete FP. Sin embargo, no utilice ninguna de estas ubicaciones para una rutina de interrupción, ya que dichas rutinas podrían ocurrir durante una rutina de coma flotante llamada por BASIC, causando que el sistema se bloquee.

La notación en coma flotante utiliza una precisión de 6 bytes. El primer byte del número BCD corresponde al exponente (Si el bit 7 es igual a 0, entonces el número es positivo; si es igual a 1, entonces es negativo). Los siguientes 5 bytes corresponden a la mantisa. Ojalá eso fuera todo. El formato BCD es bastante complejo y se explica mejor en el capítulo 8 del libro De Re Atari.


41 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

42 En el libro original, se indica que las rutinas de coma flotante se encuentran en la ROM, entre las ubicaciones 55296 y 57393 ($E031), lo que no es correcto. Las rutinas FP terminan en la dirección 57343 ($DFFF). (N. del T.)

212-217

D4-D9

FR043

 

 

Registro #0 del paquete de Coma Flotante; contiene la representación interna de 6 bytes de un número FP. Los valores en las ubicaciones 212 y 213 se utilizan para devolver al programa BASIC un valor hexadecimal de 2 bytes en el rango del 0 al 65536 ($FFFF) (Byte bajo en la ubicación 212, byte alto en la ubicación 213). El paquete FP, si se utiliza, requiere todas las ubicaciones de la 212 a la 255. Una rutina de lenguaje de máquina puede utilizar los 6 bytes de FR0, siempre y cuando no se utilice el registro #0 (FR0) ni las funciones FP. Para usar valores de 16 bits en FP, debe colocar los 2 bytes del número en los 2 bytes inferiores de FR0 (ubicaciones 212 y 213; $D4 y $D5) y luego hacer un JSR a $D9AA (55722), lo que convierte el entero a su representación en coma flotante44, dejando el resultado en FR0. Para revertir esta operación, haga un JSR a $D9D2 (55762).


43 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

44 Coma Flotante corresponde a la traducción al español del término Floating Point (FP) en inglés. (N. del T.)

218-223

DA-DF

FRE

 

 

Registro extra del paquete FP (?)

224-229

E0-E5

FR1

 

 

Registro #1 del paquete de Coma Flotante; contiene la representación interna de 6 bytes de un número FP, tal como FR0. El paquete FP transfiere frecuentemente datos entre estos 2 registros y los utiliza para realizar operaciones aritméticas entre 2 números.

230-235

E6-EB

FR2

 

 

Registro #2 del paquete FP.

236

EC

FRX

 

 

Registro sobrante del paquete FP.

237

ED

EEXP

 

 

El valor del exponente E.

238

EE

NSIGN

 

 

El signo del número en notación FP.

239

EF

ESIGN

 

 

El signo del exponente.

240

F0

FCHRFLG

 

 

Indicador de primer carácter.

241

F1

DIGRT

 

 

El número de dígitos a la derecha del decimal.

242

F2

CIX

 

 

Índice del carácter (de la entrada actual). Se utiliza como desplazamiento del búfer de texto de entrada señalado por INBUFF, que viene a continuación.

243,244

F3,F4

INBUFF

 

 

Puntero al búfer de texto ASCII de la entrada; el búfer de entrada de la línea de programa del usuario, utilizado en la traducción de código ATASCII a valores FP. El búfer de salida de los resultados se encuentra en las ubicaciones 1408 a la 1535 ($580 a la $5FF).

245,246

F5,F6

ZTEMP1

 

 

Registro temporal.

247,248

F7,F8

ZTEMP4

 

 

Registro temporal.

249,250

F9,FA

ZTEMP3

 

 

Registro temporal.

251

FB

RADFLG

 

 

También llamado DEGFLG. Cuando se establece en 0, todas las funciones trigonométricas se realizan en radianes; cuando se establece en 6, se realizan en grados. Tanto el comando NEW del BASIC como la tecla RESET restauran RADFLG a radianes.

252,253

FC,FD

FLPTR

 

 

Puntero al número FP del usuario.

254,255

FE,FF

FPTR2

 

 

Puntero al segundo número FP del usuario que se utiliza en una operación determinada.

Fin de la memoria RAM de la Página Cero.


PÁGINA UNO: LA PILA


Las ubicaciones 256 a la 511 ($100 a la $1FF) corresponden al área de la pila del Sistema Operativo, DOS y BASIC. Esta área es la Página Uno. En lenguaje de máquina, las interrupciones y las instrucciones JSR y PHA hacen que los datos se escriban en la Página Uno, y las instrucciones RTS, PLA y RTI leen datos desde la Página Uno. Al encender o reiniciar el equipo, el puntero de la pila se inicializa para que apunte a la ubicación 511 ($1FF). Luego la pila empuja cada entrada hacia abajo, hasta llegar a la ubicación 256 ($100). En caso de desbordamiento más allá de la ubicación 256, la pila vuelve a comenzar a partir de la ubicación 511.


PÁGINAS DOS A LA CUATRO


El Sistema Operativo utiliza las ubicaciones 512 a la 1151 ($200 a la $47F) para almacenar variables, tablas y búfers de datos. En esta área, las ubicaciones 512 a la 553 ($200 a la $229) son utilizadas por los vectores de las interrupciones, y las ubicaciones 554 a la 623 ($22A a la $26F) son utilizadas para varios fines. A menos que se indique específicamente, gran parte de las páginas Dos a la Cinco no pueden ser utilizadas excepto por el Sistema Operativo. Hay una serie de bytes que están marcados como "sobrantes", es decir, que no se utilizan actualmente. El estado de estos bytes puede cambiar con una actualización al Sistema Operativo por parte de Atari, por lo que no se recomienda su uso.

Existen 2 tipos de interrupciones: las NMI (Non-Maskable Interrupt - Interrupción No Enmascarable), que son procesadas por el chip ANTIC, y las IRQ (Interrupt ReQuest - Solicitud de Interrupción), que son procesadas por los chips POKEY y PIA. Las NMI son utilizadas en el caso de las interrupciones del VBLANK (VBI; ubicaciones 546 a la 549, $222 a la $225), las DLI (Display List Interrupt - Interrupciones de Lista de Despliegue) y las interrupciones de la tecla RESET. Estas inician los procedimientos de etapa 1 y etapa 2 de VBLANK; la dirección almacenada en el vector correspondiente generalmente apunta a una rutina de servicio del Sistema Operativo, pero puede cambiarse para que apunte a una rutina del usuario. Las IRQ son utilizadas en el caso de las interrupciones del temporizador, las interrupciones del bus serie y de los dispositivos periféricos, las interrupciones de la tecla BREAK y de otras teclas, y las interrupciones de la instrucción BRK del procesador 6502. Los vectores de estas interrupciones generalmente pueden ser cambiados para que apunten a rutinas del usuario. Para obtener más información, consulte las ubicaciones NMIST 54287 ($D40F) y IRQEN 53774 ($D20E). Los vectores de las interrupciones NMI están marcados con la etiqueta NMI; los vectores de las interrupciones IRQ están marcados con la etiqueta IRQ.

Consulte la tabla en la ubicación 534 para obtener una lista de los vectores de interrupción disponibles en la ROM de la nueva versión "B" del Sistema Operativo.

512,513

200,201

VDSLST

 

 

Corresponde al vector para las interrupciones NMI del tipo DLI (Display List Interrupt - Interrupción de la Lista de Despliegue): contiene la dirección de las instrucciones que se ejecutarán durante una DLI. (Las DLI se utilizan para interrumpir el flujo del procesador durante unos microsegundos, específicamente en la línea de la pantalla donde se estableció el bit, lo que le permite al computador ejecutar otra rutina corta como tocar música, cambiar los modos gráficos, etc.) El Sistema Operativo no utiliza DLIs; el usuario debe habilitarlos, escribirlos y guardar su ubicación aquí. El registro de estado de la NMI que se encuentra en la ubicación 54287 ($D40F) primero comprueba si una interrupción fue causada por una DLI y, si este es el caso, salta usando la dirección almacenada en VDSLST a la rutina escrita por el usuario. Durante el encendido del equipo, las DLI se deshabilitan, pero las VBI (Vertical Blank Interrupt - Interrupción del Blanqueo Vertical) se habilitan (Consulte las ubicaciones 546 a la 549; $222 a la $225).

VDSLST se inicializa para que apunte a la dirección 59315 ($E7B3), que contiene simplemente una instrucción RTI. Para habilitar las DLI, primero debe hacer POKE con 192 ($C0) en la ubicación 54286 ($D40E); de lo contrario, ANTIC ignorará su solicitud. Luego, debe hacer POKE en las ubicaciones 512 y 513 con la dirección (en formato byte menos significativo seguido del byte más significativo) de la primera rutina de lenguaje ensamblador que se ejecutará durante la DLI. Luego debe establecer en 1 el bit 7 de las instrucciones de la Lista de Despliegue donde debe ocurrir la DLI. Dependiendo del modo gráfico, solo tiene entre 14 y 61 ciclos de máquina disponibles para su DLI. Primero debe poner en la pila los registros del 6502 y luego debe finalizar su DLI con una instrucción RTI. Dado que está tratando con lenguaje de máquina para la construcción de su DLI, puede hacer POKE directamente en los registros hardware que planea cambiar, en lugar de utilizar los registros sombra que utiliza el BASIC.

Desafortunadamente, solo tenemos una dirección del vector de la DLI. Si utiliza más de una DLI, y estas deben realizar actividades diferentes, entonces el cambio en el vector para que apunte a una rutina diferente debe ser realizado por las DLI anteriores.

Otra forma de realizar interrupciones es durante el intervalo VBLANK con una VBI. Un pequeño problema con el uso de las DLI es que la rutina que hace el "clic" del teclado interfiere con la DLI alterando la sincronización, ya que este clic es proporcionado por varias llamadas al registro WSYNC en la ubicación 54282 ($D40A). Chris Crawford analiza varias soluciones en el libro De Re Atari, pero la más sencilla es simplemente no permitir la entrada desde el teclado. Para más detalles, vea la revista Micro de diciembre de 1981, y las revistas Creative Computing de julio y diciembre de 1981.

A continuación, se muestra un breve ejemplo de DLI. Imprime la mitad inferior de la pantalla de texto al revés:

10 INICIO=PEEK(560)+PEEK(561)*256:POKE INICIO+16,130
20 PAGINA=1536:FOR PGM=PAGINA TO PAGINA+7:READ BYTE:POKE PGM,BYTE:NEXT PGM
30 DATA 72,169,4,141,1,212,104,64
40 POKE 512,0:POKE 513,6:POKE 54286,192
50 FOR PRUEBA=1 TO 240:PRINT "VEA ";:NEXT PRUEBA
60 GOTO 60

Este otro ejemplo de DLI cambia el color de la mitad inferior de la pantalla. Para usarlo, simplemente cambie PAGINA+7 a PAGINA+10 en el programa anterior y reemplace la línea 30 con:

30 DATA 72,169,222,141,10,212,141,24,208,104,64

Por último, elimine las líneas 50 y 60. Vea también la ubicación 54282 ($D40A).

514,515

202,203

VPRCED

 

 

Vector de línea de continuación en serie (para los dispositivos periféricos). Su valor inicial corresponde a 59314 ($E7B2), que simplemente contiene la secuencia de instrucciones PLA, RTI. Se utiliza cuando se produce una IRQ debido a la línea de continuación de E/S del bus serie, disponible para los dispositivos periféricos. Según el libro /De Re Atari/, esta interrupción no se utiliza y sólo apunta a una secuencia de instrucciones PLA, RTI. Esta interrupción es manejada por el chip PIA y se puede utilizar para proporcionar mayor control sobre los dispositivos externos. Consulte la página 33 del listado del Sistema Operativo.

516,517

204,205

VINTER

 

 

Vector de interrupción serie (para los dispositivos periféricos). Su valor inicial es igual a 59314 ($E7B2). Se utiliza cuando se produce una IRQ debido a una interrupción de E/S del bus serie. Según el libro De Re Atari, esta interrupción no se utiliza y sólo apunta a una secuencia de instrucciones PLA, RTI. Esta interrupción es procesada por el chip PIA. Consulte la página 33 del listado del Sistema Operativo.

518,519

206,207

VBREAK

 

 

Vector de instrucción de ruptura del comando BRK ($00) del microprocesador 6502 (No confundir con el vector de la tecla BREAK, que está en la ubicación 17; $11). Su valor inicial es igual a 59314 ($E7B2). Este vector se utiliza normalmente para establecer puntos de interrupción (breakpoints) durante la depuración en lenguaje Ensamblador.

520,521

208,209

VKEYBD

 

 

Vector POKEY de interrupción del teclado, utilizado por la interrupción generada cuando se presiona cualquier tecla del teclado que no sea la tecla BREAK o los botones de la consola. Los botones de la consola nunca generan una interrupción, a menos que el usuario haya escrito una específicamente. Se puede utilizar VKEYBD para procesar el código de la tecla antes de ser convertido al formato ATASCII. Su valor inicial es 65470 ($FFBE), que corresponde a la rutina de IRQ del teclado del Sistema Operativo. IRQ.

522,523

20A,20B

VSERIN45

 

 

Vector POKEY de interrupción de recepción de datos listos del puerto de E/S serie. Su valor inicial es 60177 ($EB11), que corresponde al código del Sistema Operativo encargado de colocar un byte del puerto de entrada serie en un búfer. Llamado INTRVEC por DOS, se utiliza como ubicación del vector de interrupción del parche SIO. DOS cambia este vector a 6691 ($1A23), que corresponde al inicio de la rutina de servicio de la interrupción lista del DOS. IRQ.


45 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

524,525

20C,20D

VSEROR46

 

 

Vector POKEY de interrupción de la transmisión de datos listos del puerto de E/S serie. Su valor inicial es 60048 ($EA90), que corresponde al código del Sistema Operativo encargado de colocar el siguiente byte de un búfer en el puerto de salida en serie. DOS cambia este vector a 6630 ($19E6), que corresponde al inicio de la rutina de interrupción de datos de salida requeridos del DOS. IRQ.


46 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

526,527

20E,20F

VSEROC

 

 

Vector POKEY de interrupción de la transmisión completa del puerto en serie. Su valor inicial es 60113 ($EAD1). Este vector apunta al código que establece en 1 la bandera de "transmisión realizada" después de enviar el byte de suma de comprobación (checksum). IRQ.

SIO utiliza las 3 últimas interrupciones para controlar la comunicación del bus serie con sus dispositivos. Durante la comunicación del bus serie, se detiene toda ejecución del programa. La comunicación de E/S en serie real está controlada por interrupciones: POKEY espera y observa que se establezca en 1 una bandera cuando se completa la operación de E/S solicitada. Durante esta espera, POKEY sigue enviando o recibiendo bits por el bus serie. Cuando se ha transmitido (o recibido) todo el byte, se genera la IRQ de salida de datos necesaria (VSEROR) o de entrada de datos listos (VSERIN), según la dirección del flujo de datos. Esto hace que se procese el siguiente byte hasta que se haya enviado todo el búfer o esté lleno, y se establece en 1 la bandera de "transmisión realizada". En este punto, SIO vuelve a la rutina de llamada. Se puede observar que SIO pierde tiempo esperando que POKEY envíe o reciba la información en el bus.

528,529

210,211

VTIMR147

 

 

Vector de interrupción del temporizador #1 de POKEY. Su valor inicial es 59314 ($E7B2), que apunta a una secuencia de instrucciones PLA, RTI. Las interrupciones del temporizador se establecen cuando el temporizador AUDF1 de POKEY (53760; $D200) cuenta regresivamente hasta llegar a 0. Los valores en los registros AUDF se cargan en STIMER, en la ubicación 53769 ($D209). IRQ.


47 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

530,531

212,213

VTIMR248

 

 

Vector del temporizador #2 de POKEY para AUDF2 (53762, $D202). Su valor inicial es 59314 ($E7B2). IRQ.


48 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

532,533

214,215

VTIMR449

 

 

Vector del temporizador #4 de POKEY para AUDF4 (53766, $D206). Su valor inicial es 59314 ($E7B2). Esta IRQ sólo tiene un vector asociado en la versión "B" de la ROM del Sistema Operativo.


49 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

534,535

216,217

VIMIRQ

 

 

Vector de la IRQ inmediata (general). Su valor inicial es 59126 ($E6F6). Haga JMP a esta ubicación para determinar la causa de la IRQ. Tenga en cuenta que con la nueva ROM del Sistema Operativo (la versión "B") en las ubicaciones 566 y 567 ($236 y $237) hay un vector de interrupción de la tecla BREAK. Para obtener más información sobre las interrupciones IRQ, consulte la ubicación 53774 ($D20E). La nueva versión B de la ROM del Sistema Operativo cambia los vectores anteriores de la siguiente manera:

VDSLST    59280 ($E790) 
VPRCED    59279 ($E78F) 
VINTER    59279 ($E78F) 
VBREAK    59279 ($E78F) 
VKEYBD    SIN CAMBIO 
VSERIN    60175 ($EB0F) 
VSEROR    SIN CAMBIO 
VSEROC    60111 ($EACF) 
VTIMR 1-4 59279 ($E78F) 
VIMIRQ    59142 ($E706) 
VVBLKI    59310 ($E7AE) 
VVBLKD    59653 ($E905)

Las ubicaciones 536 a la 558 ($218 a la $22E) se utilizan para los temporizadores software del sistema. Los temporizadores hardware están ubicados en el chip POKEY y utilizan los registros AUDF. Estos temporizadores cuentan hacia atrás cada 1/60-avo de segundo (etapa 1 del VBLANK) ó cada 1/30-avo de segundo (etapa 2 del VBLANK), hasta que llegan a 0. Si el proceso VBLANK ha sido deshabilitado o interceptado, los temporizadores no se actualizarán. Para obtener más información sobre cómo configurar estos temporizadores en una rutina en lenguaje Ensamblador utilizando el registro SETVBV (58460; $E45C), consulte el libro De Re Atari. Estas ubicaciones son accesibles para el usuario y se pueden configurar para contar el tiempo de duración de la música, la entrada/salida de un juego, el reloj de un juego y otras funciones.

Los temporizadores de software se utilizan para duraciones superiores a un intervalo de VBLANK (1/60 de segundo). Para periodos de menor duración, utilice los registros hardware.

536,537

218,219

CDTMV1

 

 

Valor del temporizador #1 del sistema. Cuenta hacia atrás a partir de 255. Este temporizador SIO se decrementa en cada etapa 1 del VBLANK. Cuando llega a 0, establece en 1 una bandera para saltar (hacer JSR) usando la dirección almacenada en las ubicaciones 550 y 551 ($226 y $227). Cuando la rutina VBLANK se interrumpe porque el Sistema Operativo ejecuta código crítico en el tiempo (cuando la ubicación 66; $42 es establecida en un valor distinto de 0, se debe ejecutar código crítico en el tiempo), solo se actualizan el reloj de tiempo real (ubicaciones 18 a la 20; $12 a la 14), el temporizador #1 y el registro de modo de atracción (77; $4D). Dado que el Sistema Operativo utiliza el temporizador #1 para sus rutinas de E/S y para cronometrar las operaciones del bus serie (configurándolo en valores diferentes para las rutinas de tiempo de espera), debe utilizar otro temporizador para evitar conflictos o interferencias con el funcionamiento del sistema.

538,539

21A,21B

CDTMV2

 

 

Temporizador #2 del sistema. Disminuido en la etapa 2 del VBLANK. Se puede decrementar en cada etapa 1 del VBLANK, sujeto a la prueba de sección crítica según lo definido por la configuración de la bandera CRITIC (ubicación 66; $42). Este temporizador puede perder (omitir) un conteo cuando se ejecuta código crítico en el tiempo (la ubicación CRITIC tiene un valor distinto de 0). Cuando el valor cuenta regresivamente hasta 0, realiza un JSR usando la dirección almacenada en las ubicaciones 552 y 553 ($228 y $229).

540,541

21C,21D

CDTMV3

 

 

Temporizador #3 del sistema. Igual que la ubicación 538. Los temporizadores #3, #4 y #5 también se detienen cuando el Sistema Operativo establece la bandera CRITIC en un valor distinto de 0. El Sistema Operativo utiliza el temporizador #3 cuando se hace un OPEN a la grabadora de cassettes y cuando se desea establecer el tiempo de lectura y escritura de los encabezados de cinta. Durante esta función se perderá cualquier valor anterior en el registro.

542,543

21E,21F

CDTMV4

 

 

Temporizador #4 del sistema. Igual que la ubicación 538 ($21A).

544,545

220,221

CDTMV5

 

 

Temporizador #5 del sistema. Igual que la ubicación 538 ($21A). Cuando los temporizadores #3, #4 y #5 llegan a 0, establecen en 1 las banderas en las ubicaciones 554, 556 y 558 ($22A, $22C, $22E), respectivamente.

546,547

222,223

VVBLKI

 

 

Registro de VBLANK inmediato. Normalmente salta al vector del procesador de la interrupción NMI de la etapa 1 del VBLANK en la ubicación 59345 ($E7D1); y en la nueva ROM "B" del Sistema Operativo, a la ubicación 59310 ($E7AE). El registro de estado de la NMI comprueba si la interrupción se debió a una VBI (después de comprobar si se tiene una DLI) y, si es así, se dirige a la rutina de la VBI, que puede haber sido escrita por el usuario. Cuando se enciende el equipo, las VBI se habilitan y las DLI se deshabilitan. Vea la ubicación 512; $200.

548,549

224,225

VVBLKD

 

 

Registro de VBLANK diferido. Indica el retorno del sistema desde la interrupción. Su valor inicial corresponde a 59710 ($E93E); en la nueva ROM "B" del Sistema Operativo corresponde a la ubicación 59653 ($E905), la salida de la rutina del VBLANK. NMI.

Estos 2 vectores de VBLANK apuntan a las rutinas de interrupción que ocurren al comienzo del intervalo de tiempo del VBLANK. Se ejecuta la rutina de la etapa 1 del VBLANK; luego se comprueba la ubicación 66 ($42) para determinar la naturaleza crítica en el tiempo de la interrupción y, si se ha interrumpido una sección de código crítica, se omite la ejecución de la rutina de la etapa 2 del VBLANK haciendo un JMP realizado a través del vector inmediato VVBLKI. Si no es crítico, se utiliza la interrupción diferida VVBLKD. Normalmente, los bits de interrupción VBLANK están establecidos en 1 (el bit 6 de la ubicación 54286 ($D40E) está establecido en 1). Para desactivarlos, borre el bit 6 (establézcalo en 0).

La secuencia normal para los eventos de la interrupción del VBLANK es la siguiente: después de la comprobación del Sistema Operativo, se hace JMP a la rutina de interrupción VBLANK inmediata del usuario a través del vector almacenado en las ubicaciones 546 y 547 (la ubicación de arriba), y luego a través de SYSVBV en la ubicación 58463 ($E45F). El Sistema Operativo dirige esto a través de la rutina de servicio de la interrupción de VBLANK de la ubicación 59345 ($E7D1) y luego a la rutina de interrupción VBLANK diferida del usuario que se encuentra almacenada en el vector de las ubicaciones 548 y 549. Luego sale de la rutina de interrupción VBLANK a través de la ubicación 58466 ($E462) y una instrucción RTI.

Si está cambiando los vectores VBLANK durante la rutina de interrupción, utilice la rutina SETVBV en la ubicación 58460 ($E45C). Un VBI inmediato tiene alrededor de 3.800 ciclos de máquina de tiempo de uso y un VBI diferido tiene alrededor de 20.000 ciclos. Dado que muchos de estos ciclos se ejecutan mientras se dibuja el haz de electrones, se sugiere no ejecutar rutinas gráficas en los VBI diferidos. Vea la tabla de procesos de VBLANK al final del área del mapa.

Si crea sus propios VBI, finalice un VBI inmediato con un JMP a la ubicación 58463 ($E45F) y un VBI diferido con un JMP a la ubicación 58466 ($E462). Para omitir por completo la rutina VBI del Sistema Operativo que se encuentra en la ubicación 59345 ($E7D1), finalice su VBI inmediato con un JMP a la ubicación 58466 ($E462). A continuación, se muestra un ejemplo50 del uso de una VBI para crear un cursor parpadeante. También hace parpadear cualquier texto que se muestre en modo video inverso.

10 FOR PARPADEO=1664 TO 1680:READ BYTE:POKE PARPADEO,BYTE:NEXT PARPADEO
20 POKE 66,255:POKE 548,128:POKE 549,6:POKE 66,0
30 DATA 8,72,165,20,41,16,74,74,74,141
40 DATA 243,2,104,40,76,98,228

Para volver el cursor y la pantalla a la normalidad, haga POKE 548,62 y luego POKE 549,233.


50 En el programa original, los últimos 2 valores de la línea 40 son 63 y 233, que corresponden a un salto ilegal a la ROM del OS-A. Ademas, en la linea 20, no se deshabilita la ubicación CRITIC, lo que causa un comportamiento errático de la rutina. Para asegurar su funcionamiento correcto, se agregan los POKES a la ubicación CRITIC (66;$42). (N. del T.)

550,551

226,227

CDTMA1

 

 

Dirección de salto del temporizador #1 del sistema. Su valor inicial es 60400 ($EBF0). Cuando las ubicaciones 536 y 537 ($218 y $219) llegan a (o cuentan regresivamente hasta) 0, el Sistema Operativo salta a la ubicación especificada por estas 2 direcciones. Aquí puede configurar la dirección de su rutina de código de máquina para que se ejecute cuando el temporizador #1 llegue a (o cuente regresivamente hasta) 0. Su código debe terminar con la instrucción RTS.

Pueden surgir problemas cuando los valores del temporizador se establecen en valores mayores a 255, ya que el procesador 6502 no puede manipular valores de 16 bits directamente (un número en el rango del 0 al 255 corresponde a un valor de 8 bits; si un valor requiere 2 bytes para almacenarse, como por ejemplo una ubicación de memoria, entonces corresponde a un valor de 16 bits). Técnicamente, una interrupción de VBLANK podría ocurrir cuando se está inicializando un byte del temporizador y el otro no aún ha sido configurado. Para evitar esto, mantenga los valores del temporizador por debajo de 255. Para obtener más detalles, consulte la página 106 el Manual del Usuario del Sistema Operativo Atari.

Dado que el Sistema Operativo utiliza el temporizador #1, se recomienda utilizar el temporizador #2 en su lugar, para evitar conflictos con el funcionamiento de su computador Atari. En la ROM antigua, su valor inicial es igual a 60396 ($EBEA). En la ROM nueva, es igual a 60400 ($EBF0). NMI.

552,553

228,229

CDTMA2

 

 

Dirección de salto del temporizador #2 del sistema. Esta ubicación no es utilizada por el Sistema Operativo, por lo que está disponible para que el usuario ingrese la dirección de su propia rutina a la cual se debe hacer JMP cuando el conteo del temporizador #2 (538, 539; $21A, $21B) llegue a 0.

Su valor inicial es 0 y la dirección debe ser especificada por el usuario. NMI.

554

22A

CDTMF3

 

 

Bandera del temporizador #3 del sistema. Se establece en 1 cuando el valor de las ubicaciones 540 y 541 ($21C, $21D) llega a 0. DOS también utiliza este registro como bandera de tiempo de espera (timeout).

555

22B

SRTIMR51

 

 

Temporizador de repetición de software, controlado por la rutina IRQ del dispositivo. Establece el retraso inicial de 1/2 segundo antes de que se repita una tecla. La etapa 2 del VBLANK establece la frecuencia de repetición de 1/10 de segundo, disminuye el temporizador e implementa la lógica de la repetición automática. Cada vez que se presiona una tecla, STIMER se establece en 48 ($30). Siempre que SRTIMR es igual a 0 y se presiona continuamente una tecla, el valor de esa tecla se almacena continuamente en CH, ubicación 764 ($2FC).


51 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

556

22C

CDTMF4

 

 

Bandera del temporizador #4 del sistema. Se establece en 1 cuando el valor de las ubicaciones 542 y 543 ($21E y $21F) llega a 0.

557

22D

INTEMP

 

 

Registro temporal utilizado por la rutina SETVBL de la ubicación 58460 ($E45C).

558

22E

CDTMF552

 

 

Bandera del temporizador #5 del sistema. Se establece en 1 cuando el valor de las ubicaciones 558 y 559 ($22E y $22F) llega a 0.


52 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)


559

22F

SDMCTL

 

 

Habilitación del DMA (Direct Memory Access - Acceso directo a memoria). Cuando se hace POKE con un 0 en esta ubicación, se desactiva ANTIC y por lo tanto se acelera el procesamiento en un 30%. Por supuesto, también significa que al desactivar ANTIC, ¡la pantalla se queda en blanco! Esto es útil para acelerar cálculos que toman mucho tiempo. También es útil apagar la pantalla mientras se carga un dibujo. Luego, puede encenderla, para que este dibujo aparezca instantáneamente y por completo en la pantalla. Para usarlo, primero debe ejecutar PEEK(559) y guardar su resultado. Luego haga POKE 559,0 para desactivar ANTIC. Cuando esté listo para devolverle la vida a la pantalla, haga un POKE con el número guardado en el primer paso en la ubicación 559.

Esta ubicación corresponde al registro sombra de la ubicación 54272 ($D400), y el número al que le hizo PEEK arriba define el tamaño del campo de juego (playfield), si los missiles y los players están habilitados o no, y la resolución del tamaño del player. Para habilitar sus opciones mediante el uso de POKE 559, simplemente sume los valores a continuación para obtener el número correcto para hacer POKE en la ubicación SDMCTL. Tenga en cuenta que debe elegir solo una de las 4 opciones de campo de juego que aparecen al principio de la lista:

Opción                                   Decimal   Bit
Sin campo de juego                             0     0 
Campo de juego estrecho                        1     0 
Campo de juego estándar                        2   0,1 
Campo de juego ancho                           3   0,1 
Habilitar DMA del missile                      4     2 
Habilitar DMA del player                       8     3 
Habilitar DMA de player y missile             12   2,3 
Resolución del player de una sola línea       16     4 
Habilitar instrucciones para obtener DMA      32     5 (vea a continuación)

Tenga en cuenta que la resolución del player de 2 líneas es la predeterminada y que no es necesario sumar un valor al contenido de la ubicación 559 para obtenerla. La tabla anterior incluye los bits afectados. El valor predeterminado de esta ubicación es 34 ($22).

El campo de juego es el área de la pantalla del televisor que se utiliza para el despliegue de texto y de gráficos. El campo de juego estrecho tiene 128 relojes de color de ancho (es decir, 32 caracteres de ancho en GRAPHICS 0), el estándar tiene 160 (e decir, 40 caracteres) y el ancho tiene 192 (es decir, 48 caracteres). Un reloj de color es una medida física de la distancia horizontal en la pantalla del televisor. Se tiene un total de 228 relojes de color en una línea, pero debido a las limitaciones de la pantalla, solo algunos de ellos (generalmente 176 como máximo) son visibles. Un píxel, por otro lado, es una unidad lógica cuyo tamaño varía según el modo gráfico. Debido a las limitaciones de la mayoría de los televisores, no se puede ver todo el campo de juego a menos que se desplace hacia las partes fuera de la pantalla.

Para habilitar la operación de ANTIC, se debe establecer en 1 el bit 5; esto habilita el DMA para obtener las instrucciones de la Lista de Despliegue.

560,561

230,231

SDLSTL

 

 

Dirección de inicio de la DL (Display List - Lista de Despliegue). La Lista de Despliegue es un conjunto de instrucciones que le indican al chip ANTIC dónde están los datos de la pantalla y cómo debe mostrarlos. Estas ubicaciones corresponden al registro sombra de las ubicaciones 54274 y 54275 ($D402, $D403). También puede encontrar la dirección de la DL haciendo PEEK un byte por encima de la parte superior de la memoria libre:

PRINT PEEK(741) + PEEK(742) * 256 + 1

Sin embargo, 560 y 561 son punteros más confiables, ya que las DL personalizadas pueden estar en cualquier otra parte de la memoria. Las listas de despliegue estándar de Atari simplemente le indican al chip ANTIC qué tipos de líneas de modo gráfico utilizar para una pantalla y dónde en la memoria se pueden encontrar los datos de la pantalla. Normalmente, una DL tiene entre 24 y 256 bytes de longitud (sin embargo, la mayoría tienen menos de 100 bytes), dependiendo de su modo gráfico. (Consulte las ubicaciones 88 y 89 para ver una tabla de tamaños de las DLs y el uso del despliegue de la pantalla).

Al alterar la DL, puede mezclar modos gráficos en la misma pantalla, habilitar el desplazamiento fino, cambiar la ubicación de los datos de la pantalla y forzar interrupciones (DLI) para realizar rutinas cortas en lenguaje de máquina.

Los bytes 5 y 6 de la DL corresponden a la dirección de los datos de la memoria de pantalla, la misma de las ubicaciones 88 y 89 ($58, $59). Los bytes 4, 5 y 6 son la primera instrucción LMS (Load Memory Scan - escaneo de memoria de carga). El byte 4 le dice al chip ANTIC qué modo utilizar; los siguientes 2 bytes corresponden a la ubicación del primer byte de la RAM de pantalla (primero el byte menos significativo, luego el byte más significativo).

El conocer esta ubicación le permite escribir directamente en la pantalla mediante comandos POKE (debe hacer POKE usando los códigos de caracteres internos, y no los códigos ATASCII - consulte la página 55 del Manual de Referencia del BASIC).

Por ejemplo, el programa a continuación hace POKE a los distintos modos de pantalla usando los códigos internos. Puede ver no sólo cómo cada modo de pantalla maneja los códigos, sino también aproximadamente dónde se encuentra la ventana de texto en relación con la pantalla (los 160 bytes debajo de RAMTOP). Tenga en cuenta que los modos GTIA no tienen ventana de texto. Si no tiene el chip GTIA, su Atari usará por defecto el modo GRAPHICS 8, pero con formato GTIA.

1 TRAP 10:GRAPHICS Z
5 PANTALLA=PEEK(560)+PEEK(561)*256
6 TV=PANTALLA+4:TELE=PANTALLA+5
8 DESPLIEGUE=PEEK(TV)+PEEK(TELE)*256
10 FOR N=0 TO 255:POKE DESPLIEGUE+N,N:NEXT N
20 DESPLIEGUE=DESPLIEGUE+N
30 IF DESPLIEGUE>40959 THEN Z=Z+1:GOTO 1
40 GOTO 10
50 Z=Z+1:IF Z>60 THEN END
60 GOTO 1

Aquí tiene otro programa corto que le permitie examinar la DL en cualquier modo gráfico:

10 REM PRIMERO LIMPIAMOS LA PANTALLA
20 PRINT "INGRESE MODO GRAFICO":REM SUMAMOS 16 AL MODO PARA SUPRIMIR LA VENTANA DE TEXTO
30 INPUT A:GRAPHICS A
40 DLIST=PEEK(560)+PEEK(561)*256
50 MIRA=PEEK(DLIST):PRINT MIRA;"    ";
60 IF MIRA<>65 THEN DLIST=DLIST+1:GOTO 50
70 LPRINT PEEK(DLIST+1);" ";PEEK(DLIST+2)
80 END

El valor 65 en la DL es la última instrucción encontrada. Le dice a ANTIC que salte a la dirección almacenada en los siguientes 2 bytes para volver a ejecutar la DL y esperar el próximo VBLANK. Si no tiene una impresora, cambie los comandos LPRINT por PRINT y modifique la rutina para guardar los datos en un arreglo y luego imprimirlos en la pantalla (en GRAPHICS 0).

Si desea examinar las ubicaciones del inicio de la Lista de Despliegue, la pantalla y la ventana de texto, intente lo siguiente:

5 REM PRIMERO LIMPIAMOS LA PANTALLA
6 INPUT A:GRAPHICS A
10 DIM DLIST$(10),SAVMSC$(10),TEXTO$(10)
15 DLIST$="DLIST":SAVMSC$="SAVMSC":TEXTO$="TEXTO"
20 DLIST=PEEK(560)+PEEK(561)*256
30 SAV=PEEK(88)+PEEK(89)*256:TEXTO=PEEk(660)+PEEK(661)*256
40 PRINT DLIST$;" ";DLIST,SAVMSC$;"   ";SAV
50 PRINT TEXTO$;" ";TEXT
60 INPUT A:GRAPHICS A:GOTO 20

Dado que un LMS es simplemente una instrucción de modo mapa (gráficos) o modo carácter (texto) con el bit 6 establecido en 1, puede convertir cualquiera o todas estas instrucciones en instrucciones LMS con bastante facilidad, apuntando cada línea a un área de RAM diferente. Esto se analiza en el libro De Re Atari, en la sección sobre la implementación del desplazamiento (scrolling) horizontal.

Las DLs se pueden utilizar para ayudar a generar algunos de los modos de pantalla ANTIC que no son compatibles con BASIC, como el modo 7.5 (modo ANTIC E) o modo ANTIC 3, o el modo de minúsculas con descendentes (muy interesante: 10 líneas de altura que permiten descendentes reales en letras minúsculas).

Si crea su propia DL personalizada, introduza su dirección en esta ubicación. Sin embargo, al presionar RESET o al cambiar el modo gráfico se restablece la dirección de la DL del Sistema Operativo. La instrucción de la Lista de Despliegue se carga en un registro especial llamado IR (Display Instruction Register - Registro de instrucción de despliegue), el que procesa las 3 instrucciones de la DL (en blanco, saltar o desplegar). El programador no puede acceder directamente a este registro, ni en BASIC ni en lenguaje de máquina.

Una DL no puede cruzar un límite de 1K a menos que se utilice una instrucción de salto.

Solo hay 4 instrucciones de Lista de Despliegue: línea en blanco (usando el color BAK), modo de mapa, modo de texto y salto. Las instrucciones de texto (modo de carácter) y de modo de mapa (gráficos) van de la 2 a la 15 ($2 a la $F) y son las mismas que las de los modos gráficos de ANTIC. Un byte de instrucción de una DL utiliza las siguientes convenciones (las funciones se habilitan cuando el bit se establece en 1):

Bit
Decimal
Función
7
128
Interrupción de la Lista de Desplegue cuando habilitado es igual a 1
6
64
LMS (Load Memory Scan - Escaneo de Memoria de Carga). Los siguientes 2 bytes corresponden al byte menos y más significativo de la dirección de los datos a cargar.
5
32
Habilitar desplazamiento vertical fino.
4
16
Habilitar desplazamiento horizontal fino.
3-0
8-1
Modo
 
 
0 0 1 0
Modos
 
 
al
Caracter
 
 
0 1 1 1
 
 
 
........
 
 
 
1 0 0 0
Modos
 
 
al
Mapa
 
 
1 1 1 1
 

Si el usuario lo desea, los bits anteriores se pueden combinar (es decir, DLI, desplazamiento y LMS juntos).

Instrucciones de DL especiales (con valores decimales):

En blanco 
1 línea = 0
   
5 líneas = 64
 
2 líneas = 16
 
6 líneas = 80
 
3 líneas = 32
 
7 líneas = 96
 
4 líneas = 48
 
8 líneas = 112

Instrucción de salto (JMP) = 0 (instrucción de 3 bytes).

Salte y espere el blanqueo vertical (JVP) = 65 (instrucción de 3 bytes).

Las instrucciones especiales sólo se pueden combinar con instrucciones de interrupción de la DL.

Cuando ANTIC encuentra una instrucción de DL con el bit de interrupción 7 establecido en 1, se produce una Interrupción de la Lista de Despliegue, que es una forma especial de interrupción que se ejecuta durante la visualización en pantalla. Para obtener información sobre la DLI, consulte la ubicación 512 ($200).

Dado que las DLs son un tema demasiado amplio para cubrirlo adecuadamente en este manual, y para obtener una explicación más detallada, le sugiero que consulte varias revistas (por ejemplo, Creative Computing de julio y agosto de 1981; Micro, de diciembre de 1981; Softside, n.° 30 a la 32; y BYTE, de diciembre de 1981).

562

232

SSKCTL

 

 

Registro de control del puerto serie. Corresponde al registro sombra de la ubicación 53775 ($D20F). El establecer en 1 los bits de este registro tiene el siguiente efecto:

Bit
Decimal
Función
0
1
Habilita el circuito antirrebote del teclado.
1
2
Habilita el circuito de escaneo del teclado.
2
4
El contador del potenciómetro completa una lectura en 2 líneas de escaneo en lugar del tiempo de 1 cuadro (frame).
3
8
La salida serie se transmite en 2 tonos en lugar de lógica verdadero/falso (modo de 2 tonos del POKEY).
4-6
16-64
Control del modo del puerto serie.
7
128
Forzar quiebre; salida serie a 0.

Su valor inicial es 19 ($13), lo que establece en 1 los bits 0, 1 y 4.

563

233

SPARE

 

 

Sin uso por parte del Sistema Operativo. Consulte la nota en la ubicación 651 sobre los bytes sobrantes.

564

234

LPENH

 

 

Valor horizontal del lápiz de luz. Corresponde al registro sombra de la ubicación 54284 ($D40C). Su valor varía entre 0 y 227.

565

235

LPENV

 

 

Valor vertical del lápiz de luz. Corresponde al registro sombra de la ubicación 54285 ($D40D). El valor es el mismo que el del registro VCOUNT para la resolución de 2 líneas (vea la ubicación 54283; $D40B). Ambos valores del lápiz de luz se modifican cuando se presiona su botón. Las posiciones del lápiz de luz no son las mismas que las posiciones normales de filas y columnas de la pantalla. Se tienen 96 posiciones verticales, numeradas desde 16 en la parte superior hasta 111 en la parte inferior, cada una equivalente a una línea de escaneo53. Las posiciones horizontales están marcadas en relojes de color. Se tienen 228 posiciones horizontales, numeradas a partir de 67, en la izquierda. Cuando el valor de LPENH llega a 255, se restablece a 0 y comienza a contar nuevamente de 1 en 1 hasta el borde más a la derecha, que tiene el valor 7.

Obviamente, debido a la cantidad de posiciones legibles y al pequeño tamaño de cada una, el programador debe dar cierto margen al utilizar lecturas con lápiz de luz en su programa. Al momento de escribir este artículo, Atari aún no lanza su lápiz de luz al mercado, aunque otras empresas ya lo han hecho.


53 El televisor tiene 192 líneas de escaneo horizontales. Cada una de estas líneas está compuesta por 320 puntos (o pixeles). Las líneas se trazan horizontalmente, de izquierda a derecha, una a la vez. La línea superior se traza primero y la inferior al final. (N. del T.)

566,567

236,237

BRKKY

 

 

Vector de interrupción de la tecla BREAK. Este vector solo está disponible en la ROM "B" del Sistema Operativo, y no en la versión anterior. Puede utilizar este vector para escribir su propia rutina de interrupción de la tecla BREAK. Su valor inicial es 59220 ($E754).

568,569

238,239

....

 

 

2 bytes libres.

570

23A

CDEVIC54

 

 

Dirección del CFB (Command Frame buffer - Búfer de la Trama de Comandos) de 4 bytes para un dispositivo, utilizado por SIO mientras realiza operaciones de E/S en serie, y no para acceso de usuario. CDEVIC se utiliza para almacenar el número de identificación del bus SIO. Los otros 3 bytes del CFB son:


54 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

571

23B

CCOMND

 

 

El código de comando del bus SIO.

572

23C

CAUX1

 

 

Byte auxiliar de comando #1, cargado por SIO desde la ubicación 778 ($30A).

573

23D

CAUX2

 

 

Byte auxiliar de comando #2, cargado por SIO desde la ubicación 779 ($30B).

574

23E

TEMP

 

 

Registro de RAM temporal para uso por parte de SIO.

575

23F

ERRFLG

 

 

Bandera de error SIO: cualquier error del dispositivo, excepto el error de tiempo de espera (el tiempo es igual a 0).

576

240

DFLAGS

 

 

Las banderas del disco que se leen desde el primer byte del archivo de arranque (sector 1) del disco.

577

241

DBSECT

 

 

La cantidad de sectores de arranque del disco leídos desde el primer registro del disco.

578,579

242,243

BOOTAD

 

 

La dirección donde se coloca el cargador de arranque (boot loader) del disco. El registro recién leído se mueve a la dirección especificada aquí, seguido de los registros restantes que se leerán. Normalmente, con DOS, esta dirección es igual a 1792 ($700). El valor también se almacena temporalmente en RAMLO en las ubicaciones 4 y 5. La dirección 62189 ($F2ED) es el punto de entrada de la rutina de arranque del disco del Sistema Operativo (DOBOOT).

580

244

COLDST

 

 

Bandera de arranque en frío. 0 es normal. Si esta ubicación es igual a 0, al presionar la tecla RESET no se reinicia el sistema (reboot). Si a esta ubicación se le hace POKE con 1 (bandera de encendido en progreso), el computador se reinicia cada vez que se presione la tecla RESET. Cualquier número distinto de 0 indica que la rutina de encendido inicial está en progreso.

Si crea un archivo AUTORUN.SYS, este debe terminar con una instrucción RTS. En caso contrario, debe hacer POKE 580,0 y luego POKE 9,1.

Puede convertir cualquier archivo binario que puede ser cargado con la opción "L" del menú del DOS en un archivo de inicio automático simplemente cambiándole el nombre a "AUTORUN.SYS". Tenga cuidado de no utilizar el mismo nombre para 2 archivos en el mismo disco.

Cuando lo anterior se combina con la desactivación de la tecla BREAK analizada en la ubicación 16 ($10) y con el esquema de protección de programa analizado en la ubicación 138 ($8A), entonces se tienen los medios para proteger su programa BASIC de manera bastante efectiva para que éste no sea listado ni examinado. Aunque esto no evita que pueda ser copiado.

581

245

....

 

 

Byte sobrante.

582

246

DSKTIM

 

 

Registro de tiempo de espera del disco (la dirección del peor caso de tiempo de espera de disco del Sistema Operativo). Muchas fuentes dicen que se establece en 160 en la inicialización, lo que representa un tiempo de espera de 171 segundos, pero mi sistema muestra un valor de 224. Los valores del temporizador son 64 segundos por cada 60 unidades de medida aquí expresadas.

Se actualiza después de cada solicitud de estado del disco para contener el valor del tercer byte de la trama de estado (status frame) (ubicación 748; $2EC). Todas las operaciones de disco tienen un tiempo de espera de 7 segundos (excepto la operación FORMAT), establecido por el controlador del disco (usted ya conoce ese pequeño e irritante retraso, ¿no?). El "síndrome del disco inactivo" (la impresora también padece este problema) ocurre cuando la unidad de disco se consume el tiempo de espera o el valor del temporizador llega a 0. Este problema se ha solucionado en la nueva versión "B" de la ROM del Sistema Operativo.

583-622

247-26E

LINBUF

 

 

Búfer de línea de caracteres de 40 bytes, utilizado para almacenar temporalmente una línea física de texto cuando el editor está moviendo datos de la pantalla. Durante la rutina, el puntero a este búfer se almacena en las ubicaciones 100 y 101 ($64 y $65).

623

26F

GPRIOR

 

 

Registro de selección de prioridad, registro sombra de la ubicación 53275 ($D01B). Las opciones de prioridad seleccionan qué objetos de la pantalla estarán "delante" de otros. También le permite usar los 4 missiles como un quinto player y permite que ciertos players superpuestos tengan diferentes colores en las áreas de superposición. Para obtener el total antes de hacer POKE en la ubicación 623, se suman las opciones tal como en la ubicación 559. En este caso, elija sólo /una/ de las 4 prioridades indicadas al principio. BAK corresponde al fondo o borde. También puede usar esta ubicación para seleccionar uno de los modos gráficos GTIA: el 9, 10 u 11.

Opciones de prioridad en orden
Decimal
Bit
Player 0-3, campo de juego 0-3, BAK (fondo)
1
0
Player 0-1, campo de juego 0-3, player 2-3, BAK
2
1
Campo de juego 0-3, player 0-3, BAK
4
2
Campo de juego 0-1, player 0-3, campo de juego 2-3, BAK
8
3
Otras opciones    
4 missiles = 5o. player
16
4
3er. color en el área de superposición de los players
32
5
GRAPHICS 9 (modo GTIA)
64
6
GRAPHICS 10 (modo GTIA)
128
7
GRAPHICS 11 (modo GTIA)
192
6,7

Es bastante fácil establecer prioridades conflictivas para los players y los campos de juego. En tal caso, cuando ocurre un conflicto, las áreas donde ambos se superponen se volverán negras. Lo mismo ocurre si no se elige la opción de superposición.

Con la habilitación de color/superposición, puede obtener un player multicolor combinando varios players. El Atari realiza un OR lógico entre los colores de los players 0/1 y 2/3 cuando éstos se superponen. Sólo se permiten las combinaciones 0/1 y 2/3; por ejemplo, no obtendrá un tercer color cuando los players 1 y 3 se superpongan (en su lugar, obtendrá un color negro). Si el player 1 es rosa y el player 0 es azul, la superposición será verde. Si no habilita la opción de superposición, el área de superposición para todos los players será negra.

En el modo 9 de GTIA se tienen 16 diferentes luminancias de un mismo tono. En BASIC, utilice SETCOLOR 4,TONO,0. Para ver un ejemplo del modo 9 de GTIA, pruebe lo siguiente:

10 GRAPHICS 9:SETCOLOR 4,9,0
20 FOR CICLO=1 TO 15:COLOR CICLO
30 FOR LINEA=1 TO 2
40 FOR PRUEBA=1 TO 25:PLOT 4+PRUEBA,CICLO+LINEA+ESPACIO:NEXT PRUEBA
45 NEXT LINEA
50 ESPACIO=ESPACIO+4
60 NEXT CICLO
70 GOTO 70:REM SIN ESTA LINEA, LA PANTALLA VUELVEN A GR.0

En el modo 10 de GTIA se tienen disponibles los 9 registros de color; el tono y la luminancia se pueden configurar por separado para cada uno (de lo contrario, se permitirían 16 colores, pero solo se tienen 9 registros). Pruebe lo siguiente para observarlo:

10 N=0:GRAPHICS 10
20 FOR Q=1 TO 2
30 FOR B=0 TO 8:POKE 704+B,N*16+A
35 IF A>15 THEN A=0
40 COLOR B
45 A=A+1:N=N+1
50 IF N>15 THEN N=0
60 NEXT B
65 TRAP 70:NEXT Q
70 POP :N=N+1:FOR Z=1 TO 200:NEXT Z
75 GOTO 30

El modo 11 de GTIA es similar al modo 9 excepto que permite 16 tonos diferentes, todos de la misma luminancia. En BASIC, utilice SETCOLOR 4,0,LUMINANCIA. Pruebe la siguiente demostración del modo 11 de GTIA:

10 GRAPHICS 11
20 FOR CICLO=0 TO 79:COLOR CICLO:PLOT CICLO,0:DRAWTO CICLO,191:NEXT CICLO
30 GOTO 30

Puede utilizar estos ejemplos con la rutina para rotar colores, descrita en el texto que precede a la ubicación 704. Los pixeles del modo GTIA son largos y delgados; tienen una relación longitud horizontal-altura de 4 a 1. ¡Obviamente esto no es muy bueno para dibujar curvas y círculos!

Los modos GTIA se limpian con el comando OPEN. ¿Cómo puede saber si su equipo cuenta con el chip GTIA? Haga POKE 623,64. Si tiene el chip GTIA, la pantalla se pondrá completamente negra. En caso contrario, no lo tiene. A continuación, se presenta una rutina corta, escrita por Craig Chamberlain y Sheldon Leemon para la revista COMPUTE!, que le permite a un Atari detectar la presencia de un chip CTIA o GTIA. La rutina muestra la respuesta en la pantalla, pero se puede modificar fácilmente para que un programa "sepa" qué chip está presente y pueda adaptarse en consecuencia:

10 POKE 66,1:GRAPHICS 8:POKE 709,0:POKE 710,0:POKE 66,0:POKE 623,64:POKE 53248,42:POKE 53261,3:PUT #6,1
20 POKE 53278,0:FOR K=1 TO 300:NEXT K:GRAPHICS 18:POKE 53248,0:POSITION 8,5:? #6;CHR$(71-PEEK(53252));"TIA"
30 POKE 708,PEEK(20):GOTO 30

¿Cómo puede conseguir un chip GTIA si no tiene uno? Pregunte a su representante de servicio o distribuidor local Atari, o escriba directamente a Atari en Sunnyvale, California.

Para obtener más información sobre el chip, consulte la introducción a GTIA/CTIA en la ubicación 53248 ($D000). Para obtener más información sobre el chip GTIA, consulte la revista BYTE de mayo de 1982, la revista COMPUTE! de julio a septiembre de 1982, el libro De Re Atari y el disco de demostración GTIA del Atari Program Exchange (APX).


Las ubicaciones 624 a la 647 ($270 a la $287) se utilizan para controles de juegos: los valores de los paddles, joysticks y del lápiz de luz.

624

270

PADDL0

 

 

Valor del paddle #0 (los paddles también se llaman "pots", abreviatura de potenciómetro); un PEEK a la ubicación 624 devuelve un número entre 0 y 228 ($E4), el que aumenta a medida que se gira el paddle en sentido antihorario. Cuando se utiliza el paddle para mover un player o cursor (es decir, PLOT PADDLE(0),0), primero debe comprobar su pantalla. Muchos televisores no mostrarán ubicaciones menores a 48 ($30) o mayores a 208 ($D0), y en muchos modos gráficos obtendrá un ERROR 141: cursor fuera de rango. Los paddles están emparejados en los conectores del control, por lo que el paddle #0 y el paddle #1 utilizan el conector #1. Los registros PADDL son registros sombra de las ubicaciones 53760 a la 53767 ($D200 a la $D207) del POKEY.

625

271

PADDL1

 

 

Esta y las siguientes 6 ubicaciones son las mismas que la ubicación 624, pero para los otros paddles.

626

272

PADDL2

 

 

627

273

PADDL3

 

 

628

274

PADDL4

 

 

629

275

PADDL5

 

 

630

276

PADDL6

 

 

631

277

PADDL7

 

 

632

278

STICK055

 

 

El valor del joystick #0. Los registros STICK son registros sombra de las ubicaciones 54016 y 54017 ($D300, $D301) de PIA. Dependiendo de la posición del joystick, se tienen 9 valores decimales posibles (que representan incrementos de 45 grados) que son leídos por cada registro de joystick (usando el comando STICKn):

Decimal                  Binario
          14                      1110
           |                        |
     10    |    6             1010  | 0110
         \ | /                    \ | /
  11  --- 15 ---   7      1011--- 1111 ---0111
         / | \                    / | \
     9     |    5             1001  | 0101
           |                        |
          13                      1101

15 (1111) equivale al joystick en posición vertical (neutral).

Para ver un artículo sobre cómo fabricar un joystick proporcional, consulte la revista Micro de diciembre de 1981. Para ver un ejemplo de un controlador de joystick en lenguaje de máquina que puede agregar a su programa BASIC, consulte la revista COMPUTE! de julio de 1981.

A continuación, se presenta el listado de un lector de joysticks en lenguaje de máquina, basado en el artículo de la revista COMPUTE! de agosto de 1981:

1   GOSUB 1000
10  MIRAR = STICK(0)
20  X = USR(1764,MIRAR): Y = USR(1781,MIRAR)
30  ON X GOTO 120, 100, 110
.
.
.
100 REM SU RUTINA PARA MOVER A LA IZQUIERA
105 GOTO 10
110 REM SU RUTINA PARA MOVER A LA DERECHA
115 GOTO 10
120 ON Y GOTO 150, 130, 140
130 REM SU RUTINA PARA MOVER HACIA ABAJO
135 GOTO 10
140 REM SU RUTINA PARA MOVER HACIA ARRIBA
145 GOTO 10
150 REM IF X <> 1 THEN NO SE HACE NADA. SALTE A SUS RUTINAS O A LA LINEA 155
155 GOTO 10
.
.
.
1000 FOR CICLO = 1764 TO 1790: READ BYTE: POKE CICLO, BYTE: NEXT CICLO
1010 DATA 104,104,133,213,104,41,12,74,74,73,2,24,105,1
1020 DATA 133,212,96,104,104,133,213,104,41,3,76,237,6
1030 RETURN

Para ver un ejemplo de una llamada USR que utiliza una cadena en lugar de una ubicación de memoria fija, consulte las ubicaciones 88 y 89 ($58 y $59).


55 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

633

279

STICK1

 

 

Esta y las siguientes 2 ubicaciones son las mismas que la ubicación 632, pero para los otros joysticks. Estas 4 ubicaciones también se utilizan para determinar si está presionado el botón del lápiz de luz (PEN 0 - 3).

634

27A

STICK2

 

 

635

27B

STICK3

 

 

636

27C

PTRIG0

 

 

Botón de paddle #0. Se utiliza para determinar si el botón del paddle #0 está presionado (se devuelve 0) o no (se devuelve 1). Dado que estas son las mismas líneas de los interruptores izquierdo/derecho del joystick, puede usar PTRIG para el movimiento horizontal. PTRIG(1) - PTRIG(0) devuelve -1 (izquierda), 0 (centro), + 1 (derecha). Las siguientes 7 ubicaciones son para los botones de los otros paddles. PTRIG 0 - 3 son los registros sombra del registro 54016 ($D300) de PIA.

637

27D

PTRIG1

 

 

638

27E

PTRIG2

 

 

639

27F

PTRIG3

 

 

640

280

PTRIG4

 

 

PTRIG 4-7 son los registros sombra del registro 54017 ($D301) del PIA.

641

281

PTRIG5

 

 

642

282

PTRIG6

 

 

643

283

PTRIG7

 

 

644

284

STRIG0

 

 

Botón del joystick #0. Esta y las siguientes 3 ubicaciones realizan la misma función que las ubicaciones PTRIG, excepto que ahora para los joysticks. Al igual que PTRIG, se devuelve 0 cuando se presiona el botón, y se devuelve 1 cuando no se presiona. Los registros STRIG son los registros sombra de las ubicaciones 53264 a la 53267 ($D010 a la $D013) del GTIA/CTIA .

645

285

STRIG1

 

 

646

286

STRIG2

 

 

647

287

STRIG3

 

 


Las ubicaciones 648 a la 655 ($288 a la $28F) son para uso misceláneo del Sistema Operativo.

648

288

CSTAT

 

 

Registro de estado del cassette.

649

289

WMODE

 

 

Registro para almacenar el modo de lectura o escritura para el controlador del cassette, dependiendo de la operación: 0 es igual a lectura y 128 ($80) es igual a escritura.

650

28A

BLIM

 

 

Tamaño del búfer de registro de datos del cassette. Contiene la cantidad de bytes de datos activos en el búfer del cassette para el registro que se está leyendo o escribiendo en la ubicación 1021 ($3FD). Los valores varían de 0 a 128 (el tamaño del registro del cassette es 128; $80). El puntero al byte que se está leyendo o escribiendo se encuentra en la ubicación 61 ($3D). El valor de BLIM se extrae de los bytes de control que preceden a cada registro del cassette, tal como se explica en la ubicación 1021.

651-655

28B-28F

....

 

 

Bytes sobrantes. No se recomienda que utilice los bytes sobrantes para su propio programa. En actualizaciones posteriores del Sistema Operativo, estos bytes podrían ser utilizados y provocar un conflicto con sus programas. Por ejemplo, la nueva ROM del Sistema Operativo utiliza las ubicaciones 652 y 653 ($28C, $28D) en las nuevas rutinas del controlador de interrupciones IRQ. Es mejor utilizar un área protegida de memoria, como la Página Seis, ubicaciones 1536 a la 1791 ($600 a la $6FF).


Las ubicaciones 656 a la 703 ($290 a la $2BF) se utilizan para el controlador de visualización de la RAM de pantalla (dependiendo del modo gráfico).

En el modo de pantalla dividida, la ventana de texto es controlada por el editor de despliegue (display editor) (E:), mientras que la región de gráficos es controlada por el controlador de pantalla (display handler) (S:), utilizando 2 IOCBs separados. También se mantienen 2 cursores separados. En la opción de pantalla dividida, el controlador de pantalla establece en 1 el registro AUX1 del IOCB. Consulte el área IOCB en las ubicaciones 832 a la 959 ($340 a la $3BF). Para ver un programa que coloca GRAPHICS 1 y GRAPHICS 2 en el área de la ventana de texto, consulte la revista COMPUTE! de febrero de 1982. La ventana de texto utiliza 160 bytes de memoria RAM ubicados justo debajo de RAMTOP (vea la ubicación 106; $6A). Para ver un cuadro del uso de RAM de la pantalla, consulte la ubicación 88 ($58).

656

290

TXTROW

 

 

Fila del cursor de la ventana de texto; este valor varía entre 0 y 3 (la ventana de texto tiene solo 4 líneas). TXTROW especifica dónde ocurrirá la próxima lectura o escritura en la ventana de texto.

657,658

291,292

TXTCOL

 

 

Columna del cursor de la ventana de texto; este valor varía entre 0 y 39. A menos que el usuario la cambie, la ubicación 658 siempre es igual a 0 (solo hay 40 columnas en la pantalla, por lo que el byte más significativo es igual a 0). Dado que los comandos POSITION, PLOT, LOCATE y similares hacen referencia al cursor gráfico en el área de visualización sobre la ventana de texto, debe usar instrucciones POKE para escribir en esta área, si las instrucciones PRINT no son suficientes.

659

293

TINDEX

 

 

Contiene el modo gráfico de la ventana de texto de pantalla dividida actual. Es el equivalente en pantalla dividida de DINDEX (ubicación 87; $57) y siempre es igual a 0 cuando la ubicación 128 ($7B) es igual a 0. Su valor inicial es 0 (que representa GRAPHICS 0). Puede modificar la Lista de Despliegue para cambiar la ventana de texto a cualquier modo gráfico que desee. Si lo hace, recuerde cambiar TINDEX para reflejar este cambio.

660,661

294,295

TXTMSC

 

 

Dirección de la esquina superior izquierda de la ventana de texto. Equivalente en pantalla dividida de las ubicaciones 88 y 89 ($58 y $59).

662-667

296-29B

TXTOLD

 

 

Estas ubicaciones contienen los equivalentes en pantalla dividida de OLDROW (90; $5A), OLDCOL (91 y 92; $5B y $5C), OLDCHR (ubicación 93, $5D) y OLDADR (ubicaciones 94 y 95; $5E y $5F). Estas ubicaciones contienen los datos del cursor en pantalla dividida.

668

29C

TMPX1

 

 

Registro temporal, utilizado por el controlador de pantalla para el registro del conteo de ciclos de desplazamiento.

669

29D

HOLD3

 

 

Registro temporal.

670

29E

SUBTMP

 

 

Almacenamiento temporal.

671

29F

HOLD2

 

 

Registro temporal.

672

2A0

DMASK

 

 

Máscara de ubicación del píxel. Según el modo gráfico en uso, DMASK contiene ceros para todos los bits que no corresponden al píxel específico sobre el que se va a operar, y 1s para los bits que sí corresponden, de la siguiente manera:

11111111 Modos 0, 1 y 2: 1 pixel por cada byte del despliegue de pantalla.
11110000 Modos 9, 10 y 11: 2 pixels por cada byte.
00001111    
11000000 Modos 3, 5 y 7: 4 pixels por cada byte.
00110000    
00001100    
00000011    
10000000 Modos 4, 6 y 8: 8 pixels por cada byte.
01000000    
etc. hasta:    
00000001    

Un píxel (abreviatura de celda de imagen o elemento de imagen) es una unidad lógica de tamaño de video que depende del modo gráfico en uso para sus dimensiones. El píxel más pequeño se encuentra en el modo gráfico 8, donde tiene solo 1/2 reloj de color de ancho y sólo 1 línea de escaneo de alto. En GRAPHICS 0 también tiene sólo 1/2 reloj de color de ancho, pero tiene 8 líneas de escaneo de alto. A continuación, se muestra una tabla de los tamaños de pixeles para cada modo:

 
Modos Texto
Modos Gráficos
Modo GR.
0
1
2
3
4
5
6
7
8
Líneas de escaneo por píxel
8
8
16
8
4
4
2
2
1
Bits por pixel
1
1
1
2
1
2
1
2
1
Relojes de color por pixel
0,5
1
1
4
2
2
1
1
0,5
Caracteres por línea
40
20
20
--
--
--
--
--
--
Pixeles por ancho
--
--
--
40
80
80
160
160
320

La cantidad de pixeles por ancho de pantalla se basa en la pantalla del campo de juego normal. Para obtener más información sobre el tamaño del campo de juego, consulte la ubicación 559 ($22F).

673

2A1

TMPLBT

 

 

Almacenamiento temporal de la máscara de bits.

674

2A2

ESCFLG

 

 

Bandera de la tecla ESCAPE. Normalmente su valor es igual a 0, y se establece en 128 ($80) si se presiona la tecla ESC (al detectar el carácter ESC; 27, $1B). Se establece en 0 después de la impresión en pantalla del siguiente carácter. Para mostrar los códigos de control ATASCII sin el uso del carácter ESC, ponga un valor distinto de 0 en la ubicación 766 ($2FE).

675-689

2A3-2B1

TABMAP

 

 

Mapa de las posiciones de detención de las tabulaciones. En esta ubicación se tienen 15 bytes (120 bits), donde cada bit corresponde a una columna en una línea lógica. Un 1 en cualquier bit significa que la tabulación está activada. Para borrar todas las tabulaciones, simplemente establezca en 0 cada ubicación. Hay 120 ubicaciones de tabulaciones porque hay 3 líneas físicas por cada línea lógica en el modo gráfico 0, cada una de las cuales consta de 40 columnas. Establecer las ubicaciones de las tabulaciones para una línea lógica significa que también se establecerán para cada línea lógica subsiguiente, hasta que estas ubicaciones sean modificadas.

Sin embargo, cada línea física en una línea lógica puede tener diferentes configuraciones de tabulaciones. Para cambiar las ubicaciones de las tabulaciones desde el BASIC, debe usar el comando POKE para establecer en 1 el bit que corresponde a la ubicación en el byte (se tienen 5 bytes en cada línea). Por ejemplo: para configurar las tabulaciones en las ubicaciones 5, 23, 27 y 32, primero visualice la línea como una cadena de ceros con un 1 en cada configuración de tabulación deseada:

0000100000000000000000100010000100000000

Luego divida esta cadena en grupos de 8 bits (unidades de un byte). Tenemos 3 bytes que contienen bits establecidos en 1, y 2 bytes con todos sus bits en 0:

00001000 =  8 
00000000 =  0 
00000010 =  2 
00100001 = 33 
00000000 =  0

Al convertirlos a decimal, obtenemos los valores indicados a la derecha de cada byte. Éstos son los números que debe introducir en las ubicaciones 675 (el primer byte) a la 679 (el quinto byte de la línea). Al encender el equipo o cuando se hace OPEN la pantalla (S: o E:), a cada byte se le asigna un valor 1 (es decir, 00000001) de modo que se tengan tabulaciones predeterminadas en las posiciones 7, 15, 23, etc., incrementándose de 8 en 8 hasta llegar a 119. Además, el borde más a la izquierda de la pantalla también cuenta como una tabulación válida (2, 42 y 82). En el editor del BASIC, estas tabulaciones se configuran mediante las teclas SET-TAB y CLR-TAB. TABMAP también funciona para las líneas en la ventana de visualización de texto en formato de pantalla dividida. TABMAP se restablece a los valores predeterminados al presionar la tecla RESET o al cambiar el modo gráfico.

Para saber cómo cambiar la configuración de las tabulaciones cuando un comando PRINT encuentra una coma, consulte la ubicación 201 ($C9).

690-693

2B2-2B5

LOGMAP

 

 

Mapa de bits del inicio de las líneas lógicas. Estas ubicaciones asignan el número de línea física inicial para cada línea lógica en la pantalla (inicialmente 24, para GRAPHICS 0). Cada bit de los primeros 3 bytes indica el comienzo de una línea lógica si dicho bit es igual a 1 (3 bytes equivalen a 3 * 8 bits = 24 líneas en la pantalla). El formato del mapa es el siguiente:

Bit
7
6
5
4
3
2
1
0
Byte

Línea
0
1
2
3
4
5
6
7
690
 
8
9
10
11
12
13
14
15
691
 
16
17
18
19
20
21
22
23
692
 
--
--
--
--
--
--
--
--
693

El último byte se ignora. Todos los bits del mapa se establecen en 1 cuando se hace OPEN o CLEAR a la pantalla de texto, cuando se ejecuta un comando GRAPHICS o se presiona la tecla RESET. El mapa se actualiza a medida que se ingresan, editan o eliminan líneas lógicas.

694

2B6

INVFLG

 

 

Bandera de carácter en modo de video inverso; 0 es normal y también su valor inicial (es decir, los códigos de video ATASCII normales tienen el bit 7 igual a 0). Haga POKE con 128 ($80) en la ubicación INVFLG para obtener caracteres inversos (El bit 7 es igual a 1). Este registro normalmente se establece alternando la tecla con el logotipo de Atari56; sin embargo, esto puede ser modificado por el usuario. El controlador de visualización realiza en todo momento una operación XOR entre los códigos ATASCII y el valor almacenado en INVFLG. Vea la ubicación 702 ($2BE) más abajo.

INVFLG trabaja para cambiar la entrada desde el teclado, y no la salida por pantalla. Por ejemplo, si tiene que A$ = "HOLA", el hacer POKE 694,128 no cambia A$ cuando lo imprime en la pantalla. Sin embargo, si hace POKE 694,128 antes de un INPUT A$, la cadena se ingresa con caracteres en video inverso.


56 Sólo en los modelos Atari 400/800. En los modelos XL/XE, la tecla de video inverso no tiene el logotipo de Atari. (N. del T.)

695

2B7

FILFLG

 

 

Bandera de relleno a la derecha del comando DRAW del Sistema Operativo. Si la operación actual es un DRAW, entonces este registro es igual a 0. Si el valor de esta ubicación es distinto de 0, entonces la operación es un FILL (relleno).

696

2B8

TMPROW

 

 

Registro temporal para la fila utilizada por ROWCRS (vea la ubicación 84; $54).

697,698

2B9,2BA

TMPCOL

 

 

Registro temporal para la columna utilizada por COLCRS (vea las ubicaciones 85 y 86; $55 y $56).

699

2BB

SCRFLG

 

 

Bandera de desplazamiento (scroll): esta ubicación se establece en 1 si se produce un desplazamiento. Cuenta el número de líneas físicas menos 1 que fueron eliminadas de la parte superior de la pantalla. Esto mueve toda la pantalla hacia arriba una línea física por cada línea desplazada desde la parte superior. Dado que una línea lógica tiene 3 líneas físicas, SCRFLG varía entre 0 y 2.

Desplazar la ventana de texto equivale a desplazar toda una pantalla del modo gráfico 0. 800 bytes, equivalentes a 20 líneas adicionales, se desplazan hacia arriba en la memoria justo debajo de la dirección de la ventana de texto. Esto puede causar estragos en cualquier dato que haya almacenado por encima de RAMTOP, como por ejemplo, los gráficos P/M.

700

2BC

HOLD4

 

 

Registro temporal utilizado únicamente en el comando DRAW del Sistema Operativo; se utiliza para almacenar y restaurar el valor en ATACHR (ubicación 763; $2FB) durante el proceso FILL.

701

2BD

HOLD5

 

 

Igual que el registro anterior.

702

2BE

SHFLOK

 

 

Bandera para las teclas SHIFT y CONTROL. Esta ubicación es igual a 0 en el caso de las letras minúsculas, y es igual a 64 ($40) en el caso de las mayúsculas (llamado bloqueo de mayúsculas (SHIFT-lock): las mayúsculas son necesarias para las instrucciones BASIC y también es el modo predeterminado al encender el equipo). Si se pone un 64 en SHFLOK, se establecerán los caracteres en mayúsculas durante su programa. Cuando se presiona la tecla CONTROL, esta ubicación devuelve el valor 128 ($80; CONTROL-lock). El bloqueo forzado de la tecla CONTROL hace que todas las teclas muestren sus funciones de código de control o sus figuras gráficas. Otros valores introducidos aquí pueden provocar que el sistema se bloquee. Puede utilizar esta ubicación junto con la ubicación 694 ($2B6) para convertir todas las entradas del teclado a mayúsculas, que es la visualización normal, mediante el siguiente programa:

10 OPEN #2,4,0,"K:"
20 GET #2,A
30 GOSUB 1000
40 PRINT CHR$(A);:GOTO 20
.
.
.
1000 IF A=155 THEN 1030:REM TECLA RETURN
1010 IF A>=128 THEN A=A-128:REM RESTABLECEMOS A PANTALLA NORMAL
1020 IF PEEK(702)=0 AND A>96 THEN A=A-32:REM MINUSCULAS A MAYUSCULAS
1030 POKE 702,64:POKE 694,0
1040 RETURN

703

2BF

BOTSCR

 

 

Bandera para el número de filas de texto disponibles para imprimir en la pantalla. En el modo de texto GRAPHICS 0, esta ubicación es igual a 24 ($18); para la ventana de texto, esta ubicación es igual a 4. Y para todos los modos gráficos, esta ubicación es igual a 0. En todos los modos gráficos excepto el modo 0, si no se tiene una ventana de texto, la ubicación 703 también es igual 0. Para efectos de esta ubicación, las pantallas de texto grande en los modos GRAPHICS 1 y GRAPHICS 2 se tratan como pantallas gráficas. El controlador de la pantalla verifica específicamente el modo de pantalla dividida buscando el valor 24 ó 4 en esta ubicación. Si encuentra un 24, asume que no hay ninguna ventana de texto; de lo contrario, busca el valor 4.

Puede agregar una ventana de texto al modo GRAPHICS 0 haciendo POKE en esta ubicación con el valor 4. La parte superior de la pantalla (las primeras 20 líneas) no se desplaza con la parte inferior. Para escribir en la parte superior de la pantalla, debe utilizar la instrucción PRINT#6, tal como en los modos GRAPHICS 1 y 2. Una posible aplicación de lo anterior sería mantener un menú fijo en la parte superior de la pantalla mientras se desplaza por la parte inferior, tal como se hace en el menú del DOS.


Las ubicaciones 704 a la 712 ($2C0 a la $2C8) son los registros de color para los players, missiles y los campos de juego. Estos corresponden a los registros sombra en la RAM para las ubicaciones 53266 a la 53274 ($D012 a la $D01A). Para esto último, puede utilizar el comando SETCOLOR del BASIC. Para todos los registros, puede introducir el color deseado en la ubicación apropiada usando esta fórmula:

COLOR = TONO * 16 + LUMINANCIA

A diferencia de lo que Atari dice, usando una técnica llamada artefactos (artifacting) es posible tener más de 1 color (y medio) en el modo GRAPHICS 8. En la ubicación 710 ($2C6) se muestra un pequeño ejemplo de artefactos. Vea los libros De Re Atari y Your Atari 400/800, y las revistas Creative Computing de junio de 1981 y COMPUTE! de mayo de 1982.

Aquí tiene los 16 colores que produce su computador Atari, junto con sus valores POKE para los registros de color. Los valores POKE asumen una luminancia igual a 0. Sume el valor de la luminancia a estos números para hacer el color más brillante. Los registros de color ignoran el bit 0. Es por eso que no se tiene valores "impares" para la luminancia, solo valores pares.

Color
Valor
 Color
Valor
Negro
0,
0
 
Azul medio
8,
128
Óxido
1,
16
 
Azul oscuro
9,
144
Rojo-naranja
2,
32
 
Azul-gris
10,
160
Naranja oscuro
3,
48
 
Verde oliva
11,
176
Rojo
4,
64
 
Verde medio
12,
192
Lavanda oscuro
5,
80
 
Verde oscuro
13,
208
Azul cobalto
6,
96
 
Verde-naranja
14,
224
Ultramar
7,
112
 
Naranja
15,
240

A continuación, se muestra el uso de bits de los registros PCOLR y COLOR:

Bit
7
6
5
4
3
2
1
0
 
- color -
luminancia
sin uso
 

Gris
0
0
0
0
0
0
0
Más oscuro
Óxido
0
0
0
1
0
0
1
 
 
etc. hasta:
etc. hasta:
 
Naranja
1
1
1
1
1
1
1
Más claro

Cuando se habilita la superposición de colores en la ubicación 623 ($26F), ANTIC realiza un OR lógico en las áreas de superposición. Por ejemplo:

            01000010  Rojo, luminancia 2
       OR   10011010  Azul oscuro, luminancia 10
            --------
Resultado = 10011010  Verde oscuro, luminancia 10

A continuación, se muestra una breve rutina en lenguaje de máquina que rota los colores en los registros 705 al 712:

10 DIM ROTAR$(30)
20 FOR CICLO=1 TO 27:READ BYTE:ROTAR$(CICLO,CICLO)=CHR$(BYTE):NEXT CICLO
.
.    PONGA AQUI SU RUTINA GRAFICA
.
100 CAMBIO=USR(ADR(ROTAR$))
105 FOR CICLO=1 TO 200:NEXT CICLO:GOTO 100
110 DATA 104,162,0,172,193,2,189,194,2,157
120 DATA 193,2,232,224,8,144,245,140,200,2
130 DATA 96,65,65,65,65,65,65
Si desea rotar los colores en los registros 704 al 711, cambie las líneas 110 y 120 para que se vean de la siguiente manera:
110 DATA 104,162,0,172,192,2,189,193,2,157
120 DATA 192,2,232,224,8,144,245,140,199,2

Si desea incluir en la rutina los registros 704 al 712, realice los cambios tal como se indica arriba y en la línea 120 cambie el 8 por un 9 y el 199 por un 200. Esta rutina funciona bien con las demostraciones de GTIA de la ubicación 623 ($26F).

Para obtener más detalles, consulte las páginas 45 a la 56 del Manual de Referencia del Atari BASIC, y el disco de demostración de GTIA de APX.

704

2C0

PCOLR0

 

 

Color del player #0 y del missile #0. En algunas fuentes las ubicaciones 704 a la 707 también se denominan COLPM#. Corresponde al registro sombra de la ubicación 53266 ($D012). En el modo gráfico GTIA 10, la ubicación 704 almacena el color de fondo (BAK; normalmente almacenado en la ubicación 712). Los valores de color se deben introducir en los registros PCOLR mediante el uso del comando POKE. No se puede utilizar el comando SETCOLOR para este efecto.

705

2C1

PCOLR1

 

 

Color del player #1 y del missile #1. Corresponde al registro sombra de la ubicación 53267 ($D013).

706

2C2

PCOLR2

 

 

Color del player #2 y del missile #2. Corresponde al registro sombra de la ubicación 53268 ($D014).

707

2C3

PCOLR3

 

 

Color del player #3 y del missile #3. Cuando los 4 missiles se combinan para formar un quinto player, toma el color almacenado en la ubicación 711 (COLOR3). Corresponde al registro sombra de la ubicación 53269 ($D015).

708

2C4

COLOR0

 

 

Registro de color #0 y color del campo de juego #0, controlado por el comando BASIC SETCOLOR 0. En los modos GRAPHICS 1 y GRAPHICS 2, este color se utiliza para las letras mayúsculas. Corresponde al registro sombra de la ubicación 53270 ($D016). Desde el BASIC puede utilizar el comando SETCOLOR o POKE para cambiar los valores de todos los registros COLOR.

709

2C5

COLOR1

 

 

Para los diferentes campos de juego y comandos SETCOLOR, las siguientes 4 ubicaciones son las mismas que la ubicación 708. En GRAPHICS 1 y GRAPHICS 2, este registro almacena el color de las letras minúsculas.

COLOR1 también se utiliza en los modos GRAPHICS 0 y GRAPHICS 8 para almacenar el valor de luminancia del color. Corresponde al registro sombra de la ubicación 53271 ($D017).

710

2C6

COLOR2

 

 

Lo mismo que el registro anterior, pero para el campo de juego #2. En los modos GRAPHICS 1 y GRAPHICS 2, este registro almacena el color de las letras mayúsculas en modo de video inverso. Corresponde al registro sombra de la ubicación 53272 ($D018). En los modos GRAPHICS 0 y GRAPHICS 8, esta ubicación se utiliza como color de fondo. Ambos utilizan el registro COLOR1 para obtener el valor de luminancia.

A pesar de las limitaciones oficiales a la hora de seleccionar el color en el modo GRAPHICS 8, es posible generar colores adicionales en la pantalla mediante "artefactos", activando pixeles específicos de 1/2 reloj de color cada uno. Aprovechando la propia estructura física del televisor, se pueden activar selectivamente líneas verticales de pixeles que muestran todas el mismo color. Por ejemplo:

10 A=40:B=30:C=70:D=5:F=20:GRAPHICS 8:POKE 87,7:POKE 710,0:POKE 709,15:COLOR 1
30 PLOT A,D:DRAWTO A,C:COLOR 2:PLOT F,D:DRAWTO F,C
40 PLOT A+1,D:DRAWTO A+1,C
50 COLOR 3:PLOT B,D:DRAWTO B,C
60 GOTO 60

La experimentación le mostrará que los colores obtenidos dependen de qué pixeles estén activados y de qué tan cerca estén las columnas de pixeles. Se pueden obtener 4 "colores", tal como se vio anteriormente. Los pixeles marcados con 1 están encendidos; los marcados con 0 significa que están apagados. Cada par de pixeles corresponde a un reloj de color. Para mayor claridad se muestran 3 relojes de color juntos:

00:01:00 = color A     00:11:00 = color B
00:10:00 = color C     00:01:10 = color D

Para más información, vea la revista BYTE de mayo de 1982, y los libros De Re Atari y Your Atari 400/800.

711

2C7

COLOR3

 

 

Lo mismo que el registro anterior, pero para el campo de juego #3. Además, en los modos GRAPHICS 1 y GRAPHICS 2 este registro almacena el color de las letras minúsculas en modo video inverso. Corresponde al registro sombra de la ubicación 53273 ($D019).

712

2C8

COLOR4

 

 

Lo mismo que el registro anterior, pero para el color del borde y del fondo (BAK). Corresponde al registro sombra de la ubicación 53274 ($D01A). En el modo GTIA 10, la ubicación 704 almacena el color de fondo (BAK), mientras que la ubicación 712 se convierte en un registro de color normal.

A continuación, se presentan los valores predeterminados de los registros COLOR (todos los registros PCOL se establecen en 0 al momento de encender el equipo):

Registro
Color
=
Matiz
Luminancia
708 (CO. 0)
40
 
2
8
709 (CO. 1)
202
 
12
10
710 (CO. 2)
148
 
9
4
711 (CO. 3)
70
 
4
6
712 (CO. 4)
0
 
0
0


Las ubicaciones 713 a la 735 ($2C9 a la $2DF) corresponden a bytes sobrantes. Las ubicaciones 736 a la 767 ($2E0 a la $2FF) son para usos varios.

736-739

2E0-2E3

GLBABS

 

 

Variables globales, o 4 bytes sobrantes para los usuarios que no usan DOS. Para los usuarios de DOS, estos registros se utilizan de la siguiente manera:

736-737

2E0-2E1

RUNAD

 

 

Estos registros son utilizados por DOS para almacenar la dirección de ejecución leída desde el sector 1 del disco o desde un archivo binario. Una vez completa cualquier carga binaria, el control normalmente vuelve al menú del DOS. Sin embargo, se puede obligar a DOS a pasar el control a cualquier dirección específica almacenanda en RUNAD. Si RUNAD se establece en 40960 ($A000), entonces cuando se inicia el programa se llama al cartucho izquierdo (el cartucho BASIC, si ha sido insertado).

En el DOS 1.0, si ingresa la dirección de su archivo de carga binaria aquí, este se ejecuta automáticamente al utilizar la Carga Binaria del DOS (Opción L del menú). Si utiliza la opción Append (/A) (concatenar) de DOS 1.0 al guardar un archivo binario en el disco, puede hacer que la dirección de carga ingresada en esta ubicación se guarde junto con los datos. En DOS 2.0 se pueden especificar la direcciones de inicialización y de ejecución junto con el nombre del programa cuando éste se guarda en el disco (por ejemplo, GAME.OBJ,2000,4FFF,4F00,4000). DOS 2.0 utiliza la opción /A para mezclar (merge) archivos. En DOS 2.0, para evitar que sus archivos binarios se ejecuten automáticamente, finalice el nombre del archivo con /N al momento de cargarlo.

Para los usuarios de CompuServe, en el área de acceso de Popular Electronics Magazine (PEM) existe un excelente programa BASIC (con subrutinas en lenguaje de máquina) para crear archivos de arranque automático, encadenar archivos en lenguaje de máquina con BASIC y agregar un archivo de arranque automático para su interfaz Atari 850. Está disponible para descarga gratuita.

738-739

2E2-2E3

INITAD

 

 

Esta ubicación almacena la dirección de inicialización que se ha leído del disco. Un archivo de arranque automático debe cargar una dirección en RUNAD, la ubicación anterior, o en INITAD. El código apuntado por INITAD se ejecuta tan pronto como se cargue esa ubicación. El código apuntado por RUNAD se ejecuta solo después de que se haya completado todo el proceso de carga. Para devolver el control al DOS después de la ejecución de su programa, finalice su código con una instrucción RTS.

740

2E4

RAMSIZ

 

 

Tamaño de la memoria RAM, solo el byte alto; este es el número de páginas que representa la parte superior de la RAM (una página equivale a 256 bytes). Como nunca puede haber menos de una página completa, resulta práctico medir la RAM en unidades de página. Este es el mismo valor que en RAMTOP, en la ubicación 106 ($6A), transferido aquí desde TRAMSZ, en la ubicación 6. El espacio ahorrado al mover RAMSIZ o RAMTOP tiene la ventaja de estar por encima del área de la pantalla. El valor inicial de esta ubicación en un Atari con 48K de memoria RAM es igual a 160.

741,742

2E5,2E6

MEMTOP

 

 

Puntero a la parte superior de la memoria libre, utilizada tanto por BASIC (quien llama HIMEM a esta ubicación) como por el Sistema Operativo. Es pasada aquí desde TRAMSZ, en la ubicación 6, justo después del encendido del equipo. Esta dirección es la ubicación libre en RAM más alta para sus programas y datos. El valor se actualiza al encender el equipo, cuando se presiona la tecla RESET, cuando se cambia el modo gráfico o cuando se abre con OPEN un canal (IOCB) en la pantalla. La Lista de Despliegue comienza en el siguiente byte justo por encima de MEMTOP.

El controlador de pantalla abre con OPEN el dispositivo S: solo si no se necesita RAM por debajo de este valor (es decir, si hay suficiente RAM libre por debajo de esta ubicación como para acomodar el cambio de modo gráfico solicitado). La memoria por encima de esta dirección se utiliza para la Lista de Despliegue y la memoria RAM de despliegue de la pantalla. Además, si un cambio en el modo gráfico de pantalla extiende su memoria por debajo de APPMHI (ubicaciones 14 y 15: $E y $F), entonces la pantalla se establece nuevamente en GRAPHICS 0, se actualiza MEMTOP y se devuelve un error al usuario. De lo contrario, se produce el cambio de modo y se actualiza el valor de la ubicación MEMTOP.

El espacio ahorrado al mover MEMTOP se encuentra debajo de la Lista de Despliegue. Tenga cuidado de no sobrescribirlo si cambia los modos gráficos a mitad del programa. Cuando utilice la memoria debajo de MEMTOP para almacenamiento, asegúrese de configurar APPMHI por encima de sus datos para evitar que los datos de la pantalla desciendan a ella y la destruyan.

743,744

2E7,2E8

MEMLO57

 

 

Esta ubicación almacena el puntero al final de la memoria libre. Su valor inicial es 1792 ($700) y es actualizado por la presencia de DOS o cualquier otro programa o aplicación con poca memoria. Esta ubicación la utiliza el Sistema Operativo. El puntero BASIC al final de la memoria libre se encuentra en las ubicaciones 128 y 129 ($80 y $81). Después del encendido del equipo, el valor en MEMLO nunca es alterado por el Sistema Operativo.

Esta ubicación corresponde a la dirección de la primera ubicación libre disponible en RAM para el uso del programa. El valor de esta ubicación se configura después de que se hayan asignado todos los búfers FMS (consulte las ubicaciones 1801 y 1802; $709 y $70A). La dirección del último búfer del sector se incrementa en 128 (el tamaño del búfer en bytes) y el valor se coloca en MEMLO. El valor se actualiza al encender el equipo o cuando se presiona la tecla RESET. Este valor se devuelve a las ubicaciones 128 y 129 ($80 y $81) durante la ejecución del comando NEW del BASIC, pero no sucede lo mismo al ejecutarse un comando RUN, LOAD o al presionar la tecla RESET.

Si está reservando espacio para sus propios búfers o controladores de dispositivos, cargue su rutina en la dirección especificada por MEMLO, sume el tamaño de su rutina al valor de MEMLO y haga POKE en MEMLO con el nuevo valor más 1. Cuando no tiene DOS ni ningún otro programa de aplicación que use memoria residente de baja capacidad, MEMLO apunta a la dirección 1792 ($700). Con DOS 2.0 presente, MEMLO apunta a la dirección 7420 ($1CFC). Si cambia los valores predeterminados del búfer mencionados anteriormente, aumentará o disminuirá este último valor en 128 ($80) bytes por cada búfer agregado o eliminado, respectivamente.

Cuando se inicia la interfaz Atari 850 con o sin disco, se suman otros 1728 ($6C0) bytes al valor almacenado en MEMLO. Puede modificar MEMLO para proteger un área de memoria debajo de su programa. Esta es una alternativa para proteger un área por encima de RAMTOP (ubicación 106; $6A) y evita el problema de que la rutina CLEAR SCREEN destruya datos. Sin embargo, a menos que haya creado un archivo MEM.SAV, los datos se borrarán cuando llame a DOS. Para modificar MEMLO, debe comenzar haciendo POKE con 0 a WARMST (ubicación 8) y luego hacer un JMP al punto de entrada del cartucho BASIC en la ubicación 40960 ($A000), después de definir el área a proteger. Por ejemplo, pruebe lo siguiente:

10 DIM MEM$(24):PROTEGIDO=700:REM NUMBER OF BYTES TO CHANGE
15 BYTEALTO=INT(PROTEGIDO/256):BYTEBAJO=PROTEGIDO-256*BYTEALTO
20 FOR N=1 TO 24:READ PRG:MEM$(N)=CHR$(PRG):NEXT N
30 MEM$(6,6)=CHR$(BYTEBAJO):MEM$(14,14)=CHR$(BYTEALTO)
40 RESERVA=USR(ADR(MEM$))
50 DATA 24,173,231,2,105,0,141,231,2,173,232,2,105
60 DATA 0,141,232,2,169,0,133,8,76,0,160

Puede consultar la dirección de su memoria reservada mediante la siguiente sentencia antes de ejecutar el programa: PRINT PEEK(743) + PEEK(744) * 256. Este programa se elimina automáticamente al ejecutarse. La alteración de MEMLO es el método utilizado tanto por DOS como por el controlador del puerto RS-232 de la interfaz Atari 850. Para más información, vea la revista COMPUTE! de julio de 1981.


57 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

745

2E9

....

 

 

Byte sobrante.

746-749

2EA-2ED

DVSTAT

 

 

Corresponden a 4 registros de estado del dispositivo utilizados por la operación de estado (status) de E/S de la siguiente manera:

746 ($2EA) corresponde al estado de error del dispositivo y el byte de estado del comando. Si la operación es una E/S de disco, entonces el estado devuelto corresponde al estado del chip controlador 1771 de su unidad de disco Atari. Los bits establecidos en 1 devuelven los siguientes códigos de error:

Bit
Decimal
Error
0
1
Se recibió una trama de comando no válida (error).
1
2
Se recibió una trama de datos no válida.
2
4
Una operación de salida no se realizó correctamente.
3
8
El disco está protegido contra escritura.
4
16
El sistema está inactivo (en espera).
7
32
El controlador periférico es "inteligente" (tiene su propio microprocesador: por ejemplo, la unidad de disco). Todos los dispositivos Atari son inteligentes, excepto la grabadora de cassettes, por lo que el bit 7 normalmente será igual a 1 cuando se conecte un dispositivo.

747 ($2EB) corresponde al byte de estado del dispositivo. Para el disco, contiene el valor del registro de estado del controlador de la unidad. Para la interfaz Atari 850, contiene el estado de DSR, CTS, CRX y RCV cuando la E/S simultánea no está activa (consulte el Manual de la interfaz Atari 850). También contiene el valor del byte AUX2 de la operación anterior (consulte la descripción de IOCB en las ubicaciones 832 a la 959; $340 a la $3AF).

748 ($2EC) corresponde al valor máximo de tiempo de espera del dispositivo, en segundos. Un valor 60 en esta ubicación representa 64 segundos. Después de cada solicitud de estado del disco, este valor se devuelve a la ubicación 582 ($246). Su valor inicial es 31.

749 ($2ED) corresponde a la cantidad de bytes en el búfer de salida. Consulte la página 43 del Manual de la interfaz Atari 850.

Cuando la E/S simultánea está activa, el comando STATUS asigna la cantidad de caracteres en el búfer de entrada a las ubicaciones 747 y 748, y la cantidad de caracteres en el búfer de salida a la ubicación 749.

750,751

2EE,2EF

CBAUDL/H

 

 

Bytes alto y bajo de la velocidad del cassette, en baudios. Su valor inicial es 1484 ($5CC), lo que representa 600 baudios nominales (o bits por segundo). Luego de los cálculos de la velocidad en baudios, estas ubicaciones contienen los valores de POKEY en baudios para la velocidad corregida. SIO ajusta la velocidad en baudios para tener en cuenta las variaciones del motor, el estiramiento de la cinta, etc. El comienzo de cada registro de cassette contiene un patrón de bits alternados de encendido y apagado (0/1) que se utilizan únicamente para corregir la velocidad (baudios).

752

2F0

CRSINH58

 

 

Bandera de inhibición del cursor. Cuando esta ubicación es igual a 0, se activa el cursor; cualquier otro número lo desactiva. Un cursor visible es un carácter de espacio en blanco en video inverso. Tenga en cuenta que la visibilidad del cursor no cambia hasta la próxima vez que el cursor se mueva (si se cambia durante un programa). Si desea cambiar el estado del cursor sin alterar los datos de la pantalla, luego del cambio en CRSINH haga una secuencia de movimiento del cursor (por ejemplo, arriba, abajo). Este registro se establece en 0 (cursor restaurado) durante el encendido del equipo, luego de haber presionado la tecla RESET o BREAK, o haber hecho un comando OPEN al controlador de pantalla (S:) o al editor de pantalla (E:). Para ver otra forma de apagar el cursor, consulte la ubicación 755.


58 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

753

2F1

KEYDEL

 

 

Bandera de retraso o contador de rebote de las teclas; se utiliza para ver si se ha presionado alguna tecla. Si esta ubicación es igual a 0, entonces no se ha presionado ninguna tecla. Si esta ubicación es igual a 3, entonces se ha presionado cualquier tecla. Se decrementa en cada etapa 2 del VBLANK (1/60 o 1/30 de segundo) hasta llegar a 0. Si se presiona cualquier tecla mientras KEYDEL es mayor que 0, entonces se ignora como "rebote". Para ver una rutina que cambia el retraso del teclado para adaptarlo a sus propias necesidades de escritura, consulte la revista COMPUTE! de diciembre de 1981.

754

2F2

CH1

 

 

Esta ubicación almacena el último código de carácter del teclado (el más recientemente leído y aceptado). Este es el valor anterior transferido desde la ubicación 764 ($2FC). Si el valor del nuevo código de tecla es igual al valor almacenado en CH1, entonces el código es aceptado solo si desde que se aceptó el valor anterior, ha tenido lugar un retraso adecuado del rebote de tecla.

755

2F2

CHACT59

 

 

Registro de modo de carácter. Un 0 en esta ubicación significa caracteres en modo video inverso normales. Un 1 significa caracteres en modo video inverso en blanco (los caracteres en modo video inverso se imprimirán como espacios en blanco, es decir, serán invisibles). Un 2 significa caracteres normales, y un 3 significa caracteres en video inversos sólidos. De 4 a 7 es lo mismo que de 0 a 3, pero imprime la pantalla al revés. Este registro también controla transparencia del cursor. El cursor será transparente con los valores 2 y 6, u opaco con los valores 3 y 7. No habrá cursor con los valores 0, 1, 4 y 5. Activar y desactivar el bit 0 puede ser una forma práctica de producir un efecto parpadeante para caracteres impresos en video inverso (caracteres con valores ATASCII mayores que 128, es decir, aquellos que tienen el bit 7 igual a 1). Registro sombra de la ubicación 54273 ($D401). No hay ningún cursor visible en los modos gráficos. El valor inicial de CHACT es 2. A continuación, se muestra un ejemplo de texto parpadeante utilizando este registro:

10 CHACT=755:REM ESCRIBA LAS SIGUIENTES PALABRAS EN VIDEO INVERSO
15 PRINT "ESTA ES UNA PRUEBA DE TEXTO PARPADEANTE"
20 POKE CHACT,INT(RND(0)*4)
30 FOR N=1 TO 100:NEXT N:GOTO 15

Para más detalles, vea la revista COMPUTE! de diciembre de 1981. Usando una rutina de lenguaje de máquina y el espacio disponible en la Página Seis, intente lo siguiente:

10 PAGINA=1536:SALIDA=1568
20 FOR N=PAGINA TO SALIDA:READ BYTE:POKE N,BYTE:NEXT N
30 PGM=USR(PAGINA)
40 PRINT "[ESTA] ES UNA [PRUEBA] DE [TEXTO] PARPADEANTE":REM EL TEXTO ENTRE PARENTESIS CUADRADOS VA EN VIDEO INVERSO
50 GOTO 50
60 DATA 104,169,17,141,40,2,169,6,141,41
70 DATA 2,169,30,141,26,2,96,173,243,2
80 DATA 41,1,73,1,141,243,2,169,30,141,26,2,96

Se establece la frecuencia de parpadeo en 1/2 segundo; para modificar esta frecuencia, cambie el 30 en la línea 80 con cualquier número entre 1 (1/30 de segundo) y 255 (8 y 1/2 segundos). Para conocer otra forma de hacer que el cursor sea visible o invisible, consulte la ubicación 752 más arriba.


59 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

756

2F4

CHBAS

 

 

Registro de base de caracteres; registro sombra de la ubicación 54281 ($D409). El valor predeterminado (valor de inicialización) de este registro es 224 ($E0) para los caracteres en mayúsculas y números. Haga POKE CHBAS con 226 ($E2) para obtener los caracteres en minúscula y los caracteres gráficos en GRAPHICS 1 y GRAPHICS 2. En GRAPHICS 0 se muestra el conjunto completo en la pantalla, pero en GRAPHICS 1 y GRAPHICS 2, debe hacer POKE a la ubicación 756 para que se muestre el medio-conjunto apropiado.

¿Cómo se crea un conjunto de caracteres modificado? Primero, debe reservar un área en la memoria para su nuevo conjunto (512 o 1024 bytes; para ver cómo se hace esto, consulte la ubicación 106; $6A). Luego, o bien mueve el conjunto (o la mitad del conjunto, si eso es todo lo que le interesa cambiar) desde la ROM a esa área y modificar los caracteres seleccionados, o bien llenar el área con los bytes que conforman su propio conjunto. Luego, haga POKE 756 con el byte más significativo de la ubicación de su conjunto para que el computador sepa dónde encontrarlo.

¿Cómo se ve un conjunto de caracteres modificado? Cada carácter es un bloque de un byte de ancho por 8 bytes de alto. Se establecen en 1 los bits para los puntos de la pantalla que se desea estén "activados" cuando se muestren. A continuación, se muestran 2 ejemplos:

1 byte de ancho:
00100000 = 32             #
00010000 = 16              #
00010000 = 16              #
00010000 = 16              #
00011110 = 30              ####
00000010 =  2                 #
00001100 = 12               ##
00010000 = 16              #

La letra hebrea Lamed


1 byte de ancho:
10000001 = 129          #      #
10011001 = 153          #  ##  #
10111101 = 189          # #### #
11111111 = 255          ########
11111111 = 255          ########
10111101 = 189          # #### #
10011001 = 153          #  ##  #
10000001 = 129          #      #

Un Tie-fighter

Puede convertir estos caracteres en declaraciones DATA para insertarlas en su área reservada utilizando los valores de los bytes como en los ejemplos anteriores. Para cambiar el conjunto una vez movido desde la ROM, mire el código interno (vea la página 55 del Manual de Referencia del BASIC) y encuentre el valor de la letra que desea reemplazar. Por ejemplo, la letra A tiene el código 33. Multiplique este valor por 8 bytes para cada número de código, contando desde el inicio del conjunto (33 * 8 es igual a 264). Luego reemplace los 8 bytes utilizados por la letra A, utilizando un ciclo FOR-NEXT con los valores de su propio carácter. Por ejemplo, agregue estas líneas al programa que usa lenguaje de máquina que se encuentra unas páginas más adelante:

1000 FOR CICLO=1 TO 4:READ CHAR:SET=CHACT+CHAR*8
1010 FOR VEZ=0 TO 7:READ BYTE:POKE SET+VEZ,BYTE:NEXT VEZ
1020 NEXT CICLO
1030 DATA 33,0,120,124,22,22,124,120,0
1040 DATA 34,0,126,82,82,82,108,0,0
1050 DATA 35,56,84,254,238,254,68,56,0
1060 DATA 36,100,84,76,0,48,72,72,48

Haga RUN y escriba las letras de la A a la D.

¿Por qué 224 y 226? Traducidos al hexadecimal, estos valores corresponden a $E0 y $E2, respectivamente. Estos son los bytes altos (bytes más significativos) de la ubicación del conjunto de caracteres almacenado en la ROM: $E000 (57344) es la dirección del inicio del conjunto (que comienza con puntuación, números y letras mayúsculas), y $E200 (57856) es la dirección de la segunda mitad del conjunto en la ROM: caracteres de control gráficos y minúsculas (ambos comienzan en los límites de la página). El conjunto en la ROM utiliza el orden interno que figura en la página 55 de su Manual de referencia BASIC, y no el orden ATASCII. Vea también la ubicación 57344 ($E000).

Note que al usar el comando PRINT#6 en los modos GRAPHICS 1 y GRAPHICS 2 sus caracteres tienen más de un color disponible. Intente imprimir caracteres en minúscula o en video inverso cuando utilice el conjunto de las mayúsculas. Este efecto puede ser muy útil para crear páginas de texto coloridas. Las letras mayúsculas, los números y los caracteres especiales utilizan el registro de color #0 (ubicación 708; $2C4 - naranja) para la visualización normal y el registro de color #2 (710; $2C6 - azul) para la visualización en video inverso. Las letras minúsculas utilizan el registro #1 (709; $2C5 - aguamarina) para visualización normal y el registro #3 (711; $2C7 - rosa) para visualización en video inverso. Para obtener una explicación sobre el uso de la tecla CONTROL junto con las teclas de letras para obtener diferentes efectos de color, consulte la página 98 de la revista COMPUTE! de diciembre de 1981.

Un problema al hacer POKE 756 con 226 es que no hay ningún espacio en blanco en el segundo conjunto: se obtiene una pantalla llena de corazones. Tiene 2 opciones: puede cambiar el color del registro #0 al mismo que el de fondo y perder aquellos caracteres que utilizan el registro #0 (los caracteres de control), pero conservar los espacios en blanco (y aún le quedan los registros 1, 2 y 3). O puede redefinir su propio conjunto que tenga un carácter en blanco. Esto último, obviamente, implica más trabajo. Para más detalles, consulte la sección "Ask the readers" de la revista COMPUTE! de julio de 1982.

Rara vez se menciona en los manuales, pero no se puede configurar la ubicación 756 en 225 ($El) ni ningún otro número impar. Si lo hace, solo obtendrá basura en la pantalla. El número de página al que apunta la ubicación 756 debe ser divisible por 2.

Cuando cree su propio conjunto de caracteres y lo almacene en la memoria, debe reservar al menos 1K para un conjunto de caracteres completo (1024 bytes - $400 o 4 páginas) y debe comenzar en un límite de página. En hexadecimal, estos son los números que terminan en $XX00, como $C000 o $600. Debido a que en la ubicación 756 se almacena el puntero a su conjunto, y que en esa ubicación sólo se puede almacenar el byte más significativo de la dirección, debemos suponer que el byte menos significativo siempre es igual a 0, es decir, un límite de página. Puede reservar memoria de la siguiente manera:

POKE 106,PEEK(106)-4 (o cualquier múltiplo de 4)

Y ejecute inmediatamente un comando GRAPHICS para que el computador acepte el nuevo valor de memoria. Si está utilizando solo la mitad de todo el conjunto, para GRAPHICS 1 o GRAPHICS 2, solo necesita reservar 512 bytes y puede comenzar en un límite de 1/2K (como $E200; estas son las ubicaciones de memoria en hexadecimal que terminan en $X200). Si planea alternar entre diferentes conjuntos de caracteres, necesita reservar 1K completo o más, según la cantidad de conjuntos de caracteres diferentes que necesite mostrar. La RAM para conjuntos de 1/2K se puede reservar mediante:

POKE 106,PEEK(106)-2 (o un múltiplo de 2)

La ubicación de su conjunto comienza entonces en PEEK(106)*256. Debido a que BASIC no siempre puede controlar la configuración de una Lista de Despliegue para GRAPHICS 7 y GRAPHICS 8 cuando se modifica la ubicación 106 en menos de 4K (16 páginas), es posible que deba usar PEEK(106)-16. Para obtener información sobre el uso de la pantalla y la reserva de memoria, consulte las ubicaciones 88 y 89 ($58 y $59), y 54279 ($D407).

Asegúrese de que su conjunto de caracteres no se superponga con los gráficos de sus player/missiles. Tenga mucho cuidado al utilizar conjuntos de caracteres modificados en memoria alta. Al cambiar los modos gráficos, al usar un comando CLEAR o desplazarse por la ventana de texto borra la memoria más allá de lo que se muestra en pantalla. Al desplazarse por la ventana de texto, no se desplazan simplemente 4 líneas, sino las 24 líneas completas (20 líneas adicionales * 40 bytes, lo que equivale a 800 bytes desplazados más allá de la memoria). Esto altera la memoria más allá de la dirección de visualización de la ventana, así que coloque los conjuntos de caracteres por debajo de cualquier posible interferencia (o no se desplace ni borre la pantalla).

Puede crear y almacenar tantos conjuntos de caracteres como su memoria lo permita. Puede cambiar entre ellos y el conjunto en la ROM simplemente introduciendo el byte más significativo de la dirección en la ubicación 756. Por supuesto, solo puede mostrar un conjunto a la vez, a menos que use una Lista de Despliegue modificada y una DLI para utilizar otros conjuntos. No existen restricciones más allá de los requisitos de memoria sobre el uso de conjuntos de caracteres alterados con gráficos P/M, siempre que las áreas reservadas para ellos no se superpongan.

Un comando GRAPHICS como GRAPHICS 0, un RESET o una llamada al DOS restaura el puntero del conjunto de caracteres a su ubicación en la ROM, por lo que después de cualquier comando de este tipo siempre debe hacer POKE nuevamente con la ubicación correcta de su nuevo conjunto. Un lugar útil para almacenar estos conjuntos es una página después del final de la RAM, asumiendo que ha regresado a la ubicación 106 ($6A) y ha restado la cantidad correcta de páginas del valor que contiene (haciendo POKE 106,PEEK(106) menos la cantidad de páginas a reservar; vea la ubicación de arriba). Luego puede restablecer la ubicación del conjunto de caracteres simplemente usando POKE 756,PEEK(106)+1 (el +1 simplemente se asegura de que comience en el primer byte de su conjunto).

Para un conjunto de caracteres completo es necesario reservar 1024 bytes (1K. Es decir, 4 páginas). ¿Por qué? Porque hay 128 caracteres, cada uno de ellos representado por 8 bytes, así que 128 * 8 es igual a 1024. Si está utilizando un modo gráfico que utiliza la mitad del conjunto de caracteres, sólo necesita reservar 512 bytes (64 * 8 equivale a 512). Recuerde comenzar cualquiera de ellos en el límite de una página (límite de 1K para conjuntos completos o 1/2K para medios conjuntos). Al alternar entre 2 conjuntos de caracteres, se puede crear la ilusión de animación.

Muchas revistas han publicado buenas utilidades para ayudar en el diseño de conjuntos de caracteres modificados, como la revista Creative Computing de enero de 1982 y el programa SuperFont de la revista COMPUTE! de enero de 1982. Para encontrar generadores de conjuntos muy útiles, le sugiero que revise los programas The Next Step de Online, Instedit de APX o FontEdit de Code Works. Una forma potencialmente útil de alterar sólo algunos de los caracteres es duplicar el bloque de memoria que contiene el conjunto en ROM moviéndolo byte por byte a la RAM. Un ciclo FOR-NEXT básico puede lograr esto, aunque es muy lento. Por ejemplo:

5 CH=57344
10 INICIO=PEEK(106)-4:LUGAR=INICIO*256:POKE 106,PEEK(106)-5:GRAPHICS 0:REM RESERVA EXTRA EN CASO QUE SE LIMPIE LA PANTALLA
20 FOR CICLO=0 TO 1023:POKE LUGAR+CICLO,PEEK(CH+CICLO):NEXT CICLO:REM MOVER EL CONJUNTO DESDE LA ROM
30 POKE 756,LUGAR/256:REM PARA DECIRLE A ANTIC DONDE SE ENCUENTRA EL CONJUNTO DE CARACTERES

Aquí tiene una rutina en lenguaje de máquina para mover el conjunto:

10 DIM BYTE$(80)
15 REM MEM-1 PARA PROTEGER EL CONJUNTO DE SU DESTRUCCION AL LIMPIAR LA PANTALLA (VEA UBICACION 88)
20 MEM=PEEK(106)-4:POKE 106,MEM-1:CHACT=MEM*256:GRAPHICS 0
30 FOR CICLO=1 TO 32:READ PGM:BYTE$(CICLO,CICLO)=CHR$(PGM):NEXT CICLO
40 DATA 104,104,133,213,104,133,212
50 DATA 104,133,215,104,133,214,162
60 DATA 4,160,0,177,212,145,214
70 DATA 200,208,249,230,213,230,215
80 DATA 202,208,240,96
90 Z=USR(ADR(BYTE$),224*256,CHACT)
.
. AGREGUE AQUI SU PROPIO PROGRAMA DE MODIFICACION O EL EJEMPLO ANTERIOR
.
.
1500 POKE MEM-1,0:POKE 756,MEM

Si tiene Microsoft BASIC o BASIC A+, puede hacerlo fácilmente con el comando MOVE.

Recuerde que, al modificar el conjunto de la ROM, los caracteres no están en orden ATASCII, sino en su propio orden interno. Su propio conjunto debe seguir este orden si desea que los caracteres se correlacionen con el teclado y los valores ATASCII. Para obtener un listado del orden interno, consulte la página 55 de su Manual de referencia BASIC. La revista Creative Computing de enero de 1982 tiene un buen artículo sobre conjuntos de caracteres, así como un método útil para transferir el conjunto desde la ROM a la RAM usando manipulación de cadenas. Para ver un ejemplo de uso de conjuntos de caracteres para gráficos animados, consulte también el artículo "Using Text Plot for Animated Games" de la revista COMPUTE! de abril de 1982.

757-761

2F5-2F9

....

 

 

Bytes sobrantes.

762

2FA

CHAR

 

 

Valor del código interno del carácter leído o escrito más recientemente (código interno del valor almacenado en la ubicación ATACHR que viene a continuación). Este registro es difícil de usar con el comando PEEK ya que devuelve el carácter más reciente, que generalmente corresponde al valor del cursor (128, $80 para un cursor visible, ó 0 para un cursor invisible).

763

2FB

ATACHR60

 

 

Devuelve el último carácter ATASCII leído o escrito, o el valor de un punto gráfico. ATACHR se utiliza para convertir el código ATASCII al código de carácter interno pasado desde o hacia el CIO. También devuelve el valor del punto gráfico. Los comandos del Sistema Operativo FILL y DRAW utilizan esta ubicación para el color de la línea dibujada, y ATACHR se carga temporalmente con el valor de FILDAT, en la ubicación 765; $2FD. Para forzar un cambio de color en la línea, haga POKE aquí con el número del color deseado (color * 16 + luminancia). Para ver este registro en uso como almacenamiento de caracteres, intente lo siguiente:

10 OPEN #2,4,0,"K:"
20 GET #2,A
30 PRINT PEEK(763);" ";CHR$(A)
40 GOTO 20

Asegúrese de que el comando PEEK vaya antes de la declaración PRINT CHR$. De lo contrario no obtendrá el valor adecuado. Cuando la tecla RETURN es la última tecla presionada, ATACHR muestra el valor 155.


60 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

764

2FC

CH61

 

 

Valor de hardware interno para la última tecla presionada. Haga POKE en CH con 255 ($FF; ninguna tecla presionada) para limpiarlo. El controlador del teclado obtiene todos los datos de las teclas desde la ubicación CH. Aquí se almacena el valor 255 para indicar que se ha aceptado el código de la tecla, luego pasa este código a CH1, en la ubicación 754 ($2F2). Si el valor en la ubicación CH es el mismo que en CH1, se aceptará un código de tecla solo si ha transcurrido el tiempo adecuado del retardo de rebote de tecla. Si el código es la combinación CONTROL-1 (las teclas CONTROL y 1 presionadas simultáneamente), entonces el indicador de inicio/detención en la ubicación 767 ($2FF) se complementa, pero el valor no se almacena en la ubicación CH. La lógica de repetición automática también almacena aquí la información de la tecla como resultado de su presión continua.

Este no es el valor del código ATASCII ni el código interno; es el código "sin procesar" de la matriz del teclado correspondiente a la tecla presionada. La tabla para la traducción de este código a código ATASCII se encuentra en la página 50 del Manual del Usuario del Sistema Operativo. En una operación de 2 teclas, se establece en 1 el bit 7 (si se presiona la tecla CONTROL) o el bit 6 (si se presiona la tecla SHIFT). El resto de los bytes corresponden al código (es decir, se ignora si los bits 6 ó 7 fueron establecidos en 1). Aquí sólo se almacena el código de la última tecla presionada (es una variable global del teclado).

Cuando se emite una solicitud de lectura al teclado, la rutina del controlador establece el valor 255 en la ubicación CH. Después de leer un código de tecla, este registro se restablece a 255. La tecla BREAK no se muestra aquí, y las teclas CONTROL y SHIFT no se mostrarán aquí por sí solas. Sin embargo, la tecla de video inverso (la tecla con el logotipo de Atari), las teclas CAPS/LOWR, TAB y ESC sí se mostrarán. Puede examinar este registro con el siguiente programa:

10 VER=PEEK(764)
20 PRINT "TECLA PRESIONADA = ";VER
30 POKE 764,255
40 FOR CICLO=1 TO 250:NEXT CICLO
50 GOTO 10

Para ver un ejemplo del uso de este registro como reemplazo de la entrada del joystick, consulte el libro COMPUTE!'s First Book of Atari.


61 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

765

2FD

FILDAT

 

 

Datos del color para la región de relleno en el comando XIO FILL.

766

2FE

DSPFLG

 

 

Bandera de visualización, utilizada para mostrar los códigos de control no asociados al carácter ESC (vea la ubicación 674; $2A2). Si se devuelve 0, o se hace POKE con un 0 en esta ubicación, entonces los códigos ATASCII 27 al 31, 123 al 127, 187 al 191 y 251 al 255 realizan sus funciones normales de control de pantalla (es decir, borrar la pantalla, mover el cursor, eliminar/insertar una línea, etc.). Si se devuelve cualquier otro número, se muestra un carácter de control (como al presionar la tecla ESC con CONTROL-CLEAR para obtener una representación gráfica de limpieza de pantalla).

Al hacer POKE en esta ubicación con cualquier número positivo se fuerza la visualización en lugar de la acción del código de control. Sin embargo, hay un pequeño error en Atari BASIC, no asociado con la ubicación 766: al hacer PRINT de CONTROL-R o CONTROL-U, se tratan como si fueran un punto y coma.

767

2FF

SSFLAG

 

 

Bandera de inicio/detención de la pantalla, utilizada para detener el desplazamiento de la pantalla durante la ejecución de una rutina de gráficos o DRAW, o un comando LIST o PRINT. Cuando el valor de esta ubicación es igual a 0, la salida por pantalla no se detiene. Cuando el valor de esta ubicación es igual a 255 ($FF; el complemento a uno), la salida por pantalla se detiene y la máquina espera a que el valor vuelva a ser 0 antes de continuar con el desplazamiento en la pantalla. Normalmente, el usuario activa y desactiva SSFLAG durante estas operaciones presionando la combinación de teclas CONTROL-1 para iniciar o detener el desplazamiento. El valor de esta ubicación es establecido en 0 al encender el equipo y al presionar la tecla RESET.


PÁGINA TRES


Las ubicaciones 768 a la 831 ($300 a la $33F) se utilizan para el controlador del dispositivo y los vectores de las rutinas del controlador (dispositivos S:, P:, E:, D:, C:, R: y K:). Un controlador de dispositivo es una rutina utilizada por el Sistema Operativo para controlar la transferencia de datos para la tarea asignada (como leer, escribir, guardar, etc.) en ese dispositivo en particular. El controlador residente D: no se ajusta completamente a las rutinas de llamada de los otros controladores - las rutinas de llamadas de SIO. En su lugar, utilice el DCB (Device Control Block - Bloque de Control del Dispositivo) para comunicarse directamente con el controlador del disco. El controlador del dispositivo R: se carga desde el módulo de la interfaz Atari 850. Consulte el libro De Re Atari, el Manual de la interfaz Atari 850 y las páginas 64 a la 65 del listado del Sistema Operativo.

Las ubicaciones 768 a la 779 ($300 a la $30B)62 son las direcciones del DCB residente, utilizadas para operaciones de E/S que requieren el bus serie; también se utilizan como el DCB del disco. DUP.SYS utiliza este bloque para interconectar el FMS (File Manager System - Sistema de Administración De Archivos) con el controlador de disco. La unidad de disco de Atari utiliza un acceso en serie a 19200 baudios (¡aproximadamente 20 veces más lento que el de Apple!). Tiene su propio microprocesador, un 6507, más 128 bytes de RAM, un chip ROM 2316 "enmascarado" de 2K (tal como una EPROM 2716), un chip temporizador RAM-I/O 2332 con otros 128 bytes de RAM (tal como el chip PIA) y un chip controlador WD 1771 FD. Para ver un ejemplo del uso del DCB de disco, consulte la columna "Outpost Atari" de la revista Creative Computing de mayo de 1982.

Todos los parámetros pasados a SIO están contenidos en el DCB. SIO utiliza la información del DCB y devuelve el estado en el DCB para su uso posterior por parte del controlador del dispositivo.


62 Encuentre información adicional para estas ubicaciones en la Adenda. (N. del T.)

768

300

DDEVIC

 

 

Identificador del bus serie del dispositivo (tipo de dispositivo serie) configurado por el controlador, y no modificable por el usuario. Sus valores son:

Unidades de discoD1-D449-52($31-$34)
ImpresoraP164($40)
ImpresoraP279($4F)
Puertos RS232R1-R480-83($50-$53)

769

301

DUNIT63

 

 

Número de unidad de disco o dispositivo: 1 al 4, configurado por el usuario.


63 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

770

302

DCOMND

 

 

El número de la operación (comando) del disco o dispositivo que se debe realizar, establecido por el usuario o por el controlador del dispositivo antes de llamar a SIO.

Los comandos del bus serie son:

Leer82($52)
Escribir (con verificación)87($57)
Estado83($53)
Poner (sin verificación)80(0)
Dar Formato33($21)
Descargar32($20)
Leer dirección84($54)
Leer giro (spin)81($51)
Encender Motor85($55)
Verificar sector86($56)

Todos son comandos de dispositivos de disco, excepto Escribir y Estado, que también son comandos de impresora (sin verificación).

771

303

DSTATS64

 

 

El código de estado al regresar al usuario. También se utiliza para establecer la dirección de los datos. Es decir, si el dispositivo debe enviar o recibir una trama de datos. El controlador del dispositivo utiliza este byte para indicar a SIO qué hacer después de enviar y reconocer la trama de comandos. Antes de la llamada a SIO, el controlador examina el bit 6 (1 equivale a recibir datos) y el bit 7 (1 equivale a enviar datos). Si ambos bits son iguales a 0, entonces no hay ninguna transferencia de datos asociada con la operación. Ambos bits establecidos en 1 no son válidos. SIO utiliza esta ubicación para indicar al controlador el estado de la operación solicitada después de la llamada.


64 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

772,773

304,305

DBUFLO/HI

 

 

Dirección del búfer del origen o destino de los datos que se van a transferir, o la información del estado del dispositivo (o los datos del sector del disco). Establecido por el usuario. No es necesario configurarlo si no hay datos transferidos, como por ejemplo en una solicitud de estado.

774

306

DTIMLO

 

 

El valor de tiempo de espera, en unidades de un segundo, proporcionado por el controlador para su uso por parte de SIO. El valor del tiempo de espera del cassette es 35, un poco más de 37 segundos. Los valores del temporizador son 64 segundos por cada 60 unidades de medida. Su valor inicial es igual a 31.

775

307

DUNUSE

 

 

Byte sin uso.

776,777

308,309

DBYTLO/HI

 

 

La cantidad de bytes transferidos desde o hacia el búfer de datos (o el disco) como resultado de la operación más reciente, establecida por el controlador. También se utiliza para el recuento de datos de sectores defectuosos. Hay un pequeño error en SIO que provoca acciones incorrectas del sistema cuando el último byte de un búfer se encuentra en una ubicación de memoria que termina en $FF, como por ejemplo, $A0FF.

778,779

30A,30B

DAUX1/2

 

 

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

El controlador del disco solo admite 5 comandos: GET (obtener) sector (82; $52), PUT (poner) sector (80; $50), PUT sector con VERIFY (verificación) (87; $57), solicitud de STATUS (estado) (83; $53) y FORMAT (dar formato) a todo el disco (33; $21). No hay ningún comando para dar formato a una parte específica del disco; esto lo hace el chip formateador/controlador INS 1771-1 en la unidad misma y no es accesible por parte del usuario. Ya se encuentra disponible la nueva versión "E" de la ROM de la unidad de disco que reemplaza a la version "C" actual. No sólo le permite a la unidad de disco funcionar más rápido que con la ROM antigua, sino que también permite el formateo selectivo de sectores del disco. Atari aún no ha anunciado si estará disponible esta nueva ROM para la unidad de disco 810. Para obtener más información, consulte el Manual del Usuario del Sistema Operativo.

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

780,781

30C,30D

TIMER1

 

 

Valor inicial del temporizador de velocidad, en baudios.

782

30E

ADDCOR

 

 

Bandera de corrección de suma para los cálculos de velocidad en baudios que involucran los registros del temporizador.

783

30F

CASFLG

 

 

Cuando esta ubicación es igual a 1, se establece el Modo cassette. Utilizado por SIO para controlar el flujo del programa a través del código compartido. Cuando esta ubicación se establece en 0, la operación actual es una operación SIO estándar; cuando es distinto de 0, es una operación de cassette.

784,785

310,311

TIMER265

 

 

Valor final del temporizador. Los temporizadores #1 y #2 contienen tiempos de referencia para el inicio y el final del período de recepción del patrón de bits fijo. El primer byte de cada temporizador contiene el valor de la ubicación VCOUNT (54283; $D40B) y el segundo byte contiene el valor actual del reloj en tiempo real de la ubicación 20 ($14). La diferencia entre los valores del temporizador se utiliza en una tabla de búsqueda para calcular el intervalo para los nuevos valores de la velocidad en baudios que serán pasados a las ubicaciones 750 y 751 ($2EE, $2EF).


65 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

786,787

312,313

TEMP1

 

 

Registro de almacenamiento temporal de 2 bytes utilizado por SIO para el cálculo de VCOUNT durante las rutinas del temporizador de baudios. Vea la ubicación 54283 ($D40B).

788

314

TEMP2

 

 

Registro de almacenamiento temporal.

789

315

TEMP3

 

 

Ídem.

790

316

SAVIO

 

 

Guarda los datos en el puerto serie usado para detectar y actualizar después de la llegada de cada bit. Se utiliza para conservar el estado del bit 4 de la ubicación 53775 ($D20F; registro de entrada de datos en serie).

791

317

TIMFLG

 

 

Bandera de tiempo de espera para la corrección de la tasa de baudios, utilizada para definir el valor no exitoso de tasa de baudios. Inicialmente establecido en 1, se disminuye durante la operación de E/S. Si llega a 0 (después de 2 segundos) antes de leer el primer byte del registro del cassette, se cancela la operación.

792

318

STACKP

 

 

Registro de puntero de la pila SIO. Apunta a un byte en la pila que se está utilizando en la operación actual (ubicaciones 256 a la 511; $100 a la $1FF).

793

319

TSTAT

 

 

Almacenamiento temporal del estado de la ubicación 48 ($30).

794-831

31A-33F

HATABS

 

 

Tabla de Direcciones de los Controladores. 38 bytes están reservados para hasta 12 entradas de 3 bytes por cada controlador, y los 2 últimos bytes se establecen en 0. Al encender el equipo, la tabla HATABS se copia desde la ROM.

Los dispositivos que se van a iniciar, como la unidad de disco, agregan la información de su controlador al final de la tabla. Cada entrada en la tabla tiene el caracter del nombre del dispositivo (C, D, E, K, P, S, R) en código ATASCII y la dirección del controlador (byte menos significativo / byte más significativo). Todos los bytes no utilizados se establecen en 0. FMS busca en HATABS desde el comienzo una entrada para el dispositivo "D:" y cuando no la encuentra, establece el vector del dispositivo al final de la tabla para apuntar al vector FMS en la ubicación 1995 ($7CB). CIO busca un caracter de controlador desde abajo hacia arriba. Esto permite que los nuevos controladores tengan prioridad por sobre los antiguos. Al presionar la tecla RESET se borran todas las entradas de HATABS, excepto las del controlador residente.

79431AID del dispositivo de impresora (P:), inicializado en 58416 ($E430).
79731DID del dispositivo de cassette (C:), inicializado en 58432 ($E440).
800320ID del editor de pantalla (E:), inicializado en 58368 ($E400).
803323ID del controlador de pantalla (S:), inicializado en 58384 ($E410).
806326ID del controlador del teclado (K:), inicializado en 58400 ($E420).

Puntos de entrada no utilizados de HATABS: 809 ($329), 812 ($32C), 815 ($32F), 818 ($332), 821 ($335), 824 ($338), 827 ($33B) y 830 ($33E). Estos están numerados secuencialmente del 1 al 8. Solo hay 2 bytes en la última entrada (sin usar), ambos establecidos en 0. Cuando DOS está presente, agrega una entrada a la tabla con el código ATASCII para la letra "D" y un vector para dirigirse a la ubicación 1995 ($7CB).

El formato de la tabla HATABS es el siguiente:

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

La entrada en la tabla de direcciones de controladores de dispositivos apunta al primer byte (byte bajo/byte alto) de la tabla de vectores que comienza en la ubicación 58368 ($E400). Cada controlador está diseñado con el siguiente formato:

Vector OPEN (Abrir)
Vector CLOSE (Cerrar)
Vector GET BYTE (Obtener byte)
Vector PUT BYTE (Poner byte)
Vector GET STATUS (Obtener estado)
Vector SPECIAL (Especial)
Salto al código de inicialización (JMP seguido del byte menos significativo / byte más significativo)

CIO utiliza el ZIOCB (vea la ubicación 32; $20) para pasar parámetros al IOCB de origen, los registros A, X y Y y CIO. Es posible agregar sus propios controladores de dispositivos al Sistema Operativo siguiendo estas reglas:

1) Cargue su rutina, con los búfers necesarios en la dirección indicada por MEMLO: ubicación 743 ($2E7).

2) Sume el tamaño de su rutina al valor de MEMLO y haga POKE de este resultado en MEMLO.

3) Almacene el nombre y la dirección de su controlador en la tabla de direcciones de controladores HATABS.

4) Cambie los vectores para que el Sistema Operativo vuelva a ejecutar los pasos anteriores si se presionó RESET. Esto normalmente se hace ajustando las ubicaciones 12 ($C: DOSINI) y 10 ($A: DOSVEC).

Para obtener más detalles, consulte la columna "Insight: Atari" de la revistas COMPUTE! de enero y abril de 1982. El programa "T: A Text Display Device" de APX es un buen ejemplo de una aplicación del manejo de dispositivos. Para obtener más información sobre DCB y HATABS, incluido el uso de un controlador nulo, consulte el libro De Re Atari.


Las ubicaciones 832 a la 959 ($340 a la $3BF)66 están reservadas para los 8 IOCBs (Input Output Control Blocks - Bloques de Control de Entrada/Salida). Los IOCBs son canales para la transferencia de información (bytes de datos) dentro y fuera del Atari, o entre sus dispositivos. Se utilizan para indicarle al computador qué operación debe realizar, cuántos datos debe mover y, si es necesario, dónde se encuentran los datos que deben moverse. Cada bloque tiene reservados 16 bytes.

¿Qué es un IOCB? Cada vez que se imprime algo en la pantalla o en la impresora, cada vez que se carga o guarda un archivo, cada vez que se abre un canal, se está usando un IOCB. En algunos casos, las operaciones tienen funciones automáticas de abrir (OPEN) y cerrar (CLOSE) incorporadas, como el comando LPRINT. En otros, se debe indicar al computador Atari que realice cada paso según lo necesite. Algunos IOCBs están dedicados a un uso específico, como por ejemplo el #0 para la visualización en pantalla. Se pueden utilizar otros para cualquier función de E/S que se desee. La información que se coloca después del comando OPEN le dice a CIO cómo desea que se transfieran los datos, desde o hacia el dispositivo. Los que realizan la transferencia real de datos son SIO y los controladores de dispositivos.

Puede introducir fácilmente los valores necesarios en las ubicaciones de memoria y utilizar una subrutina en lenguaje de máquina a través de una función USR para llamar al CIO directamente (sin embargo, aún debe utilizar una declaración OPEN y CLOSE para el canal).

Esto es útil porque BASIC sólo admite la transferencia de datos de registros o de un solo byte, mientras que CIO maneja la E/S del búfer completo. Para obtener más detalles, consulte la dirección de entrada del CIO, en la ubicación 58454 ($E456). Estos bloques se utilizan de la misma manera que los IOCBs de la Página Cero (ubicaciones 32 a la 47; $20 a la $2F). El Sistema Operativo toma la información aquí, la mueve al ZIOCB para que la use el CIO de la ROM y luego devuelve la información actualizada al área del usuario cuando finaliza la operación.

Tenga en cuenta que cuando BASIC encuentra un comando DOS, hace CLOSE (cierra) a todos los canales excepto el 0. Para obtener un uso más detallado de estas ubicaciones, consulte el Manual del Hardware de Atari y el Manual de la interfaz 850 de Atari.


66 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

832-847

340-34F

IOCB0

 

 

Bloque de control de E/S (IOCB) #0. Normalmente se utiliza para el editor de pantalla (E:). Puede hacer POKE 838,166 y POKE 839,238 y enviar todo a la impresora en lugar de a la pantalla. (Haga POKE 838,163 y POKE 839,246 para enviar todo nuevamente a la pantalla). Puede usar esto en un programa para alternar, cuando lo solicite el usuario, entre la pantalla y la copia impresa. Esto le ahorrará múltiples comandos 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. Para obtener más información, consulte el Manual del Sistema Operativo. A la ubicación 842 se le puede asignar el valor 13 para leer desde la pantalla, y 12 para escribir en ella. Hacer POKE 842,13 pone el Atari en "modo de tecla RETURN", estableciendo en 1 el byte auxiliar #1 (ICAX1) para entrada y salida de pantalla. Al hacer POKE con 12 en la ubicación 842, se regresa al modo de entrada por teclado y salida por pantalla. El modo anterior permite el uso dinámico de la pantalla para actuar según los comandos sobre los que se mueve el cursor.

Puede utilizar este modo de "lectura forzada" en BASIC para leer datos en la pantalla sin intervención del usuario. Por ejemplo, en el programa siguiente, las líneas 100 a 200 serán eliminadas por el propio programa mientras 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 LAS SIGUIENTES LINEAS SERAN BORARRADAS
100 PRINT "BORRANDO..."
150 PRINT "BORRANDO..."
200 PRINT "!BORRADO!"

Para obtener un ejemplo de esta poderosa técnica, consulte la revista COMPUTE! de agosto de 1981. Para otra aplicación, consulte el Tricky Tutorial #1 de Santa Cruz (listas de despliegue). Los últimos 4 bytes (844 al 847; $34C al $34F en este caso) son bytes sobrantes (auxiliares) en todos los IOCBs.

Cuando se está en un modo gráfico distinto del modo 0, se abre el canal #0 para el área de la ventana de texto. Si la ventana está ausente y abre el canal #0, toda la pantalla vuelve al modo gráfico 0. Los comandos NEW y RUN del BASIC cierran todos los canales, excepto el #0. Cuando se abre un canal S: o E:, siempre se borra la pantalla.

Para ver un ejemplo del uso de un IOCB con la grabadora de cassettes, consulte la revista COMPUTE! de octubre de 1981, y la edición de septiembre de 1981 para otro uso con la impresora Atari 825.

848-863

350-35F

IOCB1

 

 

IOCB #1.

864-879

360-36F

IOCB2

 

 

IOCB #2.

880-895

370-37F

IOCB3

 

 

IOCB #3.

896-911

380-38F

IOCB4

 

 

IOCB #4.

912-927

390-39F

IOCB5

 

 

IOCB #5.

928-943

3A0-3AF

IOCB6

 

 

IOCB #6. El comando GRAPHICS abre el canal #6 para visualización en pantalla (S:), por lo que una vez que esté fuera del modo gráfico 0, no puede usar el canal #6, a menos que primero ejecute el comando CLOSE#6. Si cierra este canal, no podrá utilizar los comandos DRAWTO, PLOT o LOCATE hasta que vuelva a abrir el canal. El comando LOAD cierra el canal #6; también cierra todos los canales, excepto el #0.

944-959

3B0-3BF

IOCB7

 

 

IOCB #7. LPRINT utiliza automáticamente el canal #7 para su uso. Si el canal está abierto para algún otro uso y se ejecuta un comando LPRINT, se produce un error, el canal se cierra y los LPRINT posteriores funcionarán. El comando LIST también utiliza el canal #7, incluso si este canal ya está abierto. Sin embargo, cuando el comando LIST termina su ejecución, cierra el canal #7. El comando LOAD utiliza el canal #7 para transferir programas desde y hacia la grabadora de cassettes o el disco. Los comandos LIST (excepto en la pantalla de visualización), LOAD y LPRINT también cierran todas las voces de sonido. Los comandos RUN desde cinta o disco y SAVE utilizan el canal #7, al igual que LIST. Los bytes dentro de cada IOCB se utilizan de la siguiente manera:

EtiquetaDesplazamientoBytesDescripción
ICHID01Índice en la tabla de nombres de dispositivos para el archivo actualmente abierto. Establecido por el Sistema Operativo. Si no está en uso, su valor es igual a 255 ($FF), el que también es su valor de inicialización.
ICDNO11Número de dispositivo, como 1 para D1: ó 2 para D2:. Establecido por el Sistema Operativo.
ICCOM21Comando para el tipo de acción que debe realizar el dispositivo, configurado por el usuario. En un comando OPEN esta es la primera variable después del número de canal. Vea a continuación un resumen del comando. También llamado ICCMD.
ICSTA31Estado más reciente devuelto por el dispositivo, establecido por el Sistema Operativo. Puede o no ser el mismo valor devuelto por la solicitud STATUS en BASIC. Para obtener una lista de valores de bytes de estado, consulte las páginas 165 y 166 del Manual del Usuario del Sistema Operativo.
ICBAL/H4,52Dirección del búfer de 2 bytes (Byte menos significativo, byte más significativo) para transferencia de datos o la dirección del nombre de archivo para hacer OPEN, STATUS, etc.
ICPTL/H6,72Dirección de la rutina de colocación de un byte del dispositivo, menos uno. Establecida por el Sistema Operativo en el comando OPEN, pero en realidad no es utilizado por él (sin embargo, BASIC lo utiliza). Apunta al mensaje "IOCB NOT OPEN" (IOCB no abierto) del CIO durante el encendido del equipo.
ICBLL/H8,92Longitud del búfer, establecido en la cantidad máxima de bytes a transferir en las operaciones PUT y GET. Se decrementa en 1 por cada byte transferido; se actualiza después de cada operación de lectura o escritura. Registra la cantidad de bytes realmente transferidos dentro y fuera del búfer después de cada operación.
ICAX1101Byte auxiliar #1, denominado AUX1. Se utiliza en el comando OPEN para especificar el tipo de acceso al archivo: 4 para lectura, 8 para escritura, y 12 para ambos (actualización). No todos los dispositivos pueden utilizar ambos tipos de operaciones. Este byte se puede utilizar en controladores escritos por el usuario para otros fines y se puede modificar en ciertos casos una vez que se ha abierto el IOCB (consulte el programa de ejemplo anterior). Para el dispositivo S:, si AUX1 es igual a 32, significa que se debe inhibir la función de borrado de pantalla al cambiar de modo gráfico. Para la mayoría de las aplicaciones, el uso de bits es el siguiente:

Bit76543210
Uso....sin uso....ELDA

E significa escribir, L significa leer, D significa directorio, A significa anexar (append).

ICAX2111Byte auxiliar #2, denominado AUX2. Uso especial de cada controlador de dispositivo; algunas funciones del puerto serie pueden utilizar este byte. Los bytes auxiliares 2 al 5 no tienen un uso fijo; se utilizan para almacenar datos dependientes del dispositivo y/o establecidos por el usuario.
ICAX3/412,132Bytes auxiliares #3 y #4; usados por los comandos NOTE y POINT del BASIC para mantener un registro del número de sector del disco.
ICAX5141Byte auxiliar #5. Usado por los comandos NOTE y POINT para mantener un registro del byte dentro de un sector. Almacena el desplazamiento relativo en un sector, de 0 a 124 ($7C). Los bytes 125 y 126 de un sector se utilizan para valores de enlace del sector, y el byte 127 ($7F) se utiliza como un recuento de la cantidad de bytes de datos en uso en dicho sector.
ICAX6151Byte auxiliar sobrante.

El desplazamiento corresponde al número que debe sumar al inicio del IOCB para introducir un valor en el campo correcto, como por ejemplo POKE 832 + DESPLAZAMIENTO, 12.

La siguiente es una lista de los valores asociados con el parámetro #1 de OPEN. La mayoría de estos valores aparecen en el libro Your Atari 400/800. Estos son los valores que se encuentran en ICAX1, no son los valores ICCOM.

Dispositivo
# Tarea
Descripción
Grabadora de cassette
4
Leer.
8
Escribir (puede hacer una de las 2 operaciones, no ambas).
Archivo de disco
4
Leer.
6
Leer directorio del disco.
8
Escribir nuevo archivo. Cualquier archivo abierto en este modo es eliminado y el primer byte escrito estará al comienzo del archivo.
9
Escribir--añadir (append). En este modo, el archivo se deja intacto y los bytes escritos se colocan al final del mismo.
12
Leer y escribir--actualizar. Los bytes leídos o escritos comenzarán en el primer byte del archivo. D: Si en AUX1 el bit 0 y el bit 3 son igual a 1, entonces la operación se añade a la salida.
Editor (E:)
8
Salida por pantalla.
12
Entrada de teclado y salida de pantalla.
13
Entrada y salida de pantalla. E: Si el bit 0 es igual a 1, entonces es una lectura forzada (comando GET).
Teclado
4
Leer.
Puerto serie
RS-232
5
Lectura concurrente.
8
Escritura en bloque.
9
Escritura concurrente.
13
Lectura y escritura concurrentes.
Pantalla (S:) Limpiar la pantalla después de un GR.También Ventana de TextoOperación de Lectura
8
nono
12
no
24
no
28
40
nonono
44
nono
56
nono
60
no

Tenga en cuenta que con S:, la pantalla siempre se borra en GRAPHICS 0 y no hay una ventana de texto separada en este modo gráfico a menos que el usuario la diseñe específicamente. Sin la pantalla limpia, el material anterior permanece en pantalla entre cambios de modo gráfico, pero no será legible en otros modos. Los valores con S: se colocan en el primer byte auxiliar del IOCB. Todos los valores de pantalla anteriores también corresponden a una operación de escritura.

El segundo parámetro del comando OPEN, colocado en el segundo byte auxiliar, es mucho más restringido en su uso. Generalmente se establece en 0. Si se establece en 128 ($80) para el cassette, cambia de IRG (Inter Record Gap - Espacio Entre Registros) normales a cortos (AUX2).

En el caso específico de la impresora Atari 820, un 83 ($53; byte AUX2) significa caracteres laterales. Otras variables de impresora (todas también para AUX2) son: 70 ($4E) para impresión normal de 40 caracteres por línea, y 87 ($57) para modo de impresión ancha. Con la pantalla (S:), se puede utilizar un número para especificar los modos gráficos del 0 al 11. Si se elige el modo 0, se ignoran las opciones AUX1 mencionadas anteriormente.

Para el campo ICCOM, se aplican los siguientes valores (el comando XIO del BASIC utiliza los mismos valores):

ComandoDecimalHexadecimal 
Abrir canal
3
3
 
Obtener registro de texto (línea)
5
5
BASIC: INPUT #n,A
Obtener registro binario (búfer)
7
7
BASIC: GET #n,A
Poner registro de texto (línea)
9
9
 
Poner registro binario (búfer)
11
B
BASIC: PUT #n,A
Cerrar
12
C
 
Estado dinámico (canal)
13
D
 

BASIC utiliza un vector "PUT BYTE" (poner byte) especial en el IOCB para conversar directamente con el controlador del comando PRINT#n,A$.

Comandos del sistema de administración de archivos de disco (comando XIO del BASIC):

ComandoDecimalHexadecimal
Renombrar
32
20
Borrar (eliminar)
33
21
Proteger (bloquear)
35
23
Desproteger (desbloquear)
36
24
Point
37
25
Note
38
26
Dar Formato
254
FE

De manera adicional, XIO admite los siguientes comandos:

ComandoDecimalHexadecimal 
Obtener carácter
7
7
 
Poner carácter
11
B
 
Dibujar línea
17
11
Solo el controlador de pantalla.
Rellenar área
18
12
Solo el controlador de pantalla.

El relleno se realiza en BASIC con el comando XIO 18,#6,12,0,"S:" (para obtener más detalles consulte el Manual de Referencia del BASIC).

Para RS-232 (R:), XIO admite:

ComandoDecimalHexadecimal
Bloque parcial de salida
32
20
Control de RTS, XMT, DTR
34
22
Baudios, bits de parada, tamaño de la palabra
36
24
Modo de traducción
38
26
Modo concurrente
40
28

(Para obtener más detalles, consulte el Manual de la interfaz Atari 850).

CIO trata cualquier valor de byte de comando mayor a 13 ($D) como un caso especial y transfiere el control al controlador del dispositivo para su procesamiento. Para obtener más información sobre el uso de IOCB, lea las columnas "Insight: Atari" de Bill Wilkinson en las revistas COMPUTE! de noviembre y diciembre de 1981, y Microcomputing de agosto de 1982. Consulte también el Manual del Usuario del Sistema Operativo y el libro De Re Atari.


960-999

3C0-3E7

PRNBUF

 

 

Búfer de la impresora. El controlador de impresora recopila aquí la salida de los comandos LPRINT y las envía a la impresora cuando se produce un fin de línea (EOL; retorno de carro) o cuando el búfer esté lleno. Normalmente son 40 caracteres. Sin embargo, si una sentencia LPRINT genera menos de 40 caracteres y termina con un punto y coma, o genera 38 caracteres y termina con una coma, su computador Atari envía todo el búfer en cada ciclo FOR-NEXT y los bytes adicionales se rellenan con ceros. La salida del próximo comando LPRINT aparecerá en la columna 41 de la misma línea. Según el Manual del Usuario del Sistema Operativo, su computador Atari admite un dispositivo de impresora de 80 columnas llamado P2:. El uso de las sentencias OPEN y PUT en P2: pueden resolver este problema. A continuación, se muestra una pequeña rutina BASIC para una captura de pantalla del modo GRAPHICS 0:

10 DIM TEXTO$(1000):OPEN #2,4,0,"S:":TRAP 1050
.
.
.
1000 FOR LINEA=1 TO 24:POSITION PEEK(82),LINEA
1010 FOR COL=1 TO 38:GET #2,CARACTER:TEXTO$(COL,COL)=CHR$(CARACTER)
1020 NEXT COL:GET #2,COL
1030 LPRINT TEXTO$
1040 NEXT LINEA
1050 RETURN

Puede utilizar el registro PTABW en la ubicación 201 ($C9) para establecer la cantidad de espacios entre elementos de impresión separados por una coma. El número mínimo de espacios aceptados es 2. LPRINT utiliza automáticamente el canal #7 para la salida. No es necesaria la sentencia OPEN, y la sentencia CLOSE es automática.


Las ubicaciones 1000 a la 1020 ($3E8 a la $3FC) corresponden a un área sobrante reservada para el búfer.

1021-1151

3FD-47F

CASBUF

 

 

Búfer de la grabadora de cassettes. El controlador de la cassettera utiliza estas ubicaciones para leer y escribir datos en la grabadora.

A partir de la ubicación 1024 ($400 - Página Cuatro) se almacenan los 128 ($80) bytes de datos para cada registro del cassette. El tamaño actual del búfer se encuentra en la ubicación 650 ($28A). La ubicació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 búfer.

Un registro de cassette consta de 132 bytes: 2 bytes de control establecidos en 85 ($55; ceros y unos alternados) para la medición de velocidad en la rutina de corrección de la velocidad en baudios; un byte de control (vea a continuación); 128 bytes de datos (en comparación con los 125 bytes de datos de un sector de disco) y un byte de suma de comprobación. En el búfer del cassette sólo se almacenan los bytes de datos. Para obtener más información sobre la grabadora de cassettes, consulte el libro De Re Atari.

VALORES DEL BYTE DE CONTROL

ValorSignificado
250 ($FA)
A continuación, se muestra 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 en 0.

Las ubicaciones 1152 a la 1791 ($480 a la $6FF) son para los requisitos de RAM del usuario (entorno externo), de acuerdo con la cantidad de RAM disponible en la máquina. Tendrá 640 ($280) bytes libres aquí siempre y cuando no utilice el paquete FP o el BASIC.

Las ubicaciones 1152 a la 1279 ($480 a la $4FF) tienen 128 ($80) bytes libres. El paquete de Coma Flotante, cuando se utiliza, requiere las ubicaciones 1406 a la 1535 ($57E a la $5FF).

1406

57E

LBPR1

 

 

Prefijo #1 de LBUFF.

1407

57F

LBPR2

 

 

Prefijo #2 de LBUFF.

1408-1535

580-5FF

LBUFF

 

 

Búfer de línea del BASIC; tiene 128 bytes de largo. Se utiliza como búfer de salida para los resultados de la rutina de conversión de FP a ASCII en la ubicación 55526 ($D8E6). La dirección del búfer de entrada se almacena en las ubicaciones 243 y 244 ($F3 y $F4).

1504

5E0

PLYARG

 

 

Argumentos polinomiales (usado por el paquete de FP).

1510-1515

5E6-5EB

FPSCR

 

 

Usado por el bloc de notas (scratch pad) del paquete FP.

1516-1535

5EC-5FF

FPSCR1

 

 

Ídem. El final del búfer se llama LBFEND.


1536-179167

600-6FF

....

 

 

Página Seis: Corresponden a 256 ($FF) bytes protegidos del uso por parte del Sistema Operativo. La Página Seis no es utilizada por el Sistema Operativo y puede usarse de manera segura para subrutinas de lenguaje de máquina, controladores de E/S especiales, conjuntos de caracteres modificados o cualquier cosa que el usuario pueda colocar en este lugar. Puede surgir algún problema cuando la instrucción INPUT recupera más de 128 caracteres. Las posiciones 1536 a la 1663 ($600 a la $67F) se utilizan inmediatamente como un búfer para los caracteres sobrantes. Para evitar desbordamientos, evite que las instrucciones INPUT recuperen más de 128 caracteres. La implementación de valFORTH de fig-FORTH (de ValPar International) utiliza toda la Página Seis para su código de arranque, por lo que no está disponible para su uso. Sin embargo, FORTH le permite reservar otros bloques de memoria para funciones similares. BASIC A+ utiliza las ubicaciones $0600 a la $67F.


67 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)


Las ubicaciones 1792 a la dirección especificada por LOMEM (ubicaciones 128 y 129; ($80 y $81) - el puntero a la memoria baja del BASIC) también son utilizadas por DOS y el Sistema de Administración de Archivos (FMS). Para obtener más detalles, consulte el código fuente del DOS y el libro Inside Atari DOS. Las direcciones a continuación son las del DOS 2.0S, el DOS oficial de Atari al momento de escribir este artículo. Hay otro DOS disponible como alternativa al DOS 2.0: el K-DOS (TM), de la empresa K-BYTE (R). K-DOS no se controla mediante menús, sino mediante comandos. No utiliza las mismas ubicaciones de memoria que el Atari DOS, aunque sí utiliza una versión modificada del Atari FMS. (Otro DOS controlado por comandos, llamado OS/A+, es completamente compatible con el DOS 2.0s y está disponible a través de la empresa OSS, los creadores del DOS 2.0S.)

1792-537768

700-1501

 

 

 

Memoria RAM del sistema de Administración de Archivos (Páginas Siete a la Quince). FMS proporciona la interfaz entre BASIC o DUP, y la unidad de disco. Es un controlador de dispositivo sofisticado para todas las operaciones de E/S que involucran el dispositivo D:. Permite a los usuarios utilizar los comandos especiales de disco de la sentencia XIO del BASIC (consulte el área IOCB de la ubicación 832 a la 959: $340 a la $3BF). Reside en la RAM debajo de la del BASIC y proporciona el punto de entrada a DOS cuando es llamado por BASIC.


68 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

5440-13062

1540-3306

 

 

 

RAM del DUP.SYS. La parte superior varía según la cantidad de espacio de almacenamiento asignado a los búfers de la unidad de disco y del sector.

6780-7547

1A7C-1D7B

 

 

 

Búfers de unidad y de datos del sector. La cantidad de memoria varía según la cantidad de búfers asignados.

7547-MEMLO

1D7C-3306 (máximo)

 

 

 

Corresponde a la parte no residente de DUP.SYS, es decir, las rutinas de utilidad del DOS. DUP proporciona las utilidades elegidas desde la página del menú DOS, no desde BASIC. No reside en la RAM cuando se utiliza BASIC u otro cartucho, sino que se carga cuando se llama a DOS desde el BASIC o durante el arranque automático (y ningún cartucho lo reemplaza).

Cuando se carga el DUP, se sobrescribe la parte inferior de la memoria. Si desea evitar que se destruya su programa, debe crear un archivo MEM.SAV en el disco antes de llamar a DOS desde su programa. Consulte el Manual de Referencia del DOS.


Las ubicaciones 1792 a la 2047 ($700 a la $7FF; Página Siete) corresponden al área de arranque (boot) del usuario. Cuando no se carga ningún programa DOS o DUP, MEMLO y LOMEM apuntan a la ubicación 1792. Esta área puede usarse posteriormente para sus programas en BASIC o lenguaje de máquina. La dirección de memoria libre más baja es 1792 y los programas pueden extenderse a partir de esta dirección. Antes del espacio de programa existe un búfer de una página utilizado para la tokenización de las sentencias BASIC, señalado por las ubicaciones 128 y 129 ($80 y $81). En realidad, un programa puede comenzar en cualquier dirección por encima de 1792 y por debajo de la Lista de Despliegue en pantalla, siempre y cuando su programa BASIC no sobrescriba este búfer. Además, 1792 es el inicio de la parte FMS del DOS, cuando está residente.

Cuando se inicia el software, el puntero MEMLO en las ubicaciones 743 y 744 ($2E7 y $2E8), en la base de datos del Sistema Operativo (ubicaciones 512 a la 1151; $512 a la $47F), apunta a la primera ubicación de memoria libre por encima de ese software; de lo contrario, apunta a 1792. La parte DUP de DOS reside parcialmente aquí, comenzando en la ubicación 5440 ($1540) y llegando hasta la 13062 ($1540 a la $3306). La ubicación de la rutina de entrada de arranque del disco del Sistema Operativo (DOBOOT) es 62189 ($F2ED). El Atari DOS 2.0S estándar ocupa los sectores del 1 al 83 ($53) en un disco. El sector 1 es el sector de arranque. Los sectores del 2 al 40 ($28) son la parte FMS y los sectores del 41 ($29) al 83 son la parte de DUP.SYS del DOS. Para obtener más información, consulte los listados del código fuente del DOS y del Sistema Operativo, y el libro Inside Atari DOS.


FMS, DOS.SYS y DUP.SYS

Los registros de arranque del disco (sector 1 de un disco) se leen y almacenan en la ubicación 1792 ($700). A partir de la ubicación $700 (1792), el formato es el siguiente:

ByteHexadecimalEtiqueta y uso
0700BFLAG: El indicador de arranque es igual a 0 (sin uso).
1701BRCNT: Número de sectores consecutivos a leer (si el archivo es DOS, entonces BRCNT es igual a 1).
2,3702,703BLDADR: Dirección de carga del sector de arranque ($700).
4,5704,705BIWTARR: Dirección de inicialización.
6706JMP XBCONT: Vector de continuación de arranque; $4C (76): Comando JMP a la siguiente dirección en los bytes 7 y 8.
7,8707,708Dirección de continuación de lectura del arranque (byte menos significativo / byte más significativo).
9709SABYTE: Número máximo de archivos abiertos simultáneamente. El valor predeterminado es 3 (vea la ubicación 1801 a continuación).
1070ADRVBYT: Bits de unidad: la cantidad máxima de unidades conectadas al sistema. El valor predeterminado es 2 (ver la ubicación 1802 a continuación).
1170B(sin uso) Dirección de asignación del búfer, establecida en 0.
12,1370C,70DSASA: Dirección de inicio de asignación de búfer. Cuando se carga DOS, apunta a la ubicación 1995 ($7CB).
1470EDSFLG: Indicador DOS. El indicador de arranque se establece en un valor distinto de 0. Debe ser distinto de 0 para serguir a la segunda fase del proceso de arranque. Indica que el archivo DOS.SYS se ha escrito en el disco; 0 equivale a que no hay archivo DOS, 1 equivale a un disco con sector de 128 bytes, 2 equivale a un disco con sector de 256 bytes.
17711BLDISP: Desplazamiento del byte de enlace del sector 125 ($7D). El byte de enlace del sector es el puntero al próximo sector del disco que se va a leer. Si es igual a 0, se ha llegado al final del archivo.
18,19712,713DFLADR: Dirección de inicio del archivo DOS.SYS.
20+714+Continuación del archivo de carga de arranque. Consulte el Manual del Usuario del Sistema Operativo y el capítulo 20 del libro Inside Atari DOS.

Los datos del sector de arranque se ubican en las posiciones 1792 a la 1916 ($700 a la $77C). Los datos del resto de DOS.SYS se encuentran a partir de la ubicación 1917 ($77D). Todas las cargas de archivos binarios comienzan con 255 ($FF). Los siguientes 4 bytes son las direcciones de inicio y del fin (byte menos significativo / byte más significativo), respectivamente.

1801

709

SABYTE69

 

 

Registra el límite en la cantidad de archivos que se pueden abrir simultáneamente. Generalmente se establece en 3, el máximo es 7 (uno para cada IOCB disponible; recuerde que el IOCB0 se usa para la visualización en pantalla). Cada archivo disponible ocupa 128 bytes para un búfer; si aumenta el número de búfers, como consecuencia disminuye su espacio de RAM. Puede hacer POKE en la ubicación 1801 con un nuevo número para aumentar o disminuir el número de archivos y luego reescribir DOS (llamando a DOS desde BASIC y eligiendo la opción "H" del menú) y tener este número como predeterminado en el nuevo DOS.


69 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

1802

70A

DRVBYT

 

 

El número máximo de unidades de disco en su sistema. El valor predeterminado de DOS 2.0 es 2. Los 4 bits menos significativos se utilizan para registrar qué unidades están disponibles, por lo que si tiene las unidades 1, 3 y 4, esta ubicación se leerá:

00001101 o 13 en decimal.

Cada unidad de almacenamiento tiene en la RAM un búfer de 128 bytes reservado para ella. Si tiene un valor distinto al predeterminado (2), entonces haga POKE 1802 con el número apropiado:

1 unidad   =  1 BIT  0           Binario 00000001 
2 unidades =  3 BITS 0 y 1               00000011 
3 unidades =  7 BITS 0, 1 y 2            00000111 
4 unidades = 15 BITS 0, 1, 2 y 3         00001111

Lo anterior asume que han sido enumerados secuencialmente. En caso contrario, introduzca con el comando POKE la traducción decimal adecuada para el código binario correcto: cada unidad se especifica mediante uno de los 4 bits menos significativos, desde 1 en el bit 0 hasta 4 en el bit 3. Si ejecuta PEEK (1802) y obtiene 3, por ejemplo, significa que se asignaron las unidades 1 y 2, y no que se asignaron 3 unidades.

Puede guardar su modificación en un nuevo disco abriendo el DOS y eligiendo la opción "H" del menú. Este nuevo DOS se iniciará con la cantidad de unidades y búfers que haya asignado. Un sistema de una sola unidad puede ahorrar 128 bytes de esta manera (256 si se elige un búfer de datos menos). Consulte la página G.87 del Manual del DOS.

1900

76C

BSIO

 

 

Punto de entrada a las rutinas de E/S del sector de disco del FMS.

1906

772

BSIOR

 

 

Punto de entrada al controlador de disco del FMS (?).

1913

779

....

 

 

Bandera de verificación de escritura para operaciones de E/S del disco. Haga POKE con 80 ($50) en esta ubicación para desactivar la función de verificación, y con 87 ($57) para volver a activarla. La escritura en disco sin verificación es más rápida, pero puede que obtenga errores en sus datos. He tenido muy pocos errores generados al desactivar la función de verificación, pero incluso un error en material crítico puede destruir un programa entero. Tenga cuidado al utilizar esta ubicación. Puede guardar DOS en un nuevo disco (como se indica arriba, con la opción "H" del menú) con la opción "sin verificar escritura" como su nuevo valor predeterminado. Consulte la página F.85 del Manual del DOS. El indicador de verificación de escritura de K-DOS se encuentra en la ubicación 1907 ($773).

1995

7CB

DFMSDH

 

 

Punto de entrada al controlador de dispositivo (disco) del FMS de 21 bytes. La dirección de este controlador se coloca en HATABS (ubicaciones 794 a la 831; $31A a la $33F) mediante la rutina de inicialización del FMS. Cuando CIO necesita llamar a una función del FMS, localiza la dirección de esa función a través de la tabla de direcciones del controlador. Consulte los capítulos 8 al 11 del libro Inside Atari DOS, publicado por COMPUTE! Books.

2016

7E0

DINT

 

 

Rutina de inicialización del FMS. Su punto de entrada es la ubicación 1995 ($7CB). DUP llama al FMS en este momento. K-DOS utiliza la misma ubicación para su rutina de inicialización.

2219

8AB

DFMOPN

 

 

Rutinas OPEN (abrir), incluidas las de apertura para agregar (append), actualizar y generar salida.

2508

900

DFMPUT

 

 

Rutinas PUT (poner) byte.

2591

A1F

WTBUR

 

 

Rutinas de E/S en ráfaga (burst).

2592-2773

A20-AD5

....

 

 

En las revistas COMPUTE! de mayo y julio de 1982 Bill Wilkinson comenta sobre el E/S en ráfaga, que no debería tener lugar cuando un archivo está abierto para actualización, pero que aún así lo hace debido a un error menor en DOS 2.0 (vea también el Capítulo 12 del libro Inside Atari DOS). Esto hace que las escrituras de actualización funcionen correctamente, pero las lecturas de actualización sean incorrectas. Los siguientes POKEs corregirán el problema. Recuerde guardar el DOS en un disco nuevo.

POKE 2592,130 ($A20,82) 
POKE 2593,19 ($A21,13) 
POKE 2594,73 ($A22,49) 
POKE 2595,12 ($A23,0C) 
POKE 2596,240 ($A24,F0) 
POKE 2597,36 ($A25,24) 
POKE 2598,106 ($A26,6A) 
POKE 2599,234 ($A27,EA) 
POKE 2625,16 ($A41,10) 
POKE 2773,31 ($AD5,1F)

(Tenga en cuenta que la edición de julio de 1982 de la revista COMPUTE! contiene un error tipográfico donde el valor que se debía introducir en la ubicación 2773 figuraba por error como 13, y no como 31). Wilkinson señala que una forma de deshabilitar por completo la E/S en ráfaga (¡útil en algunas circunstancias, como al usar la opción BINARY SAVE (guardar archivo binario) del DOS para guardar el contenido de la ROM en disco!) es la siguiente:

POKE 2606,0 ($A2E,0)

Sin embargo, esto hace que el sistema cargue y guarde archivos de manera mucho más lenta, por lo que no se recomienda como un cambio permanente en DOS.

2751

ABF

DFMGET

 

 

Rutinas GET (obtener) byte, incluidas las rutinas GET para archivos.

2817

B01

DFMSTA

 

 

Rutinas de STATUS (estado) del disco.

2837

B15

DFMCLS

 

 

Rutinas CLOSE (cerrar) del IOCB.

2983

BA7

DFMDDC

 

 

Inicio de las rutinas de comandos dependientes del dispositivo, incluidos los comandos especiales de la sentencia XIO del BASIC:

3033

BD9

XRENAME

 

 

Renombrar un archivo.

3122

C32

XDELETE

 

 

Eliminar un archivo.

3196

C7C

XLOCK,XUNLOCK

 

 

Bloquear (proteger) y desbloquear archivos. Las rutinas de desbloqueo comienzan en la ubicación 3203 ($C83).

3258

CBA

XPOINT

 

 

Comando POINT del BASIC.

3331

D03

XNOTE

 

 

Comando NOTE del BASIC. Para obtener información sobre estos 2 comandos BASIC, consulte el Manual de DOS. Y para ver un ejemplo de su uso, consulte el libro De Re Atari.

3352

D18

XFORMAT

 

 

Dar formato a todo el disco.

3501

DAD

LISTDIR

 

 

Listar el directorio del disco.

3742

E9E

FNDCODE

 

 

Decodificación del nombre de archivo, incluida la prueba de validación del comodín. El nombre del archivo actual está indicado por ZBUFP en las ubicaciones 67 y 68 ($43 y $44).

3783

EC7

....

 

 

Al hacer POKE en esta ubicación con el valor ATASCII deseado, puede cambiar el carácter comodín (*; ATASCII 42, $2A) utilizado por DOS por cualquier otro carácter de su elección. El DOS modificado se puede guardar nuevamente en el disco con la opción "H" del menú del DOS.

3818,3822

EEA,EEE

....

 

 

Al hacer POKE 3818,33 y POKE 3822,123 ($21,$7B), puede modificar DOS para que acepte nombres de archivos con puntuación, números y minúsculas; 33 es el rango bajo del código ATASCII y 127 el rango alto (valores inferiores o superiores corresponden a códigos de control y gráficos y caracteres inversos). Por supuesto, cualquier DOS sin modificar no aceptará tales nombres de archivo. En realidad, puede cambiar el rango a cualquier valor entre 0 y 255 a su discreción. Sin embargo, esto puede causar otros problemas con códigos ATASCII como espacios y el comodín (*; vea la ubicación anterior). Su DOS modificado puede ser guardado de nuevo en el disco por medio de la opción "H" del menú.

3850

F0A

FDSCHAR

 

 

Almacena los caracteres del nombre de archivo que resultan de las rutinas de decodificación del nombre del archivo.

3873

F21

SFDIR

 

 

Rutinas de búsqueda de directorio; busca el nombre del archivo especificado por el usuario.

3988

F94

WRTNXS

 

 

Rutina de escritura de los datos del sector.

4111

100F

RDNXTS

 

 

Rutina de lectura de los datos del sector.

4206

106E

RDDIR

 

 

Rutinas de lectura y escritura del sector del directorio.

4235

108B

RDVTOC

 

 

Lectura o escritura de los sectores de la tabla de contenidos del volumen (VTOC).

4293

10C5

FRESECT

 

 

Rutina de sector(es) libre(s); devuelve la cantidad de sectores libres en un disco que están disponibles para el usuario.

4358

1106

GETSECTOR

 

 

Rutina de obtención de sector; recupera desde el disco un sector libre para usar.

4452

1164

SETUP

 

 

SETUP (configuración) – inicialización de los parámetros del FMS. Prepara a FMS para tratar la operación a realizar y acceder a un determinado archivo. Vea el capítulo 7 del libro Inside Atari DOS.

4618

120A

WRTDOS

 

 

Rutina de escritura de un nuevo archivo DOS.SYS en el disco, incluido un nuevo archivo del FMS en el archivo DOS.SYS.

4789

12B5

ERRNO

 

 

Inicio de la tabla de números de error del FMS.

4856-497870

12F8-1372

....

 

 

Área de almacenamiento miscelánea del FMS: longitud del sector, unidad de cinta, nivel de pila, número de archivo, etc.


70 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

4993-5120

1381-1400

FCB

 

 

Inicio de los FCBs (File Control Blocks - Bloques de Control de Archivos) del FMS. Los FCBs se utilizan para almacenar información sobre los archivos que se están procesando actualmente. Los 8 FCBs son bloques de 16 bytes que se corresponden de forma individual con los IOCB. Cada FCB está formado por:

EtiquetaBytesPropósito
FCBFNO1Número del archivo que se está procesando actualmente.
FCBOTC1¿En qué modo se ha abierto el archivo?: agregar (append) es 1, leer directorio es 2, entrada es 4, salida es 8, actualizar es 12.
SPARE1Sin uso.
FCBSLT1Indicador para el tipo de longitud del sector; 128 o 256 bytes
FCBFLG1Indicador de trabajo. Si es igual a 128 ($80), entonces el archivo ha sido abierto para salida o anexión (append) y puede adquirir nuevos sectores de datos. Si su valor es igual a 64, entonces el sector está en el búfer de memoria esperando a ser escrito en el disco.
FCBMLN1Longitud máxima de datos del sector; 125 o 253 bytes según el tipo de unidad (densidad simple o doble). Los últimos 3 bytes del sector están reservados para el enlace del sector y los datos del conteo de bytes.
FCBDLN1Byte actual que se lee o modifica en la operación en un sector de datos.
FCBBUF1Indica a FMS qué búfer se ha asignado al archivo que se está procesando.
FCBCSN2Número del sector que se encuentra actualmente en el búfer.
FCBLSN2Número del siguiente sector en la cadena de datos.
FCBSSN2Sectores de inicio para datos adjuntos si el archivo ha sido abierto para ser adjuntado (append).
FCBCNT2Número de sectores para el archivo actual.

DUP no utiliza estos FCBs; escribe directamente en los IOCB. CIO transfiere el control a FMS según lo demande la operación y luego a SIO.

5121

1401

FILDIR

 

 

Directorio de archivos. Un búfer secuencial de 256 ($100) bytes para las entradas al directorio del disco.

5377

1501

ENDFMS

 

 

Búfer del directorio de disco (VTOC - Tabla de contenido del volumen). Se reservan 64 ($40) bytes, un byte para cada archivo posible. También marca el final del FMS. El VTOC (sector 360; $168) es un mapa de bits secuencial de cada uno de los 720 sectores del disco. Comienza en el byte 10 y continúa hasta el byte 99. Cuando un bit es igual a 1, indica que el sector asociado está en uso.

5440

1540

DOS

 

 

Dirección de inicialización de DUP.SYS. Comienzo del mini-DOS: la parte residente en RAM de DUP. En K-DOS se utiliza para el mismo propósito.

5446,545071

1546,154A

....

 

 

Contiene la ubicación (byte menos significativo / byte más significativo) del DOSVEC (ubicación 10; $A). Este es el puntero a la dirección a la que BASIC salta cuando se llama a DOS.


71 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

5533

159D

DUPFLG

 

 

Bandera para comprobar si DUP ya reside en la memoria. 0 significa que DUP no existe.

5534

159E

OPT

 

 

Se utiliza para almacenar el valor de la opción del menú del disco elegida por el usuario.

5535

159F

LOADFLG

 

 

Si esta ubicación es igual a 128, entonces no es necesario cargar un archivo de memoria (MEM.SAV).

5540

15A4

SFLOAD

 

 

Rutinas para cargar un archivo MEM.SAV, si es que existe.

5888

1700

USRDOS

 

 

Se nombra en el archivo de equivalencias de DUP.SYS, pero nunca se explica en los listados.

5899

170B

MEMLDD

 

 

Indica si se ha cargado el archivo MEM.SAV. 0 significa que no se ha cargado.

5947

173B

....

 

 

Aquí comienzan las rutinas de creación del archivo MEM.SAV (MEMSAVE). Comienzan con el nombre de archivo MEM.SAV almacenado en formato ATASCII. Las rutinas de escritura comienzan en la ubicación MWRITE (ubicación 5958; $1746). La utilidad MEMSAVE del DOS copia los 6.000 bytes inferiores de la memoria del disco para evitar que su programa BASIC se destruya cuando llama a DOS, y luego carga DUP.SYS en esa área de memoria.

6044,6045

179C,179D

INISAV

 

 

Ubicación para guardar el vector DOSINI (vea las ubicaciones 12 y 13; $C y $D). Punto de entrada a DOS en una llamada desde BASIC.

6046

179E

MEMFLG

 

 

Bandera para comprobar si se ha escrito memoria en el disco mediante un archivo MEM.SAV.

6418

1912

CLMJMP

 

 

Comprueba si DOS debe cargar MEM.SAV desde el disco antes de realizar una ejecución en la dirección del cartucho y luego salta a la dirección del cartucho.

6432

1920

LMTR

 

 

Comprueba si DOS debe cargar MEM.SAV antes de realizar un comando "RUN AT ADDRESS" (ejecutar en la dirección) desde el menú DOS.

6457

1939

LDMEM

 

 

Rutinas de carga de MEMSAVE (para el archivo MEM.SAV).

6518

1979

INITIO

 

 

Entrada del inicio en caliente de DUP.SYS. Un excelente programa para eliminar la necesidad de DUP.SYS y MEM.SAV (¡sin mencionar el tiempo requerido para cargarlos!) llamado MicroDOS se encuentra en la revista COMPUTE! de julio de 1982; vale la pena examinarlo. Vea también el artículo "The Atari Wedge" de la revista COMPUTE! de diciembre72 de 1982.


72 En el libro original, dice noviembre en vez de diciembre. (N. del T.)

6630

19E6

ISRODN

 

 

Inicio de la rutina de servicio de interrupción en serie para generar las rutinas necesarias para la salida de datos del DUP.SYS.

6691

1A23

ISRSIR

 

 

Inicio de las rutinas de servicio de preparación de interrupciones en serie del DUP.SYS.

6781

1A7D

....

 

 

Inicio de los búfers de la unidad de almacenamiento y de datos. Los búfers de unidad se numeran secuencialmente del 1 al 4, y los búfers de datos del 1 al 8, asumiendo que se asignan muchos para cada uno. Normalmente, los 2 primeros búfers se asignan a las unidades y los 3 siguientes a los datos. Los búfers tienen una longitud de 128 ($80) bytes cada uno y comienzan en las ubicaciones 6908 ($1AFC), 7036 ($1B7C), 7162 ($1BFA) y 7292 ($1C7C). Vea las ubicaciones 1801 y 1802 ($709 y $70A).

7420

1CFC

....

 

 

MEMLO (743, 744; $2E7, $2E8) apunta aquí cuando DOS está residente, a menos que se haya alterado la asignación del búfer. MEMLO apunta a la ubicación 7164 para una configuración de una unidad y 2 búfers de datos, lo que supone un ahorro de 256 bytes. Al cargar el controlador RS-232 desde la interfaz Atari 850, MEMLO se mueve otros 1728 bytes. El controlador RS-232 en la interfaz Atari 850 solo se inicia (se carga en la memoria) si primero inicia el archivo AUTORUN.SYS en su disco maestro Atari, o utiliza otro programa de arranque RS-232, como un programa de terminal. El controlador RS-232 se inicia en la memoria si no tiene un disco conectado y lo enciende antes de iniciar su computador. Aún puede utilizar el puerto de impresora (paralelo) en la interfaz Atari 850 incluso si el controlador RS-232 no ha sido iniciado.

7548

1D7C

....

 

 

Comienzo de la parte no residente del DUP; búfer de parámetros de 40 ($28) bytes.

7588

1DA4

LINE

 

 

Búfer de línea de 80 ($50) bytes.

7668

1DF4

DBUF

 

 

Búfer de datos de 256 ($100) bytes para rutinas de copia. Las rutinas de copia funcionan en pasadas de 125 bytes, iguales a la cantidad de bytes de datos en cada sector del disco. Se tienen 256 bytes en este búfer porque Atari había planeado una unidad de doble densidad que tiene 253 bytes de datos en cada sector.

7924

1EF4

....

 

 

Área de almacenamiento de variables diversas y búfers de datos.

7951-8278

1F0F-2056

DMENU

 

 

Aquí se almacenan los datos de visualización de la pantalla del menú del disco .

8191

1FFF

....

 

 

Este es el máximo de la RAM mínima requerida para el funcionamiento (8K). Para utilizar DOS, debe contar con un mínimo de 16K de memoria RAM.


RUTINAS DE DUP.SYS


Las ubicaciones 8192 a la 32767 ($2000 a la $7FFF) son la parte más grande del área de expansión de RAM; este espacio generalmente es para uso del usuario. Si tiene cargado DOS.SYS o DUP.SYS, verá que estos también utilizan una parte de esta área, hasta la ubicación 13062 ($3306), tal como se muestra a continuación:

8309

2075

DOSOS

 

 

Inicio del monitor de utilidades del DOS, incluidas las utilidades que son llamadas cuando se completa una función de selección de menú y la visualización del mensaje "SELECT ITEM" (seleccione opción).

8505

2139

DIRLIST

 

 

Listado del directorio.

8649

21C9

DELFIL

 

 

Eliminar un archivo.

8990

231E

....

 

 

Copiar un archivo. Esta área comienza con los mensajes de copia. Las rutinas de copia comienzan en la ubicación CPYFIL73: 9080 ($2378).


73 En el libro original, en vez de CPYFIL dice PYFIL. (N. del T.)

9783

2637

RENFIL

 

 

Rutina de cambio de nombre de un archivo en el disco.

9856

2680

FMTDSK

 

 

Dar formato a todo el disco. No hay forma de dar formato a sectores específicos de un disco con las ROM "C" utilizadas actualmente en sus unidades 810. Sin embargo, existe una nueva ROM, la versión "E", que no sólo permite dar formato a sectores de manera selectiva, sino que también es considerablemente más rápida. Al momento de escribir este artículo no se sabía si Atari lanzaría la versión "E".

9966

26EE

STCAR

 

 

Iniciar un cartucho.

10060

274C

BRUN

 

 

Ejecutar un archivo binario en la dirección especificada por el usuario.

10111

277F

....

 

 

Inicio de la rutina de escritura del archivo MEM.SAV en el disco. El punto de entrada está en la ubicación MEMSAV, ubicación 10138 ($279A).

10201

27D9

WBOOT

 

 

Escribir los archivos DOS/DUP en el disco.

10483

28F3

TESTVER2

 

 

Comprobación de la versión 2 del DOS. DOS 2.0S es el DOS oficial más reciente, considerablemente mejorado respecto al DOS anterior, el 1.0. La S significa densidad única (single). Atari había planeado lanzar una unidad de doble densidad (la Atari 815), pero la retiró de la línea de producción en el último minuto por alguna oscura razón de alto nivel. La empresa Percom ofrece una unidad de doble densidad.

10522

29A1

LDFIL

 

 

Cargar un archivo binario en la memoria. Si tiene una dirección de ejecución especificada en el archivo, este se inicia automáticamente.

10608

2970

LKFIL,ULFIL

 

 

Bloquear (proteger) y desbloquear archivos en un disco.

10690

29C2

DDMG

 

 

Duplicar un disco.

11528

2D08

DFFM

 

 

Duplicar un archivo.

11841

2E41

....

 

 

Subrutinas varias.

12078

2F2E

SAVFIL

 

 

Guardar un archivo binario.

12348

303CE

....

 

 

Subrutinas varias.

13062

3306

....

 

 

Fin del DUP.SYS.

El resto de la RAM está disponible en la ubicación 32767 ($7FFF).


CARTUCHO B: 8K


Las ubicaciones 32768 a la 40959 ($8000 a la $9FFF) son utilizadas, cuando está presente, por el cartucho derecho (sólo en el Atari 800). Cuando no está presente, esta área de la RAM está disponible para su uso en programas. Cuando se utiliza el cartucho BASIC de 8K, esta área generalmente contiene la Lista de Despliegue y la memoria de la pantalla. Al momento de escribir este artículo, el único cartucho que utiliza esta ranura es el Monkey Wrench de Eastern House Software.

Es posible tener cartuchos de 16K en el Atari combinando ambas ranuras usando 2 cartuchos de 8K o simplemente teniendo uno con chips de ROMs lo suficientemente grandes y usando sólo una ranura. En este caso, toda el área desde la ubicación 32768 hasta la 49151 ($8000 a la $BFFF) se usa como ROM de cartucho.

Técnicamente, primero se verifica la ranura del cartucho derecho para ver si hay un cartucho residente. Si este es el caso, se inicializa. Luego procede con la ranura izquierda. Puede confirmarlo colocando el cartucho del Assembler Editor en la ranura derecha y el de BASIC en la ranura izquierda.

BASIC arrancará, pero no el ASED. Sin embargo, al utilizar FRE(0), verá que tiene 8K menos de RAM para usar; y al mirar a través de esta área verá que el programa ASED está de hecho en la memoria, pero el control fue pasado a BASIC. El control pasa al cartucho ASED si se invierten los cartuchos. Esto se debe a que los últimos 6 bytes de los programas en el cartucho le indican al Sistema Operativo dónde comienza el programa: en ambos casos, es una ubicación en el área dedicada al cartucho izquierdo. Los 6 bytes son los siguientes:
BytePropósito
Izquierdo(A)Derecho(B) 
49146 ($BFFA)40954 ($9FFA)Dirección de inicio del cartucho (byte bajo)
49147 ($BFFB)40955 ($9FFB)Dirección de inicio del cartucho (byte alto)
49148 ($BFFC)40956,($9FFC)Devuelve 0 si se inserta un cartucho, y cualquier otro valor cuando no hay ningún cartucho presente. Esta información se transmite a la RAM de la Página Cero: si el cartucho A está enchufado, la ubicación 6 será igual a 1; si el cartucho B está enchufado, la ubicación 7 será igual a 1; de lo contrario, será igual a 0.
49149 ($BFFD)40957 ($9FFD)Byte de opción. Si el bit 0 es igual a 1, entonces se inicia el disco (de lo contrario no hay inicio del disco). Si el bit 2 es igual a 1, entonces se inicializa e inicia el cartucho (de lo contrario, se inicialíza pero no se inicia). Si el bit 7 es igual a 1, entonces el cartucho es un cartucho de diagnóstico que toma el control, pero no inicializa el Sistema Operativo (de lo contrario, no es un cartucho de diagnóstico). Atari utilizó cartuchos de diagnóstico en el desarrollo del sistema y no están disponibles para el público.
49150 ($BFFE)40958 ($9FFE)Byte bajo de la dirección de inicialización del cartucho.
49151 ($BFFF)40959 ($9FFF)Byte alto de la dirección de inicialización del cartucho. Esta es la dirección a la que el Sistema Operativo salta durante todos los encendidos y reinicios.

El Sistema Operativo hace uso temporal de las ubicaciones 36876 a la 36896 ($900C a la $9020) para configurar vectores para el controlador de interrupciones. Consulte las páginas 31 y 81 del listado del Sistema Operativo. Este código solo se utilizó en el sistema de desarrollo utilizado para diseñar el computador Atari.


CARTUCHO A: 8K


Las ubicaciones 40960 a la 49151 ($A000 a la $BFFF) son utilizadas, cuando está presente, por el cartucho izquierdo. Cuando no está presente, esta área de RAM está disponible para otros usos. Cuando no hay ningún cartucho presente, en esta área se encuentran la Lista de Despliegue y los datos de visualización en la pantalla.

La mayoría de los cartuchos utilizan esta ranura (vea la ubicación anterior), incluido el cartucho BASIC de 8K, el Assembler Editor y muchos juegos. A continuación, se muestran algunos de los puntos de entrada para las rutinas en el cartucho BASIC de 8K de Atari. Todavía no existe un listado oficial de la ROM del BASIC de Atari. Muchas de las direcciones que aparecen a continuación se encuentran en el libro Your Atari 400/800. Se han proporcionado otras en numerosos artículos de revistas y a partir del desensamblaje del cartucho BASIC.

RUTINAS DEL BASIC


40960-4103674 A000-A04C

Arranque en frío.


74 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

41037-41055 A04D-A05F

Arranque en caliente.

41056-42081 A060-A461

Rutinas de verificación de sintaxis.

42082-42158 A462-A4AE

Rutinas de búsqueda.

42159-42508 A4AF-A60C

Tabla de nombres de instrucciones (statement). La lista de TOKENs de instrucciones comienza en la ubicación 42161 ($A4B1). Puede imprimir una lista de estos tokens mediante el siguiente programa:

5 DIRECCION=42161
10 IF  NOT PEEK(DIRECCION) THEN PRINT :END
15 PRINT TOKEN,
20 BYTE=PEEK(DIRECCION):DIRECCION=DIRECCION+1
30 IF BYTE<128 THEN PRINT CHR$(BYTE);:GOTO 20
40 PRINT CHR$(BYTE-128)
50 DIRECCION=DIRECCION+2:TOKEN=TOKEN+1:GOTO 10

42509-43134 A60D-A87E

Tablas de sintaxis. La lista de tokens de operadores comienza en la ubicación 42979 ($A7E3). Puede imprimir una lista de estos tokens mediante el siguiente programa:

5 DIRECCION=42979:TOKEN=16
10 IF  NOT PEEK(DIRECCION) THEN PRINT :END
15 PRINT TOKEN,
20 BYTE=PEEK(DIRECCION):DIRECCION=DIRECCION+1
30 IF BYTE<128 THEN PRINT CHR$(BYTE);:GOTO 20
40 PRINT CHR$(BYTE-128)
50 TOKEN=TOKEN+1
60 GOTO 10

Para una explicación de los tokens del BASIC, consulte la revista COMPUTE! de enero y febrero de 1982, la revista BYTE de febrero de 1982, y el libro De Re Atari.

43135-43358 A87F-A95E

Administrador de memoria.

43359-43519 A95F-A9FF

Ejecutar la instrucción CONT.

43520-43631 AA00-AA6F

Tabla de instrucciones.

43632-43743 AA70-AADF

Tabla de operadores.

43744-44094 AAE0-AC3E

Ejecutar la rutina de la expresión.

44095-44163 AC3F-AC83

Rutina de precedencia de operadores.

44164-45001 AC84-AFC9

Ejecutar la rutina del operador.

45002-45320 AFCA-B108

Ejecutar la rutina de la función.

45321-47127 B109-B817

Ejecutar la rutina de la instrucción.

47128-47381 B818-B915

Subrutinas de la instrucción CONT.

47382-47542 B916-B9B6

Rutinas del manejo de errores.

47543-47732 B9B7-BA74

Rutinas del manejo de gráficos.

47733-48548 BA75-BDA4

Rutinas de E/S.

48549-49145 BDA5-BFF9

Rutinas de coma flotante (vea más abajo).

48551

BDA7

SIN

 

 

Calcular el seno de FR0. Comprueba DEGFLG (ubicación 251; $FB) para ver si los cálculos trigonométricos están en radianes (DEGFLG es igual a 0) o en grados (DEGFLG es igual a 6).

48561

BDB1

COS

 

 

Calcular el coseno de FR0, con acarreo. FR0 es el registro de coma flotante #0, y se encuentra en las ubicaciones 212 a la 217; $D4 a la $D9. Vea los puntos de entrada del paquete de Coma Flotante desde la ubicación 55296 en adelante.

48759

BE77

ATAN

 

 

Calcular el arcotangente de FR0, con acarreo.

48869

BEE5

SQR

 

 

Calcular la raíz cuadrada de FR0, con acarreo. Tenga en cuenta que existe un conflicto de direcciones para las rutinas anteriores. Las direcciones dadas son las de la primera edición del libro De Re Atari. El listado del código fuente del Sistema Operativo Atari proporciona las siguientes direcciones para estas rutinas de FP:

Estos son puntos de entrada, no son direcciones de inicio reales.

SIN  48513 ($81 BD) 
COS  48499 ($73 BD) 
ATAN 48707 ($BE43) 
SQR  48817 ($BEB1)

Sin embargo, después de desensamblar las ROMs del BASIC, descubrí que las direcciones en el libro De Re Atari parecen ser correctas.

49146,49147

BFFA,BFFB

 

 

 

Dirección de inicio del cartucho izquierdo.

49148

BFFC

 

 

 

Un número distinto de 0 en esta ubicación le indica al Sistema Operativo que no hay ningún cartucho en la ranura izquierda.

49149

BFFD

 

 

 

Byte de opción. Un cartucho que no especifica un disco de arranque puede usar toda la memoria, de la manera que estime conveniente, desde la ubicación 1152 ($480) hasta MEMTOP.

49150,49151

BFFE,BFFF

 

 

 

Dirección de inicialización del cartucho. Para obtener más información, consulte la sección anterior sobre la ranura derecha, ubicaciones 32768 a la 40959.


Cuando se guarda un programa BASIC, solo 14 de las más de 50 ubicaciones de la Página Cero que utiliza el BASIC se escriben en el disco o cassette junto con el programa. El resto se recalcula con un comando NEW o SAVE, a veces con RUN o GOTO. Estas 14 ubicaciones son:

128,129 80,81 LOMEM
130,131 82,83 VNTP
132,133 84,85 VNTD
134,135 86,87 VVTP
136,137 88,89 STMTAB
138,139 8A,8B STMCUR
140,141 8C,8D STARP

El espacio de las cadenas y arreglos no se carga; STARP se incluye solo para señalar el final del programa BASIC. Los otros 2 punteros críticos de la Página Cero del BASIC, que no se guardan con el programa, son:

142,143 8E,8F RUNSTK
144,145 90,91 MEMTOP

Para obtener más información sobre Atari BASIC, consulte el apéndice. Para obtener una descripción detallada, consulte el Manual de Referencia del Atari BASIC. Para obtener más información técnica, consulte el libro De Re Atari, la revista BYTE de febrero de 1982, y los libros COMPUTE!'s First Book of Atari y COMPUTE!'s Second Book of Atari.


Las ubicaciones 49152 a la 53247 ($C000 a la $CFFF) no se utilizan.

Lamentablemente, el usuario no puede escribir en este bloque de memoria bastante grande de 4K, por lo que actualmente es inútil. Al parecer esta área de ROM está reservada para una futura expansión. Abundan los rumores sobre nuevos sistemas operativos Atari que permiten gráficos en 3D, 192 KB de memoria RAM integrada y otras delicias. Lo más probable es que este espacio se consuma en la próxima actualización del Sistema Operativo. Si mira esta área, verá que no está completamente vacía; aparentemente se usó para el desarrollo del sistema en la era paleozoica de Atari.

Aunque técnicamente Atari es una máquina de 64K (1K equivale a 1024 bytes, por lo que 64K equivalen a 65536 bytes), en realidad no tiene todos los 64K disponibles para ser usados. El Sistema Operativo ocupa 10K; hay un bloque de 4K que no se utiliza, además de otras áreas no utilizadas en la ROM y, por supuesto, están los chips de hardware. BASIC (o cualquier otro cartucho) utiliza otros 8K. Los 1792 bytes inferiores son utilizados por el Sistema Operativo, BASIC y el paquete de Coma Flotante. Luego, DOS y DUP ocupan su espacio de memoria, sin mencionar si se inicia el controlador de la interfaz Atari 850, dejándole más o menos 38 KB de RAM para usar en sus programas BASIC.


Las ubicaciones 53248 a la 55295 ($D000 a la $D7FF) son para la ROM de los chips de E/S especiales que utiliza Atari. El chip CTIA (o GTIA, según el que tenga) utiliza las ubicaciones de memoria 53248 a la 53503 ($D000 a la $D0FF). POKEY usa las ubicaciones 53760 a la 54015 ($D200 a la $D2FF). PIA utiliza las ubicaciones 54016 a la 54271 ($D300 a la $D3FF). ANTIC utiliza las ubicaciones 54272 a la 54783 ($D400 a la $D5FF). ANTIC, POKEY y G/CTIA son chips LSI (Large Scale Integration - Integración a Gran Escala). No confunda esta ROM del chip con la ROM del Sistema Operativo que se encuentra en la memoria superior. Para obtener una descripción más completa de estos chips, consulte el Manual del Hardware de Atari.

Hay 2 bloques de memoria no utilizada y no disponible en las áreas de E/S: estas son las ubicaciones 53504 a la 53759 ($D100 a la $D1FF) y 54784 a la 55295 ($D600 a la $D7FF).

Muchos de los registros a continuación no se pueden leer directamente, ya que son registros hardware. Escribirles puede ser difícil porque, en la mayoría de los casos, los registros cambian cada 30 segundos (en la etapa 2 del VBLANK) o incluso cada 60 segundos (en la etapa 1 del VBLANK). Aquí es donde entran en juego los registros sombra mencionados anteriormente. Los valores escritos en estas ubicaciones de la ROM se extraen desde los registros sombra; para efectuar cualquier cambio "permanente" en BASIC (es decir, mientras su programa se esté ejecutando), debe escribir en estos registros sombra (en modo directo o mientras su programa se está ejecutando; todos estos valores se restablecerán a su estado de inicialización después de apretar la tecla RESET o de encender el equipo).

Las ubicaciones de los registros sombra están entre paréntesis; consulte estas ubicaciones para obtener más información. Si no se menciona ningún registro sombra, es posible que pueda escribir en la ubicación directamente desde el BASIC. El lenguaje de máquina es lo suficientemente rápido para escribir en las ubicaciones ROM y puede ser capaz de omitir por completo los registros sombra. Otra característica de muchos de estos registros es su naturaleza dual. Se leen para un valor y se escriben para otro. Las diferencias entre estas funciones se indican mediante (L) para funciones de lectura y (E) para funciones de escritura. Note que muchos de estos registros de doble propósito también tienen 2 etiquetas.


EL CHIP CTIA O GTIA


53248-5350375

D000-D0FF

 

 

 

GTIA (o CTIA) es un chip de interfaz de televisión especial diseñado exclusivamente por Atari para procesar la señal de video. ANTIC controla la mayoría de las funciones del chip C/GTIA. El chip GTIA cambia la pantalla en medio reloj de color con respecto a lo que muestra el CTIA, por lo que puede mostrar un color diferente al del CTIA en el mismo software. Sin embargo, este cambio permite que los players y los campos de juego se superpongan perfectamente.

Los modos GTIA carecen de una ventana de texto, pero puede crear un área definida en su pantalla con una DLI (vea la revista COMPUTE! de septiembre de 1982) o introduciendo el número de modo GTIA en la ubicación 87 ($57), haciendo POKE en la ubicación 703 con un 4 y luego configurando los bits adecuados en la ubicación 623 ($26F) para ese modo. Sin embargo, sólo con el primer método puede conseguir una pantalla legible. En este último caso, solo creará una ventana de 4 líneas, desplazable e ilegible. Puede introducir texto y escribir en ella como en cualquier ventana de texto normal; ¡solo que no podrá leerlo! GTIA, por cierto, parece ser que significa "George's Television Interface Adapter" (Adaptador de Interfaz de Televisión de George). Quienquiera que sea George, gracias, pero... ¿qué es CTIA? Para más información, consulte el Manual del Usuario del Sistema Operativo, el Manual del Hardware, el libro De Re Atari y las revistas COMPUTE! de julio a septiembre de 1982.


75 En el libro original dice 53505 en lugar de 53503. (N. del T.)

53248

D000

HPOSP0

 

 

(E) Posición horizontal del player #0. Son posibles valores del 0 al 227 ($E3) pero, dependiendo del tamaño del campo de juego, el rango puede ser de 48 ($30), la posición más a la izquierda, a 208 ($D0), la posición más a la derecha. Las demás posiciones estarán "fuera de pantalla".

Acá se encuentran los límites de pantalla normales para los players y missiles. Los valores pueden variar un poco debido a la naturaleza de la pantalla de su televisor. Los players y missiles pueden estar ubicados fuera de estos límites, pero no serán visibles (estarán fuera de la pantalla):

                             Arriba
                32 para resolución de una línea,
                  16 para resolución de doble
                             línea
               +--------------------------------+
               |                                |
               |                                |
               |                                |
48 para ambas  |                                | 208 para ambas
resoluciones   |                                | resoluciones
               |                                |
               |                                |
               |                                |
               +--------------------------------+
                              Abajo
                224 para resolución de una línea,
                  112 para resolución de doble
                              línea

Aunque puede hacer POKE en estos registros de posición horizontal, estos se restablecerán inmediatamente a 0. El player o missile permanece en la pantalla en la ubicación especificada por el POKE, pero para moverlo usando los registros de posición horizontal, no puede usar:

POKE 53248, PEEK (53248) + n (o -n)
lo que acabará generando un mensaje de error. En lugar de eso, necesita usar algo como esto:
10 POKE 704,220:GRAPHICS 1:HPOS=53248:POKE 623,8
20 N=100:POKE HPOS,N:POKE 53261,255
30 IF STICK(0)=11 THEN N=N-1:POKE HPOS,N:PRINT N
40 IF STICK(0)=7 THEN N=N+1:POKE HPOS,N:PRINT N
50 GOTO 30
No hay registros de posición vertical para los gráficos P/M, por lo que debe utilizar rutinas de software para mover los players verticalmente. Una idea para el movimiento vertical es reposicionar al player dentro de la región de los P/M en lugar de la RAM de la pantalla. Por ejemplo, el programa a continuación utiliza una pequeña rutina en lenguaje de máquina para realizar este movimiento:
1 REM LAS LINEAS DE LA 5 A LA 70 CONFIGURAN EL PLAYER
5 MANTENER=PEEK(106)-16
10 POKE 106,MANTENER:POKE 54279,MANTENER
20 GRAPHICS 7+16:POKE 704,78:POKE 559,46:POKE 53277,3
30 PMBASE=MANTENER*256
40 FOR CICLO=PMBASE+512 TO PMBASE+640:POKE CICLO,0:NEXT CICLO:REM PRIMERO LIMPIAMOS LA MEMORIA
50 X=100:Y=10:POKE 53248,X
60 FOR CICLO=0 TO 7:READ BYTE:POKE PMBASE+512+Y+CICLO,BYTE:NEXT CICLO:REM LOS GRAFICOS DEL PLAYER EN LA MEMORIA
70 DATA 129,153,189,255,255,189,153,129
80 REM LAS LINEAS DE LA 100 A LA 170 CONFIGURAN LA RUTINA EN LENGUAJE DE MAQUINA
100 DIM ARRIBA$(21),ABAJO$(21):ARRIBA=ADR(ARRIBA$):ABAJO=ADR(ABAJO$)
110 FOR CICLO=ARRIBA TO ARRIBA+20:READ BYTE:POKE CICLO,BYTE:NEXT CICLO
120 FOR CICLO=ABAJO TO ABAJO+20:READ BYTE:POKE CICLO,BYTE:NEXT CICLO
130 DATA 104,104,133,204,104,133,203,160,1,177
140 DATA 203,136,145,203,200,200,192,11,208,245,96
150 DATA 104,104,133,204,104,133,203,160,10,177
160 DATA 203,200,145,203,136,136,192,255,208,245,96
200 REM CONTROL VERTICAL
210 IF STICK(0)=14 THEN GOSUB 300
220 IF STICK(0)=13 THEN D=USR(ABAJO,PMBASE+511+Y):Y=Y+1
250 GOTO 210
300 U=USR(ARRIBA,PMBASE+511+Y):Y=Y-1
310 RETURN
Esto mueve verticalmente a cualquier player de 9 líneas (o menos) con el joystick. Si tiene un tamaño de player más grande, aumente el 11 en la línea 140 a un número mayor que la cantidad de líneas verticales que usa el player, y cambie el 10 en la línea 150 a uno mayor que la cantidad de líneas. Para agregar movimiento horizontal, agregue las siguientes líneas:
6 HPOS=53248
230 IF STICK(0)=11 THEN X=X-1:POKE HPOS,X
240 IF STICK(0)=7 THEN X=X+1:POKE HPOS,X
Puede utilizar la rutina para mover cualquier player cambiando el número 511 en la llamada a USR a 1 menos que la dirección de inicio del objeto a mover. Para ver un mapa de uso de la memoria gráfica de los P/M, consulte el apéndice. Los missiles son más difíciles de mover verticalmente con esta rutina, ya que mueve un byte completo, y no bits. Sería útil para mover los 4 missiles verticalmente si es necesario; aún podrían moverse horizontalmente de manera individual. Para obtener algunas soluciones y algunas rutinas de movimiento en lenguaje de máquina, consulte las revistas COMPUTE! de diciembre de 1981, febrero de 1982 y mayo de 1982. Para obtener una solución con animación que involucra gráficos P/M, consulte la revista COMPUTE! de octubre de 1981.

 

 

M0PF

 

 

(L) Colisión del missile #0 con el campo de juego. Este registro le indica con qué campo de juego el objeto ha "colisionado", es decir, se ha superpuesto. Si el missile #0 colisiona con el campo de juego #2, el registro indicaría 4 y así sucesivamente. El uso de bits es el siguiente:
Bit
76543210
Campo de juego
....sin uso....
3210
Decimal
............
8421

53249

D001

HPOSP1

 

 

(E) Posición horizontal del player #1.

 

 

M1PF

 

 

(L) Colisión del missile #1 con el campo de juego.

53250

D002

HPOSP2

 

 

(E) Posición horizontal del player #2.

 

 

M2PF

 

 

(L) Colisión del missile #2 con el campo de juego.

53251

D003

HPOSP3

 

 

(E) Posición horizontal del player #3.

 

 

M3PF

 

 

(L) Colisión del missile #3 con el campo de juego.

53252

D004

HPOSM0

 

 

(E) Posición horizontal del missile #0. Los missiles se mueven horizontalmente, como los players. Consulte la nota en la ubicación 53248 ($D000) sobre el uso de los registros horizontales.

 

 

P0PF

 

 

(L) Colisión del player #0 con el campo de juego. Existen algunos problemas al utilizar la detección de colisiones en los modos gráficos del 9 al 11. En GRAPHICS 9 y GRAPHICS 11 no hay colisiones claramente reconocidas. En GRAPHICS 10, las colisiones solo funcionan para los colores que corresponden a los registros habituales del campo de juego. Además, el color de fondo (BAK) lo establece PCOLR0 (ubicación 704; $2C0) en lugar del COLOR4 habitual (ubicación 712; $2C8), lo que afecta la detección de prioridad. En GRAPHICS 10, los colores del campo de juego establecidos por PCOLR0 a PCOLR3 (704 a 707; $2C0 a la $2C3) se comportan como players en lo que respecta a la prioridad. El uso de bits es:

Bit
76543210
Campo de juego
....sin uso....
3210
Decimal
............
8421

53253

D005

HPOSM1

 

 

(E) Posición horizontal del missile #1.

 

 

P1PF

 

 

(L) Colisión del player #1 con el campo de juego.

53254

D006

HPOSM2

 

 

(E) Posición horizontal del missile #2.

 

 

P2PF

 

 

(L) Colisión del player #2 con el campo de juego.

53255

D007

HPOSM3

 

 

(E) Posición horizontal del missile #3.

 

 

P3PF

 

 

(L) Colisión del player #3 con el campo de juego.

53256

D008

SIZEP0

 

 

(E) Tamaño del player #0. Haga POKE en esta ubicación con 0 ó 2 para tamaño normal (8 relojes de color de ancho), con 1 para duplicar el ancho de un player (16 relojes de color de ancho) y con 3 para ancho cuádruple (32 relojes de color de ancho). Cada player puede tener configurado su propio ancho. Un player de tamaño normal puede verse así:

00011000
00111100
01111110
11111111
11111111
01111110
00111100
00011000

En doble ancho, el mismo player se ve así:

0000001111000000
0000111111110000
0011111111111100
0011111111111100
0000111111110000
0000001111000000

En cuádruple ancho, el mismo player se convertiría en:

00000000000011111111000000000000
00000000111111111111111100000000
00001111111111111111111111110000
11111111111111111111111111111111
11111111111111111111111111111111
00001111111111111111111111110000
00000000111111111111111100000000
00000000000011111111000000000000

El uso de bits es el siguiente:

Bit76543210 
Tamaño:
..sin uso..
00Normal (8 relojes de color)
 01Doble (16 relojes de color)
10Normal
11Cuádruple (32 relojes de color)

 

 

M0PL

 

 

(L) Colisión entre el missile #0 y los players. No existe registro de colisión entre missiles. El uso de bits es:

Bit76543210
Player
..sin uso..
3210
Decimal
.........
8421

53257

D009

SIZEP1

 

 

(E) Tamaño del player #1.

 

 

M1PL

 

 

(L) Colisión entre el missile #1 y los players.

53258

D00A

SIZEP2

 

 

(E) Tamaño del player #2.

 

 

M2PL

 

 

(L) Colisión entre el missile #2 y los players.

53259

D00B

SIZEP3

 

 

(E) Tamaño del player #3.

 

 

M3PL

 

 

(L) Colisión entre el missile #3 y los players.

53260

D00C

SIZEM76

 

 

(E) Tamaño para todos los missiles; establezca los bits tal como se muestra a continuación (valores decimales incluidos):

Bits
Tamaño:
 NormalDobleCuádruple
7 y 6: missile 30,12864192
5 y 4: missile 20, 3216 48
3 y 2: missile 10, 8 4 12
1 y 0: missile 00, 2 1 3

donde el activar los bits en cada par anterior produce lo siguiente:

0 y 0: tamaño normal - 2 relojes de color de ancho
0 y 1: el doble del tamaño normal - 4 relojes de color de ancho
1 y 0: tamaño normal
1 y 1: 4 veces el tamaño normal - 8 relojes de color de ancho

Entonces, para obtener un missile de tamaño doble, debe establecer en 1 los bit 5 y 6, o hacer POKE 53260,48. Cuando se utilizan los registros GRAF, cada missile puede tener un tamaño establecido por separado de los otros missiles o players.

Varias fuentes, incluido el libro De Re Atari, dicen que no es posible configurar ni el tamaño ni la forma de los missiles por separado. A continuación, se muestra una rutina para demostrar que, de hecho, se pueden hacer ambas cosas:

10 POKE 53265,255:REM COMIENZO DE LA FIGURA
15 GRAPHICS 7
20 POKE 623,1:REM ESTABLECER PRIORIDADES
30 FOR X=1 TO 25
35 F=50
40 FOR C=704 TO 707:POKE C,F+X:F=F+50:NEXT C:REM COLORES
45 S=100
50 FOR P=53252 TO 53255:POKE P,S+X:S=S+20:NEXT P:REM POSICIONES EN LA PANTALLA
60 NEXT X
70 INPUT A,B:REM TAMANO Y FORMA DEL MISSILE
80 POKE 53260,A:POKE 53265,B
100 GOTO 30

Aquí tiene otro ejemplo que utiliza DMA, GRACTL y DMACTL77 (ubicaciones 53277 y 54272; $D01D y $D400):

10 POKE 623,1:POKE 559,54:POKE 54279,224:POKE 53277,1
20 FOR N=53252 TO 53255:POKE N,100+X:X=X+10:NEXT N:X=0
30 INPUT SIZE:POKE 53260,SIZE
40 GOTO 30

Para obtener más información sobre los gráficos P/M., consulte la ubicación 54279 ($D407).


76 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

77 En el libro original, dice DACTL en vez de DMACTL. (N. del T.)

 

 

P0PL

 

 

(L) Colisiones entre el player #0 y los otros players. El uso de bits es el siguiente:

Bit76543210
Player
..sin uso..
3210
Decimal
.........
8421

53261

D00D

GRAFP0

 

 

(E) Forma de los gráficos del player #0 escrita directamente en el registro de gráficos del player. Al utilizar estos registros, se elude a ANTIC. Solo utilice los registros GRAFP# cuando no esté usando el acceso directo a memoria (DMA: consulte GRACTL, en la ubicación 53277). Si el DMA está habilitado, los registros de gráficos se cargarán automáticamente desde el área especificada por PMBASE (ubicación 54279; $D407).

Los registros GRAF solo pueden escribir un único byte en el campo de juego, pero ocupa toda la altura de la pantalla. Pruebe esto para verlo:

10 POKE 53248,160:REM ESTABLECER POSICION HORIZONTAL DEL PLAYER 0
20 POKE 704,245:REM ESTABLECER COLOR NARANJA PARA EL PLAYER 0
30 POKE 53261,203:REM PATRON DE BITS 11001011

Para eliminarlo, haga POKE 53261,0. El orden de los bits va del 7 al 0, de izquierda a derecha en la pantalla del televisor. Cada conjunto de bits aparece como una línea vertical en la pantalla. Un valor de 255 significa que todos los bits serán establecidos en 1, creando una línea vertical ancha. También puedes utilizar los registros de tamaño para cambiar el ancho del player. El uso de los registros GRAF le permite utilizar players y missiles para cosas como límites en campos de juego o de texto con bastante facilidad.

 

 

P1PL

 

 

(L) Colisión entre el player #1 y los otros players.

53262

D00E

GRAFP1

 

 

(E) Gráficos del player #1.

 

 

P2PL

 

 

(L) Colisión entre el player #2 y los otros players.

53263

D00F

GRAFP2

 

 

(E) Gráficos del player #278.


78 En el libro original, dice "player 3" en vez de player #2. (N. del T.)

 

 

P3PL

 

 

(L) Colisión entre el player #3 y los otros players.

53264

D010

GRAFP3

 

 

(E) Gráficos del player #3.

 

 

TRIG0

 

 

(L) Botón del joystick #0 (644). Pin 6 del conector del control #1. Para todos los controles, 0 equivale a botón presionado, y 1 equivale a botón no presionado. Si el bit 2 de GRACTL (ubicación 53277; $D01D) se establece en 1, entonces todos los bits 0 de TRIG se bloquean cuando se presiona el botón (se establecen en 0) y solo se establecen en 1 (no se presiona el botón) cuando el bit 2 de GRACTL se establece en 0. El efecto de bloquear los botones es para devolver una lectura constante de "botón presionado" hasta que éste se restablezca.

53265

D011

GRAFM

 

 

(E) Gráficos para todos los missiles, sin DMA. GRAFM funciona de la misma manera que GRAFP0. Cada par de bits representa un missile, con la misma asignación que en la ubicación 53260 ($D00C) de más arriba.

Bit76543210
Missile-3--2--1--0-

Cada conjunto de bits crea una línea vertical que recorre toda la altura de la pantalla del televisor. Las formas de los gráficos de los missiles se pueden configurar por separado unas de otras utilizando los pares de bits adecuados. Para ocultar los players no deseados, escriba ceros en los bits, tal como se indica arriba.

 

 

TRIG1

 

 

(L) Botón del joystick #1 (645). Pin 6 del conector del control #2.

53266

D012

COLPM0

 

 

(E) Color y luminancia del player y del missile #0 (704). Los missiles comparten los mismos colores que sus players asociados, excepto cuando se unen para formar un quinto player. Luego toman el mismo valor de la ubicación 5327379 ($D019; registro de color 3).


79 En el libro original, dice 53733 en vez de 53273. (N. del T.)

 

 

TRIG2

 

 

(L) Botón del joystick #2 (646). Pin 6 del conector del control #3.

53267

D013

COLPM1

 

 

(E) Color y luminancia del player y del missile #1 (705).

 

 

TRIG3

 

 

(L) Botón del joystick #3 (647). Pin 6 del conector del control #3.

53268

D014

COLPM2

 

 

(E) Color y luminancia del player y del missile #2 (706).

 

 

PAL80

 

 

(L) Se utiliza para determinar si el Atari es PAL (compatible con televisores europeos e israelíes cuando los bits 1 al 3 son iguales a 0) o NTSC (compatible con América del Norte cuando los bits 1 al 3 son iguales a 1; 14 decimal, $E).

Los Ataris europeos funcionan un 12% más lento si están vinculados al ciclo VBLANK (el ciclo VBLANK PAL es cada 50 segundos en lugar de cada 60 segundos). Utilizan sólo un reloj de CPU a 3 MHZ, por lo que el 6502 funciona a 2,217 MHZ: un 25% más rápido que los Ataris norteamericanos.

Además, sus ROMs $E000 y $F000 son diferentes, por lo que existen posibles incompatibilidades con los Ataris norteamericanos en las rutinas de manejo de cassettes. Existe un tercer estándar de televisión llamado SECAM, utilizado en Francia, la URSS y partes de África. No sé si existe algún soporte de Atari para los estándares SECAM.

La televisión PAL tiene más líneas de escaneo por cuadro, 312 en comparación con 262. Los Ataris NTSC lo compensan agregando líneas adicionales al comienzo de la rutina VBLANK. No es necesario modificar las listas de despliegue y los colores son los mismos gracias a una modificación de hardware.


80 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

53269

D015

COLPM3

 

 

Color y luminancia del player y missile #3 (707).

53270

D016

COLPF0

 

 

Color y luminancia del campo de juego #0 (708).

53271

D017

COLPF1

 

 

Color y luminancia del campo de juego #1 (709).

53272

D018

COLPF2

 

 

Color y luminancia del campo de juego #2 (710).

53273

D019

COLPF3

 

 

Color y luminancia del campo de juego #3 (711).

53274

D01A

COLBK

 

 

Color y luminancia del fondo (BAK) (712).

53275

D01B

PRIOR

 

 

(E) Registro de selección de prioridad. PRIOR establece qué objetos en la pantalla (players, missiles y campos de juego) estarán delante de otros objetos. Los valores utilizados en este registro también se describen en la ubicación 623 ($26F), su registro sombra. Si utiliza prioridades en conflicto, los objetos cuyas prioridades estén en conflicto se volverán negros en su región de superposición.

Orden de Prioridad (Valores decimales entre paréntesis):
Bit #0 = 1 (1)Bit #1 = 1 (2)
Player #0Player #0
Player #1Player #1
Player #2Campo de juego #0
Player #3Campo de juego #1
Campo de juego #0Campo de juego #2
Campo de juego #1Campo de juego #3 y Player #5
Campo de juego #2Player #2
Campo de juego #3 y Player #5Player #3
FondoFondo
  
Bit #2 = 1 (4)Bit #3 = 1 (8)
Campo de juego #0Campo de juego #0
Campo de juego #1Campo de juego #1
Campo de juego #2Player #0
Campo de juego #3 y Player #5Player #1
Player #0Player #2
Player #1Player #3
Player #2Campo de juego #2
Player #3Campo de juego #3 y Player #5
FondoFondo

Bit 4 = 1: Habilita un quinto jugador de los 4 missiles.

Bit 5 = 1: La superposición de los players 0, 1, 2 y 3 es el tercer color (de lo contrario, la superposición es negra). El color resultante es un OR lógico entre los colores de los 2 jugadores.

Los bits6y7se utilizan para seleccionar los modos GTIA:
 0 0 = sin modos GTIA
 0 1 = GTIA GR.9
 1 0 = GTIA GR.10
 1 1 = GTIA GR.11

53276

D01C

VDELAY

 

 

(E) Registro de retardo vertical. Se utiliza para proporcionar capacidad de movimiento con resolución de una línea en el posicionamiento vertical de un objeto, cuando la pantalla con resolución de 2 líneas está habilitada. Al establecer en 1 un bit en VDELAY, el objeto correspondiente se mueve hacia abajo una línea de TV. Si DMA está habilitado, entonces el mover un objeto más de una línea se logra moviendo los bits en el mapa de memoria.

BitDecimalObjeto
7128Player #3
664Player #2
532Player #1
416Player #0
38Missile #3
24Missile #2
12Missile #1
01Missile #0

53277

D01D

GRACTL

 

 

(E) Se utiliza con DMACTL (ubicación 54272; $D400) para bloquear todos los botones de los joysticks y los paddles (para recordar si se han presionado), para encender los players y para encender los missiles. Para obtener los valores con los que se va a hacer POKE aquí, sume las siguientes opciones para la función deseada:

 DecimalBit
Para encender los missiles10
Para encender los players21
Para bloquear la entrada de los botones42

Para revocar la autorización de los P/M y apagar tanto los players como los missiles, haga POKE 53277,0. Una vez bloqueados, los botones darán una lectura continua de "botón presionado" la primera vez que se presionen hasta que el bit 2 se restablezca en 0. Los botones se colocan en modo "bloqueado" cuando se presiona cada botón individual, pero no se puede configurar el modo de bloqueo para botones individuales.

¿Alguna vez has pulsado la tecla BREAK durante un programa y aún quedan players o residuos en la pantalla? A veces, el pulsar la tecla RESET no borra este contenido de la pantalla. Hay formas de deshacerse de él:

POKE 623,4: Esto mueve a todos los players detrás de los campos de juego.
POKE 53277,0: Esto debe apagarlos.
POKE 559,2: Esto debe devolverle a una pantalla en blanco.

¡Asegúrese de guardar su programa antes de hacer POKEs, por si acaso!

53278

D01E

HITCLR

 

 

(E) Haga POKE en esta ubicación usando cualquier número para borrar todos los registros de colisión de los players y missiles. Es importante borrar este registro con frecuencia en un programa que a menudo comprueba colisiones (por ejemplo, un juego).

De lo contrario, podrían permanecer valores de colisión antiguos y confundir al programa. Una buena forma de hacer esto es hacer POKE HITCLR justo antes de un evento que pueda provocar una colisión; por ejemplo, justo antes de que se "lea" un joystick o una paddle para mover un player o disparar un missile.

A continuación, realice una prueba para detectar una colisión inmediatamente después de que se haya producido la acción. Recuerde que las colisiones múltiples hacen que las /sumas/ de los valores de colisión se escriban en los registros de colisión; si no borra HITCLR con la suficiente frecuencia, un programa que verifique colisiones individuales se verá afectado por estas sumas.

53279

D01F

CONSOL

 

 

(E/L) Se utiliza para comprobar si se ha presionado uno de los 3 botones amarillos de la consola (¡no el botón RESET!). Para limpiar el registro, haga POKE CONSOL,8. Al hacer POKE en esta ubicación con cualquier número entre 0 y 8, se escucha un clic en el altavoz. Un ciclo FOR-NEXT que alternadamente haga POKE a CONSOL con 8 y 0, o solo con 0, produce un zumbido, ya que el Sistema Operativo coloca un 8 cada 1/60 de segundo. Los valores de PEEK en esta ubicación oscilarán entre 0 y 7 según la siguiente tabla:

|Tecla      Valor    0    1    2    3    4    5    6    7    |
|                                                            |
+------------------------------------------------------------+
|                                                            |
|OPTION              X    X    X    X                        |
|SELECT              X    X              X    X              |
|START               X         X         X         X         |
|                                                            |
+------------------------------------------------------------+
 Bits   2            0    0    0    0    1    1    1    1
        1            0    0    1    1    0    0    1    1
        0            0    1    0    1    0    1    0    1

Donde 0 significa que se han presionado todas las teclas, 1 significa que se han presionado las teclas OPTION y SELECT, y así hasta 7, lo que significa que no se ha presionado ninguna tecla. CONSOL se actualiza con el valor 8 en cada etapa 2 del VBLANK.

Es posible utilizar el altavoz de la consola para generar diferentes sonidos. He aquí una idea basada en un artículo de la revista COMPUTE! de agosto de 1981:

10 GOSUB 1000
20 PRUEBA=USR(1536)
.
.
.
999 END
1000 FOR CICLO=0 TO 26:READ BYTE:POKE 1536+CICLO,BYTE:NEXT CICLO:RETURN
1010 DATA 104,162,255,169,255,141,31,208,169
1020 DATA 0,160,240,136,208,253,141,31,208,160
1030 DATA 240,136,208,253,202,208,233,96
Para cambiar el tono, haga POKE en las ubicaciones 1547 y 1555 con un valor más alto o más bajo (ambos están configurados en 240). Para cambiar la duración del tono, haga POKE en la ubicación 1538 con un valor más bajo (está configurado en 255 en la rutina anterior). Haga esto antes de realizar su llamada USR o altere las declaraciones DATA para cambiar permanentemente los valores en su propio programa. Para obtener tonos más claros, desactive el DMA (consulte la ubicación 559).

Las ubicaciones 53280 a la 53503 ($D020 a la $D0FF) son repeticiones de las ubicaciones 53248 a la 53279 ($D000 a la $D01F). No puede utilizar ninguna de las ubicaciones repetidas; considérelas "relleno". Es posible que se utilicen para otros fines en cualquier actualización del Sistema Operativo Atari.


Las ubicaciones 53504 a la 53759 ($D100 a la $D1FF) no se utilizan. Estos lugares no están vacíos; puede echar un vistazo y descubrir qué hay allí. Sin embargo, el usuario no puede modificarlos.


EL CHIP POKEY


53760-54015

D200-D2FF

 

 

 

POKEY es un chip de E/S digital que controla la frecuencia del audio y los registros de control, los divisores de frecuencia, los contadores de ruido polinomiales, los controles de potenciómetro (paddles), el generador de números aleatorios, el escaneo del teclado, la E/S del puerto serie y las interrupciones IRQ.

Las ubicaciones AUDF# (frecuencia de audio) se utilizan para el tono de los canales de sonido correspondientes, mientras que AUDC# (registros de control de audio) son los valores de volumen y distorsión para esos mismos canales. Para introducir valores de sonido, primero debe hacer POKE con un 0 en la ubicación 53768 ($D208) y con un 3 en la ubicación 53775 ($D20F).

Los valores de frecuencia pueden variar de 0 a 255 ($FF), aunque el computador incrementa el valor en 1 para que vaya de 1 a 256. Tenga en cuenta que la suma de los volúmenes no debe superar a 32, ya que el volumen está controlado por los 4 bits menos significativos. 0 significa sin volumen, y 15 ($F) significa el volumen más alto. Al hacer POKE en esta ubicación con un 16 ($10) fuerza la salida del sonido incluso si el volumen no está configurado (es decir, empuja el cono del altavoz hacia afuera. Se oirá un pequeño "pop"). Los 4 bits más significativos controlan la distorsión: 192 ($C0) es para un tono puro; otros valores varían de 32 a 192. Tenga en cuenta que en BASIC, la tecla BREAK no apaga el sonido; sin embargo, la tecla RESET sí lo hace. Para obtener más información sobre la generación de sonido, consulte el libro De Re Atari y la revista BYTE de abril de 1982.

Los registros AUDF también se utilizan como temporizadores de hardware de POKEY. Por lo general, se utilizan cuando se cuenta un intervalo menor a la duración de un VBLANK. Para intervalos más largos, utilice los temporizadores de software en las ubicaciones 536 a 545 ($218 a la $221). Cargue el registro AUDCTL con el número de la frecuencia de reloj deseada. Luego, establezca el volumen en 0 en el registro AUDC asociado con el registro AUDF que planea usar como temporizador. Cargue el registro AUDF con el número de intervalos de reloj que desea contar. Luego cargue en la memoria su rutina de interrupción y haga POKE con su dirección en el vector del temporizador apropiado entre las ubicaciones 528 y 533 ($210 y $215). Para habilitar la interrupción, debe configurar los bits adecuados en IRQEN y su registro sombra POKMSK en la ubicación 16 ($10). Por último, cargue STIMER con cualquier valor para cargar e iniciar el(los) temporizador(es). El Sistema Operativo forzará un salto al vector del temporizador y luego a su rutina cuando el registro AUDF cuente regresivamente hasta 0. El procesamiento del temporizador puede ser interrumpido por el DMA de ANTIC, por una DLI o por el proceso VBLANK.

Los valores de POT son para los paddles y van de 0 a 240, y aumentan a medida que se gira la perilla del paddle en sentido antihorario. Los valores menores a 40 y mayores a 200 representan un área en cada borde de la pantalla que puede no ser visible en todos los televisores o monitores.

53760

D200

AUDF1

 

 

(E) Frecuencia del canal de audio #1. En realidad, este es un número (N) utilizado en un "circuito de división por N": por cada N pulsos que entran (según lo establecido por el reloj de POKEY), sale un pulso. A medida que N se hace más grande, los pulsos de salida disminuirán y, por lo tanto, el sonido producido será una nota más baja. N puede estar en el rango de 1 a 256; POKEY suma 1 al valor en el registro AUDF. Para ver un programa que crea acordes en lugar de tonos individuales, consulte la revista BYTE de abril de 1982.

 

 

POT0

 

 

(L) Potenciómetro (paddle) #0 (624); POT es la abreviatura de potenciómetro. Al girar la perilla del paddle en el sentido de las agujas del reloj, se reducen los valores del potenciómetro. Para uso en lenguaje de máquina: estos valores POT son válidos solo 228 líneas de escaneo después del comando POTGO o después de los cambios ALLPOT (consulte las ubicaciones 53768; $D208 y 53771; $D20B). Los registros POT cuentan continuamente hasta 0, disminuyendo en cada línea de escaneo. Se restablecen a 228 cuando llegan a 0 o mediante los valores leídos de los registros sombra. Esto los hace útiles como temporizadores del sistema. Para un ejemplo de este uso, vea la revista COMPUTE! de febrero de 1982.

La secuencia de POTGO (vea la ubicación 53771; $D20B) restablece los registros POT a 0 y luego los lee 228 líneas de escaneo más tarde. Para el escaneo rápido del potenciómetro, se debe establecer en 1 el bit 2 de SKCTL (ubicación 53775; $D20F).

53761

D201

AUDC1

 

 

(E) Control del canal de audio #1. Cada registro AUDF tiene un registro de control asociado que establece los niveles de volumen y distorsión. La asignación de bits es la siguiente:

Bit765
4
3210 
 Distorsión
Solo
Nivel del 
 (ruido)
Volúmen
Volúmen 
 000
0
0000El más bajo
 0010001 
 etc. hasta: etc. hasta:
 111
1
1111El más alto
 (salida forzada)

Los valores de los bits de distorsión vienen a continuación. El primer proceso es dividir el valor del reloj por la frecuencia y luego enmascarar la salida usando los "polys" (polinomios) en el orden que se muestra a continuación. Finalmente el resultado se divide por 2.

Bit 
765 
0005 bits, luego 17 bits, polys
001Solo polys de 5 bits
0105 bits, luego 4 bits, polys
011Solo polys de 5 bits
100Solo polys de 17 bits
101Sin contadores de polys (tono puro)
110Solo polys de 4 bits
111Sin contadores de polys (tono puro)

En general, los tonos se vuelven más regulares (se hace evidente un zumbido reconocible) con menos polinomios y de menor valor para enmascarar la salida. Esto es aún más evidente en los rangos de frecuencia baja. Para tonos puros, haga POKE en esta ubicación con 160 ($A0) o 224 ($E0) más el volumen. Para obtener más detalles, consulte el libro De Re Atari y el Manual del Hardware.

 

 

POT1

 

 

(L) Registro del potenciómetro #1 (625).

53762

D202

AUDF2

 

 

(E) Frecuencia del canal de audio #2. También se utiliza junto con AUDF3 para almacenar la velocidad de 19.200 baudios para SIO.

 

 

POT2

 

 

(L) Potenciómetro #2 (626).

53763

D203

AUDC2

 

 

(E) Control del canal de audio #2.

 

 

POT3

 

 

(L) Potenciómetro #3 (627).

53764

D204

AUDF3

 

 

(E) Frecuencia del canal de audio #3. Se utiliza con AUDF3 y con AUDF4 para almacenar la velocidad de 600 baudios para SIO.

 

 

POT4

 

 

(L) Potenciómetro #4 (628).

53765

D205

AUDC3

 

 

(E) Control del canal de audio #3.

 

 

POT5

 

 

(L) Potenciómetro #5 (629).

53766

D206

AUDF4

 

 

(E) Frecuencia del canal de audio #4.

 

 

POT6

 

 

(L) Potenciómetro #6 (630).

53767

D207

AUDC4

 

 

(E) Control del canal de audio #4.

 

 

POT7

 

 

(L) Potenciómetro #7 (631).

53768

D208

AUDCTL81

 

 

(E) Control del audio. Para inicializar correctamente las capacidades de sonido de POKEY, haga POKE AUDCTL,0 y POKE 53775,3 ($D20F). Estos 2 son el equivalente de la declaración SOUND 0,0,0,0 del BASIC. AUDCTL es el byte de opción que afecta a todos los canales de sonido. La asignación de bits es la siguiente:

BitDescripción
7Convierte el contador polinomial de 17 bits en un contador de 9 bits (vea más abajo)
6Canal de reloj #1 con 1,79 MHz
5Canal de reloj #3 con 1,79 MHz
4Unir los canales 2 y 1 (16 bits)
3Unir los canales 4 y 3 (16 bits)
2Insertar un filtro de paso alto en el canal #1, sincronizado por el canal #2
1Insertar un filtro de paso alto en el canal #2, sincronizado por el canal #4
0Cambiar la base del reloj principal de 64 KHz a 15 KHz

Los contadores polinomiales se utilizan como fuente de pulsos aleatorios para la generación de ruido. Hay 3 polinomios, de 4, 5 y 17 bits de longitud. Los polinomios más cortos crean patrones de sonido repetibles, mientras que los polinomios más largos no tienen repetición aparente. Por lo tanto, al establecer el bit 7 en 1, convirtiendo los 17 bits en un polinomio de 9 bits, el patrón en la distorsión será más evidente. Usted elige qué polinomio(s) utilizar, estableciendo en 1 los 3 bits altos en los registros AUDC. El polinomio de 17 bits también se utiliza en la generación de números aleatorios; consulte la ubicación 53770 ($D20A).

Los bits del reloj permiten al usuario acelerar o ralentizar, respectivamente, los temporizadores del reloj, haciendo posibles rangos de frecuencia más altos o más bajos. Al configurar los canales en 1,79 MHz se producirá un sonido mucho más alto; el reloj de 64 KHz será más bajo y el reloj de 15 KHz el más bajo de todos. El reloj también se utiliza para configurar la frecuencia de los temporizadores AUDF.

2 bits (el 3 y el 4) permiten al usuario combinar los canales 1 y 2 ó 3 y 4 para obtener un rango de 9 octavas en lugar de las 5 habituales. He aquí un ejemplo del libro De Re Atari de este rango aumentado, que utiliza 2 paddles para cambiar la frecuencia: el paddle derecho realiza ajustes gruesos, y el paddle izquierdo realiza ajustes finos:

10 SOUND 0,0,0,0:POKE 53768,80:REM ESTABLECER EL RELOJ Y UNIR CANALES 1 Y 2
20 POKE 53761,160:POKE 53763,168:REM APAGAR CANAL 1 Y GENERAR TONO PURO EN EL 2
30 POKE 53760,PADDLE(0):POKE 53762,PADDLE(1):GOTO 30

Los filtros de paso alto permiten que sólo pasen frecuencias superiores al valor del reloj. Estos se utilizan principalmente para efectos especiales. Intente lo siguiente:

10 SOUND 0,0,0,0:POKE 53768,4:REM FILTRO PASO ALTO EN EL CANAL 1
20 POKE 53761,168:POKE 53765,168:REM TONOS PUROS
30 POKE 53760,254:POKE 53764,127
40 GOTO 40

Para obtener detalles completos, vea el excelente capítulo sobre el sonido en el libro De Re Atari: es la mejor explicación disponible de las funciones de sonido en el Atari. Consulte también el Manual del Hardware.


81 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

 

 

ALLPOT

 

 

(L) Estado del puerto de potenciómetros de 8 líneas; lee los 8 potenciómetros a la vez. Cada bit representa un potenciómetro (paddle) del mismo número. Si un bit se establece en 0, entonces el valor del registro para ese potenciómetro es válido (está en uso); si se establece en 1, entonces el valor no es válido. ALLPOT se utiliza con el comando POTGO de la ubicación 53771 ($D20B).


53769

D209

STIMER

 

 

(E) Registro de inicio de los temporizadores de POKEY (los registros AUDF de más arriba). Puede introducir cualquier valor distinto de 0 para cargar e iniciar los temporizadores; el valor en sí no se utiliza para los cálculos. Esto restablece todos los divisores de frecuencia de audio a sus valores AUDF. Si están habilitados por IRQEN (de la ubicación que viene más abajo), estos registros AUDF generan interrupciones del temporizador cuando realizan una cuenta regresiva desde el número que se puso allí hasta llegar a 0. Los vectores para las interrupciones del temporizador AUDF1, AUDF2 y AUDF4 se encuentran en las ubicaciones 528 a la 533 ($210 a la $215). La interrupción del temporizador #4 de POKEY solo está habilitada en la nueva ROM "B" del Sistema Operativo.

 

 

KBCODE

 

 

(L) Cuando se presiona una tecla, esta ubicación contiene el código del teclado que luego se carga en el registro sombra (764; $2FC). Generalmente se lee en respuesta a la interrupción del teclado. Compara este valor con el de CH1 en la ubicación 754 ($2F2). Si ambos valores son iguales, entonces el nuevo código se acepta solo si ha transcurrido un tiempo de retardo de rebote de tecla adecuado. Las rutinas que comprueban si se acepta el código de tecla comienzan en la ubicación 65470 ($FFBE). El bit 7 corresponde a la bandera de la tecla CONTROL, y el bit 6 a la bandera de la tecla SHIFT.

53770

D20A

SKREST

 

 

(E) Ubicación donde se establecen en 1 los bits 5 al 7 del registro de estado del puerto serie de la ubicación 53775.

 

 

RANDOM82

 

 

(L) Cuando se lee esta ubicación, actúa como un generador de números aleatorios. Lee los 8 bits de orden superior del contador polinomial de 17 bits (9 bits si está configurado el bit 7 de AUDCTL) para el valor del número. Puede utilizar esta ubicación en un programa para generar un entero aleatorio entre 0 y 255 mediante el siguiente programa:

10 PRINT PEEK(53770)

Esta es una solución más elegante que hacer INT(RND(0) * 256). Para probar los valores de este registro, utilice este sencillo programa:

10 FOR N = 1 TO 20: PRINT PEEK(53770): NEXT N

82 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

53771

D20B

POTGO

 

 

(E) Iniciar la secuencia de escaneo de potenciómetros. Primero debe leer los valores POT y luego iniciar la secuencia de escaneo, ya que POTGO establece en 0 los registros POT. Escrito por la etapa 2 del VBLANK.

53772

D20C

....

 

 

Sin uso.

53773

D20D

SEROUT

 

 

(E) Salida de datos del puerto serie. Generalmente se escribe en caso de una interrupción de salida de datos en serie. Escribe en el registro de retención paralelo de 8 bits (un byte) que se transfiere al registro de desplazamiento en serie cuando se ha transmitido un byte completo de datos. Este registro de "retención" se utiliza para contener los bits que se deben transmitir uno a la vez (en serie) como una unidad de un byte antes de la transmisión.

 

 

SERIN

 

 

(L) Entrada del puerto serie. Lee el registro de retención paralelo de un byte que se carga cuando se ha recibido un byte completo de datos de entrada en serie. Como se mencionó anteriormente, este registro de retención se utiliza para retener los bits a medida que se reciben, un bit a la vez, hasta que se recibe un byte completo. Luego, el computador toma este byte para procesarlo. También se utiliza para verificar el valor de la suma de comprobación en la ubicación 49 ($31).

El bus serie es el puerto del Atari en el que se conecta el cable de la unidad grabadora de cassette o disco. Para conocer los valores de los pines de este puerto, consulte la página 133 del Manual del Usuario del Sistema Operativo, y el Manual del Hardware.

53774

D20E

IRQEN

 

 

(E) Habilitar solicitud de interrupción. Si se ecribe un 0 en esta ubicación, se desactivan todas las solicitudes de interrupción, como la de la tecla BREAK. Para deshabilitar o volver a habilitar las interrupciones, haga POKE con los valores de acuerdo con la siguiente tabla (establecer un bit en 1, es decir, verdadero, habilita esa interrupción; también se muestran valores decimales para cada bit):

BitDecimalInterrupciónVector
01Temporizador #1 (cuenta regresiva hasta 0)VTIMR1 (528; $210)
12Temporizador #2 (cuenta regresiva hasta 0)VTIMR2 (530; $212)
24Temporizador #4 (cuenta regresiva hasta 0)VTIMR4 (532; $214) sólo ROM "B" del Sistema Operativo)
38Transmisión de salida en serie finalizadaVSEROC (526; $20E)
416Se requieren datos para la transmisión de salida en serieVSEROR (524; $20C)
532Lista la transmisión de entrada en serieVSERIN (522; $20A)
664Se presionó otra teclaVKEYBD (520; $208)
7128Se presionó la tecla BREAKvea más abajo

Aquí tiene el procedimiento para la interrupción de la tecla BREAK: borre el registro de interrupción. Establezca en 0 la ubicación BRKKEY (17; $11); borre el indicador de inicio/detención SSFLAG en la ubicación 767 ($2FF); borre el indicador de inhibición del cursor CRSINH en la ubicación 752 ($2F0); borre el indicador de modo de atracción en la ubicación 77 ($4D) y regrese de la interrupción después de restaurar el registro A del microprocesador 6502. (Ahora hay (en las ROM "B" del Sistema Operativo) un vector adecuado para las interrupciones de la tecla BREAK, en las ubicaciones 566 y 567 ($236 y $237) que se inicializa para apuntar a la ubicación 59220 ($E754). Si la interrupción se debió a una interrupción de línea de procedimiento del bus de E/S serie, entonces diríjase a la ubicación almacenada en el vector VPRCED de la ubicación 514 ($202). Si se debe a una interrupción de línea del bus de E/S serie, entonces diríjase a la ubicación almacenada en el vector VINTER de la ubicación 516 ($204). Si se debe a una instrucción BRK del microprocesador 6502, entonces diríjase a la ubicación almacenada en el vector VBREAK en la ubicación 518 ($206).

Los temporizadores se relacionan con los divisores de audio del mismo número (se procesa una interrupción cuando los divisores cuentan hacia atrás hasta llegar a 0). Estos bits en IRQEN no se configuran al encender el equipo y deben ser iniciados por el programa del usuario antes de habilitar la IRQ del procesador.

Hay otras 2 interrupciones, procesadas por PIA, generadas a través de las líneas Proceder (Proceed) e Interrumpir (Interrupt) del bus serie, establecidas por los bits en los registros PACTL y PBCTL (54018 y 54019; $D302, $D303):

BitDecimalUbicaciónInterrupción
01PACTLBit de habilitación de la interrupción del periférico A (PORTA).
7128PACTLBit de estado de la interrupción del periférico A.
01PBCTLBit de habilitación de la interrupción del periférico B (PORTB).
7128PBCTLBit de estado de la interrupción del periférico B.

Las últimas interrupciones del puerto se desactivan automáticamente al encender el equipo. Sólo las interrupciones de la tecla BREAK y de las teclas de datos son habilitadas durante el encendido. Su registro sombra es la ubicación 16 ($10).

 

 

IRQST

 

 

(L) Estado de la solicitud de interrupción. Las funciones de los bits son las mismas que las de IRQEN, excepto que registran la solicitud de interrupción cuando esta es igual a 0, en vez de cuando es igual a 1. IRQST se utiliza para determinar la causa de la solicitud de interrupción junto con IRQEN, PACTL y PBCTL, tal como se indicó anteriormente.

Normalmente todas las interrupciones IRQ se envían a través del vector de la ubicación 65534 ($FFFE) a la rutina de servicio de IRQ en la ubicación 59123 ($E6F3), la que determina la causa de la interrupción. El vector de RAM de IRQ global VIMIRQ en la ubicación 534 ($216) normalmente apunta al procesador de IRQ en la ubicación 59126 ($E6F6). Luego, el procesador examina la ubicación 53774 ($D20E) y los registros PIA en las ubicaciones 54018 y 54019 para determinar la causa de la interrupción. Una vez determinados, los vectores de rutina pasan a través de uno de los vectores RAM de IRQ en las ubicaciones 514 a la 526 ($202 a la $20E). Para interrupciones no enmascarables (NMI), consulte las ubicaciones 54286 a la 54287 ($D40E; a la $D40F). Para obtener detalles completos, consulte el Manual del Usuario del Sistema Operativo.

53775

D20F

SKCTL

 

 

(E) Control del puerto serie. Esta ubicación es igual a 255 ($FF) si no se ha presionado ninguna tecla, igual a 251 ($FB) para la mayoría de las otras teclas presionadas, igual a 247 ($F7) para la tecla SHIFT presionada (*M). Consulte el modo (L) a continuación para obtener una explicación de las funciones de los bits. Haga POKE con 3 en esta ubicación para detener el ruido ocasional del cassette después de la E/S y para sacar a POKEY del modo de 2 tonos. (562).

 

 

SKSTAT

 

 

(L) Devuelve el estado del puerto serie. También devuelve valores gobernados por la señal en la pista digital de la cinta de cassette. Puede generar ciertos valores utilizando el comando SOUND en BASIC y haciendo PEEK a SKSTAT:

SOUND 0,5,10,15 devuelve aquí un valor de 255 (o, en ocasiones, 127).
SOUND 0,8,10,3 devuelve un valor de 239.

Esto es útil para agregar una pista de voz a las cintas de Atari. Utilice el canal izquierdo para la pista de voz y el derecho para los tonos que desee utilizar como marcas de referencia (/cuing/). Puede utilizar el altavoz de su televisor para generar los tonos colocando el micrófono derecho directamente delante del altavoz. El computador registra estos tonos en este registro cuando los encuentra durante una carga de cassette posterior. Para obtener otras sugerencias sobre cómo hacer esto, consulte la revista COMPUTE! de julio de 1981. Recuerde que puede apagar el cassette haciendo POKE en la ubicación 54018 ($D302) con el valor 60 ($3C), y encenderlo nuevamente con el valor 52 ($34).

Los bits en el registro SKCTL (E) normalmente son 0 y realizan las siguientes funciones cuando se establecen en 1. El estado cuando se utiliza como función de lectura (L) se enumera debajo de la función de escritura (E):
BitFunción
0(E) Habilita los circuitos antirrebote del teclado.
(L) No utilizado por SKSTAT.
1(E) Habilita el circuito de escaneo del teclado.
(L) Registro de desplazamiento (shift) de entrada en serie ocupado.
2(E) Escaneo rápido del potenciómetro: el contador de escaneo de potenciómetro completa su secuencia en lo que demora desplegar 2 líneas de TV en lugar de un cuadro completo (228 líneas de escaneo). Sin embargo, no es tan preciso como el escaneo de potenciómetro normal.
(L) La última tecla todavía está presionada.
3(E) La salida serie se transmite como una señal de 2 tonos en lugar de una lógica del tipo verdadero/falso. Modo POKEY de 2 tonos.
(L) Se presiona la tecla SHIFT.
4,5,6(E) Control de modo del puerto serie utilizado para configurar las líneas de reloj bidireccionales de modo que pueda recibir datos de un reloj externo o proporcionar datos del reloj a dispositivos externos (consulte la página II.27 del Manual del Hardware). Hay 2 pines en el puerto serie para uso de datos del reloj: Clock IN (Entrada de reloj) y Clock OUT (Salida de reloj). Consulte la página 133 del Manual del Usuario del Sistema Operativo.
4(L) Los datos se pueden leer directamente desde el puerto de entrada serie, ignorando el registro de desplazamiento (shift).
5(L) Desbordamiento del teclado. Establezca en 1 los bits 7 al 5 (latches) usando SKREST83 en la ubicación 53770 ($D20A).
6(L) Desbordamiento de entrada de datos en serie. Restablezca los latches tal como se indica arriba.
7(E) Detención forzada (salida serie igual a 0).
(L) Error en la trama de entrada de datos en serie causado por bits faltantes o adicionales. Restablezca los latches tal como se indica arriba.

El bit 2 se establece primero en 0 para restablecer en 0 los registros POT (descargando los condensadores utilizados para cambiar esos registros). Luego, el bit 2 se establece en 1 para habilitar el escaneo rápido. El escaneo rápido no es tan preciso como la rutina de escaneo normal. El bit 2 debe restablecerse en 0 para habilitar el modo de escaneo normal; de lo contrario, los condensadores nunca se descargarán.


83 En el libro original, dice SKRES en vez de SKREST. (N. del T.)

Las ubicaciones 53776 a la 54015 ($D210 a la $D2FF) son duplicados de las ubicaciones 53760 a la 53775 y no tienen ningún uso particular en la actualidad.


PIA: EL CHIP 6520


54016-54271

D300-D3FF

 

 

 

El circuito integrado del PIA (Peripheral Interface Adapter - Adaptador de Interfaz Periférica) es un microprocesador especial que se utiliza para controlar los puertos Atari, es decir, los conectores de los controles del #1 al #4. Los puertos se pueden utilizar tanto para entrada como para salida, simultánea o alternadamente. Los puertos, apenas explotados en el momento de escribir este artículo, representan un recurso importante para el control y la expansión externa (e interna). PIA también procesa 2 de las interrupciones IRQ: VINTER y VPRCED, en las ubicaciones 514 a 517 ($202 a la $205). El Sistema Operativo no utiliza estas interrupciones, pero también pueden ser usadas para proporcionar un mayor control sobre los dispositivos externos.

54016

D300

PORTA

 

 

(E/L) Lee o escribe datos de los conectores del control #1 y #2 sólo si el bit 2 de PACTL (ubicación 54018) es igual a 1. Escribe en el control de dirección si el bit 2 de PACTL es igual a 0. Si se hace POKE en el registro del controlador (ubicación 54018, a continuación) con 48 ($30), estos 2 registros de puerto también controlarán la dirección del flujo de datos al puerto. Entonces, si los bits en el registro son igual a 0, se está en modo de entrada (L); si son igual a 1, se está en modo de salida (E). Si hace POKE con un 0 en esta ubicación, todos los bits serán de entrada, y con un 255 ($FF), todos los bits serán de salida. Los bits 0 al 3 direccionan los pines del 1 al 4 en el conector #1, y los bit 4 a 7 direccionan los pines del 1 al 4 en el conector #2. Haga POKE 54018,52 para convertir esta ubicación nuevamente en un registro de datos. Los registros sombra son: STICK0 (632; $278, conector #1), STICK1 (633; $279, conector #2) y PTRIG0-3 (636-639; $27C-$27F).

Bits utilizados como registro de datos
76543210
--Conector 0----Conector 1--
--Bastón 1----Bastón 0--
Adelante = bits 0,4 = 1
Atrás = bits 1,5 = 1
Izquierda = bits 2,6 = 1
Derecha = bits 3,7 = 1
Neutro = Los 4 bits del conector = 1

PORTA también se utiliza para comprobar si se han presionado los botones del paddle 0-3 (PTRIG), utilizando los siguientes bits:

Bit76543210
PTRIG32--10--

Donde un 0 en el bit apropiado equivale a botón presionado, y 1 equivale a botón no presionado.

Los registros PORT también se utilizan en la operación del controlador de teclado (utilizado con un teclado numérico) donde:

Bit76543210
Fila432Superior432Superior
Conector......2............1......

Las columnas para la operación del teclado se leen a través de los registros POT (PADDL) y TRIG. Para obtener más información sobre conectores y puertos, consulte la revista Micro de mayo de 1982 y el Manual del Hardware.

54017

D301

PORTB

 

 

(E/L) Puerto B. Lee o escribe datos hacia y/o desde los conectores del control #3 y #4. Igual que PORTA, en la ubicación anterior, pero para los conectores respectivos. Los registros sombra son: STICK2 (634; $27A, conector del control #3), STICK3 (635, $27B, conector del control #4) y PTRIG4-7 (640-643; $280-$283).

54018

D302

PACTL

 

 

(E/L) Controlador del puerto A (vea la ubicación 54016 más arriba). Haga POKE en esta ubicación con 60 ($3C) para apagar el motor del cassette, y con 52 para encenderlo. Puede poner un cassette de música en su grabadora de programas, presionar PLAY y luego hacer POKE 54018,52. Su música se reproducirá a través del altavoz del televisor o del amplificador externo mientras trabaja en su computador Atari. Puede utilizar esta técnica para agregar pistas de voz a sus programas. Para apagar la música o la voz, haga POKE 54018,60.

El usuario puede utilizar PACTL para otras aplicaciones externas. El uso de bits es el siguiente:

BitFunción
7 (sólo lectura)Bit de estado de la interrupción (IRQ) del dispositivo periférico A. Establecido por el periférico (puerto) A. Se reinicia en 0 al leer el valor de PORTA (53774; $D20E).
6Establecer en 0.
5Establecer en 1.
4Establecer en 1.
3 (escritura)Línea de control del motor del periférico (enciende o apaga el cassette; 0 es igual a encendido).
2 (escritura)Controla el direccionamiento de PORTA. 1 equivale al registro PORTA; 0 equivale al registro de control de dirección.
1Establecer en 0.
0 (escritura)Habilitación de interrupción (IRQ) del periférico A. 1 es igual a habilitar. Establecido por el Sistema Operativo, pero disponible para el usuario; se establece en 0 al encender el equipo.

54019

D303

PBCTL

 

 

(E/L) Controlador del puerto B. Su valor inicial, establecido por el código de IRQ del Sistema Operativo, es igual a 60 ($3C). PBCTL es lo mismo que PACTL, mencionado anteriormente, con la siguiente excepción (en realidad, puede realizar la misma función que en PACTL, pero no estoy seguro de la distinción entre las descripciones):

BitFunción
3Identificación de comando periférico (comando de bus serie), inicializado en 60 ($3C).

Los puertos pueden ser utilizados para aplicaciones de control externo por el lector con mentalidad técnica que esté dispuesto a realizar algunas soldaduras para desarrollar cables y conectores. Un buen ejemplo se puede encontrar en la revista COMPUTE! de febrero de 1981, donde el autor da instrucciones para utilizar los conectores 3 y 4 como un puerto de impresora. Los cables de impresora Macrotronic utilizan precisamente este método, omitiendo por completo la interfaz Atari 850 (una forma de reducir los costos de hardware). ¡En teoría, todo el Atari se puede controlar a través de los puertos!


Las ubicaciones 54020 a la 54271 ($D304 a la $D3FF) son repeticiones de las ubicaciones 54016 a la 54019 ($D300 a la $D303).

EL CHIP ANTIC


54272-54783

D400-D5FF

 

 

 

ANTIC es un microprocesador especial e independiente que se utiliza en su Atari para controlar el chip C/GTIA, la visualización de la pantalla y otras funciones relacionadas con la pantalla, incluido el procesamiento de las interrupciones NMI. Utiliza su propio conjunto de instrucciones, llamado Lista de Despliegue , que le dice a ANTIC dónde encontrar en la RAM los datos de la pantalla y cómo mostrarlos. ANTIC también utiliza un contador interno de 4 bits llamado Contador Delta (DCTR) para controlar la dimensión vertical de cada bloque.

54272

D400

DMACTL84

 

 

(E) Control de DMA (Direct Memory Access - Acceso Directo a Memoria). También se utiliza para definir la resolución de 1 ó 2 líneas para los players, y para activar players y missiles. Los valores se introducen en el registro sombra 559 ($22F), y también se describen allí. Haga POKE en el registro sombra con los siguientes valores para:

Desactivar el campo de juego0
Usar el campo de juego angosto1
Usar el campo de juego normal2
Usar cel ampo de juego ancho3
Habilitar DMA del missile4
Habilitar DMA del player8
Habilitar DMA del player y del missile12
Resolución del player de una sola línea16
Habilitar Instrucciones de obtención (fetch) de DMA32

La resolución de doble línea es el estado predeterminado. Utilice este registro en conjunto con GRACTL en la ubicación 53277 ($D01D). Ambos deben configurarse correctamente o no se mostrará ninguna imagen. El bit 5 permite que DMA obtenga las instrucciones de la Lista de Despliegue. Si no se configura el bit 5 (el bit 5 es igual a 0), ANTIC no funcionará. DMACTL se inicializa en 34 ($22).

Un player con resolución de una sola línea se ve así:

00011000                ##
00111100               ####
01111110              ######
11111111             ########
11111111             ########
01111110              ######
00111100               ####
00011000                ##

de manera que cada byte se muestre en una línea de TV. El mismo player en resolución de doble línea se ve así:

00011000                ##
00011000                ##
00111100               ####
00111100               ####
01111110              ######
01111110              ######
11111111             ########
11111111             ########
11111111             ########
11111111             ########
01111110              ######
01111110              ######
00111100               ####
00111100               ####
00011000                ##
00011000                ##

donde cada byte se muestra en 2 líneas de TV.


84 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

54273

D401

CHACTL

 

 

(E) Control del modo de carácter. Para conocer los valores con los que se puede hacer POKE aquí, consulte el registro sombra en la ubicación 755. Solo se leen los 3 bits menos significativos (del 0 al 7 decimal), tal como se muestra a continuación:

Decimal        0     1     2     3     4     5     6     7
Cursor
Transparente   X           X           X           X
Opaco                X           X           X           X
Presente                   X     X                 X     X
Ausente        X     X                 X     X
----------------------------------------------------------
Caracteres
Normales       X     X     X     X
En video inverso                       X     X     X     X

54274,54275

D402,D403

DLISTL/H

 

 

Puntero de la lista de despliegue. Le dice al Sistema Operativo la dirección de las instrucciones de la lista de despliegue, qué modo(s) de pantalla desplegar y dónde encontrar los datos de la pantalla. Vea SDLSTL85 (560 y 561; $230 y $231).


85 En el libro original, dice SDLIST en vez de SDLSTL. (N. del T.)

54276

D404

HSCROL

 

 

(E) Habilitación de desplazamiento (scroll) horizontal. Haga POKE en HSCROL con la cantidad de ciclos de reloj a desplazar, de 0 a 16. Los desplazamientos finos horizontales solo se pueden utilizar si el bit 4 de la instrucción de la Lista de Despliegue está establecido en 1. La dificultad del desplazamiento horizontal radica en organizar los datos de la pantalla que se van a desplazar de manera tal de evitar el "envolvimiento" (es decir, el bit o byte desplazado fuera de la pantalla se convierte en el bit o byte desplazado en la pantalla en la línea adyacente). Los datos normales organizados para su visualización en el televisor se ven así:

+----------+
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
+----------+

donde estos datos corresponden a un área de memoria unidimensional "plegada" en los lugares adecuados para crear la imagen de una pantalla bidimensional. Esto se realiza mediante la instrucción de modo de mapa o carácter de la DL. Sin otras instrucciones, lee la memoria continuamente desde la primera ubicación especificada, y cada línea toma la cantidad correcta de bytes para el modo gráfico especificado. Para desplazarlo correctamente de manera horizontal, debe colocarlo en relación con la pantalla del televisor de la siguiente manera:

     +----------+
.....|..........|.....
.....|..........|.....
.....|..........|.....
.....|..........|.....
.....|..........|.....
.....|..........|.....
     +----------+

Ahora tiene que convertir cada instrucción de visualización para cada línea en una instrucción LMS (Load Memory Scan - Carga de Escaneo de Memoria). Para dirigir cada LMS a la RAM de pantalla adecuada para esa línea, tiene que incrementar cada ubicación de memoria con la longitud total de la línea. Por ejemplo, si desea desplazarse por una pantalla horizontal de 256 bytes, cada instrucción LMS tiene que apuntar a una ubicación en la memoria 256 bytes por encima de la última. Por supuesto, tiene que implementar rutinas de captura de errores para que su pantalla no se extienda más allá de los límites deseados.

Se puede realizar un desplazamiento grueso, de un byte a la vez, sin tener que configurar el registro HSCROL mediante el método descrito anteriormente. Para un desplazamiento fluido tiene que utilizar este registro. Vea el libro De Re Atari.

54277

D405

VSCROL

 

 

(E) Habilitación del desplazamiento vertical. Haga POKE en VSCROL con la cantidad de líneas de escaneo a desplazar, de 0 a 16, dependiendo de la cantidad de líneas de escaneo que se pueden desplazar en el modo gráfico de la pantalla. Los desplazamientos finos verticales solo se pueden utilizar si se ha establecido en 1 el bit 5 de la instrucción de la Lista de Despliegue.

El desplazamiento grueso se puede realizar sin utilizar este registro, simplemente moviendo la parte superior de la dirección de la pantalla (según lo definido por la instrucción LMS de la DL) hacia arriba o hacia abajo una línea de modo (más o menos 40 ó 20 bytes, dependiendo del modo gráfico). La dirección en la parte superior de la pantalla se puede encontrar mediante el siguiente programa:

10 DLIST=PEEK(560)+PEEK(561)*256
20 PANTBAJO=DLIST+4:PANTALTO=DLIST+5:REM BYTE MENOS Y MAS SIGNIFICATIVO DE LA DIRECCION DE LA PANTALLA
25 PRINT "DIRECCION DE LA PANTALLA = ";PEEK(PANTBAJO)+PEEK(PANTALTO)*256

Luego, puede agregarle una rutina para desplazarse verticalmente por la memoria por medio del uso de un joystick, como por ejemplo86:

30 BYTEBAJO=PEEK(PANTBAJO):BYTEALTO=PEEK(PANTALTO)
40 IF STICK(0)=14 THEN BYTEBAJO=BYTEBAJO+40:GOTO 100
50 IF STICK(0)=13 THEN BYTEBAJO=BYTEBAJO-40
60 IF BYTEBAJO<0 THEN BYTEBAJO=BYTEBAJO+256:BYTEALTO=BYTEALTO-1
70 IF BYTEALTO<0 THEN BYTEALTO=0
80 GOTO 200
100 IF BYTEBAJO>255 THEN BYTEBAJO=BYTEBAJO-256:BYTEALTO=BYTEALTO+1
200 POKE PANTBAJO,BYTEBAJO:POKE PANTALTO,BYTEALTO
210 GOTO 40

El desplazamiento grueso es relativamente fácil de implementar en el computador Atari: básicamente se altera la RAM de la pantalla para mostrar el nuevo material. El desplazamiento fino es más difícil: cada registro de desplazamiento debe tener el número de unidades que se van a desplazar (relojes de color o líneas de escaneo) y las instrucciones de la Lista de Despliegue correspondientes deben tener configurados los bits adecuados. Esto significa que puede desplazarse de forma selectiva por cualquier línea de modo que desee, configurando solo aquellos fragmentos de las líneas que desea desplazar. Las demás líneas se mostrarán normalmente. Puede configurar una instrucción del DL para habilitar el desplazamiento horizontal y vertical. Para obtener una descripción de los problemas en el desplazamiento fino, consulte el Manual del Hardware.

El desplazamiento fino le permite desplazarse solo por una cierta cantidad de datos antes de que sea necesario reiniciar el registro (16 bits de reloj o líneas de escaneo como máximo). Para que la actividad de desplazamiento sea continua, el registro involucrado debe restablecerse en 0 cuando se alcanza el valor deseado: debe implementarse un desplazamiento grueso (generalmente durante un intervalo DLI o VBLANK) y comenzar un nuevo desplazamiento fino. Esto no es fácil de hacer en BASIC debido a que es demasiado lento y el cambio de los registros durante el proceso de visualización de ANTIC generalmente causa un movimiento brusco o entrecortado. Se sugieren rutinas en lenguaje ensamblador para una visualización fluida. Para obtener más información, consulte el libro De Re Atari, la revista Micro de noviembre de 1981, la revista BYTE de enero de 1982 y el Tricky Tutorial #2 de Santa Cruz.


86 La línea 30 original inicializa en 0 las variables BYTEBAJO y BYTEALTO, lo que no es correcto. Deben apuntar a la dirección de inicio de la memoria de pantalla. (N. del T.)

54278

D406

....

 

 

Sin uso.

54279

D407

PMBASE

 

 

(E) Byte más significativo de la dirección base de los player/missile utilizada para encontrar los gráficos de sus players y missiles (la dirección es igual a PMBASE * 256). Los gráficos P/M son difíciles de utilizar debido a que no hay comandos directos en el Atari BASIC de 8K para crearlos o moverlos (sin embargo, hay comandos para gráficos P/M en BASIC A+ y en las utilidades de valFORTH).

Sus gráficos P/M siempre deben comenzar en un límite de 1K (PEEK(RAMTOP)-4 para players con resolución de línea doble) o un límite de 2K (PEEK(RAMTOP)-5 para resolución de línea única), por lo que el byte menos significativo siempre es igual a 0 (los números de página siempre terminan en $XX00). Por ejemplo87:

10 POKE 106,PEEK(106)-8:GRAPHICS 8:SETCOLOR 2,3,4
20 POKE 559,62:POKE 53248,100:POKE 704,160:POKE 53256,2
30 MEM=PEEK(106)-8
40 POKE 54279,MEM:POKE 53277,3:INICIO=MEM*256+1024
50 FOR CICLO=100 TO 118:READ BYTE:POKE INICIO+CICLO,BYTE:NEXT CICLO
60 DATA 16,16,56,40,40,56,40,40,40
70 DATA 124,84,124,84,254,146,254,170,170,68
100 END

Modificando los registros utilizados anteriormente puede cambiar el color, el ancho, la resolución y la posición horizontal del player en el ejemplo.

Cada player tiene un byte (8 bits) de ancho. Los caracteres P/M con resolución de una sola línea (POKE 559,62) pueden tener una altura de hasta 256 bytes. Los caracteres P/M con resolución de línea doble (POKE 559,46) pueden tener una altura de hasta 128 bytes. En cualquier caso, pueden mapearse a la altura de la pantalla. Los missiles tienen la misma altura, pero sólo 2 bits de ancho cada uno. Se pueden combinar 4 missiles para formar un quinto player, estableciendo en 1 el bit 4 de la ubicación 623 ($26F). No es necesario que rellene toda la altura de un carácter P/M, pero con los bytes no utilizados debe hacer POKE con ceros para eliminar cualquier basura de la pantalla. Puedes hacer lo siguiente:

FOR N = PMBASE + 1024 TO PMBASE + 2048: POKE N,0: NEXT N

donde PMBASE corresponde a la dirección inicial del área de memoria de reserva. En resolución de doble línea, cambie el valor del ciclo a "N = PMBASE + 512 TO PMBASE + 1024". A continuación, se muestra una breve rutina en lenguaje de máquina para hacer lo mismo. Debe poner la dirección de inicio del área a cargar con ceros y la cantidad de bytes a borrar en los 2 primeros parámetros de la llamada a USR. En este ejemplo, he elegido arbitrariamente 38012 y 2048 para estos valores.

10 INICIO=38012:BYTE=2048:DIM PGM$(42)
20 FOR CICLO=1 TO 42:READ ML:PGM$(CICLO,CICLO)=CHR$(ML):NEXT CICLO
30 DATA 104,104,133,204,104,133,203,104,133,206,104
40 DATA 133,205,166,206,160,0,169,0,145,203,136
50 DATA 208,251,230,204,202,48,6,208,244,164
60 DATA 205,208,240,198,204,160,0,145,203,96
70 A=USR(ADR(PGM$),INICIO,BYTE)

Puede utilizar esta rutina para borrar la memoria de cualquier parte de su computador Atari. También puede usarlo para cargar cualquier valor en la memoria cambiando el segundo 0 (después del 169), en la línea 40, al valor deseado.

Ubicar las tablas gráficas en el extremo superior de la memoria puede causar problemas de direccionamiento para los gráficos del campo de juego, o puede dejar parte de la pantalla inutilizable y provocar que PLOT funcione mal. Si ubica sus tablas justo antes de que aparezcan en la pantalla, es posible que se borren si cambia de modo gráfico. Puede consultar su declaración de gráficos que usan el máximo de RAM y planificar en consecuencia. Para calcular una dirección de inicio segura debajo de la Lista de Despliegue, intente lo siguiente:

100 DLIST = PEEK(560) + PEEK(561) * 256: PMBASE = INT (DLIST/TAMANO -1) * TAMANO

donde TAMANO es igual a 2048 para resolución de línea única, ó 1024 para línea doble.

Una vez que tenga la dirección inicial, determine la dirección final de su tabla sumando la cantidad correcta de bytes para el tamaño (igual que la variable TAMANO anterior) y haga POKE con este número (byte menos significativo / byte más significativo) en APPMHI en las ubicaciones 14 y 15 ($E y $F). Esto establece el límite inferior para el uso de la memoria gráfica del campo de juego. Si cambia el modo gráfico en el programa ahora, sus tablas de players deberían quedar intactas. Por ejemplo, si el DL está en la ubicación 39968, el PMBASE será igual a 36864 en la ecuación anterior. Sume 2.048 (resolución de una sola línea) para obtener 38.912. Esto es igual a $9800. En decimal, el byte menos significativo es 0 y el byte más significativo es 152. Introduzca estos valores en APPMHI. Esto establece el límite más bajo al que pueden descender la pantalla y los datos de la DL.

La parte no utilizada de la RAM reservada para uso de los P/M, o cualquier RAM reservada para players, pero no utilizada, puede usarse para otros fines en su programa, como rutinas de lenguaje de máquina. Consulte el apéndice para ver un mapa del uso de la memoria de los P/M. El registro almacena la dirección de la siguiente manera:

Bit765432
1
0
Resolución de 1 línea
...BMS...
...sin uso...
Resolución de 2 líneas
...BMS...
...sin uso...

BMS = Byte más significativo

Existen algunas restricciones a la hora de ubicar los datos de sus P/M encima de la Lista de Despliegue. Si no se ubican lo suficientemente por encima de los datos de la pantalla, es posible que terminen mostrándose los datos normales y de la pantalla a la vez, lo que genera basura en la pantalla. Una Lista de Despliegue no puede cruzar un límite de 1K sin una instrucción de salto, y la RAM de visualización de pantalla no puede cruzar un límite de 4K sin una instrucción LMS que apunte a los bytes adecuados. Debido a los problemas que surgen al mover las pantallas de los modo gráficos 7 y 8 y datos de tamaño menor a 4K, en estos modos nunca debe reservar menos de 16 páginas por encima de RAMTOP. Si va a reservar más, añada las páginas en bloques de 4K (16 páginas).

Para obtener una discusión de los problemas de posicionamiento de gráficos P/M en la memoria y el uso de gráficos P/M para animación, consulte la revista COMPUTE! de septiembre de 1981.

Para un análisis del uso de la manipulación de cadenas con gráficos P/M, consulte el libro De Re Atari, la revista COMPUTE! de junio de 1982 y la revista Creative Computing de abril de 1982. Para obtener una discusión general sobre los gráficos P/M, consulte el libro Your Atari 400/800. La mayoría de las revistas populares también han publicado artículos sobre cómo simplificar los gráficos P/M.


87 En el código original, el ciclo FOR/NEXT de la línea 50 llega hasta 119, lo que produce un error 6 "Falta de DATA" (N. del T.)

54280

D408

....

 

 

Sin uso.

54281

D409

CHBASE

 

 

(E) Dirección base de los caracteres. Ubicación del inicio del conjunto de caracteres, ya sea el conjunto estándar de Atari o un conjunto diseñado por el usuario. El valor predeterminado es 224 ($E0), que apunta al inicio del conjunto de caracteres de la ROM de su computador Atari. Iridis, una revista de discos y documentación de corta duración, produjo un buen utilitario llamada FontEdit para ayudar en el diseño de conjuntos de caracteres alterados. También es muy útil para este propósito el programa The Next Step de Online Systems, así como el programa "SuperFont" de la revista COMPUTE! de enero de 1982. El registro sombra utilizado es 756 ($2F4).

Normalmente apunta a la ubicación 57344 o 57856 ($E000 o $E200), dependiendo de su elección de caracteres utilizados y modo de texto. El modo gráfico 0 utiliza todo el conjunto de 128 caracteres. Los modos gráficos 1 y 2 utilizan sólo la mitad del conjunto (64 caracteres). Para apuntar a su propio conjunto de caracteres en la memoria RAM, introduzca un número diferente en el registro sombra 756 ($2F4). Este debe ser un número par que apunte a una página en la memoria que sea divisible por 2. En los modos gráficos 1 y 2 este número es igual a 224 (que apunta a $E000), lo que le proporciona mayúsculas, puntuación y números. Al hacer POKE con 226 en el registro sombra o directamente en esta ubicación (en lenguaje de máquina), obtendrá caracteres en minúscula y de control.

Consulte la información sobre el conjunto de caracteres residentes en la ROM en la ubicación 57344 ($E000).

54282

D40A

WSYNC

 

 

(E) Espere la sincronización horizontal. Permite que el Sistema Operativo sincronice el despliegue vertical de la TV haciendo que el microprocesador 6502 se detenga y reinicie 7 ciclos de máquina antes del comienzo de la siguiente línea de TV. Se utiliza para sincronizar los VBIs o DLIs con la visualización en pantalla.

Para ver el efecto del registro WSYNC, escriba el segundo ejemplo de una interrupción de Lista de Despliegue en la ubicación 512. Ejecútelo y observe lo que provoca una separación limpia de los colores en el límite del cambio. Ahora cambie la línea 50 a:

50 DATA 72,169,222,234,234,234,141,24,208,104,64

Esto elimina el comando WSYNC. Ejecútelo y vea la diferencia en la línea límite.

El controlador del teclado configura WSYNC repetidamente mientras genera el clic del teclado en el altavoz de la consola, en la ubicación 53279 ($D01F). Cuando se generan interrupciones durante el período WSYNC, se retrasa una línea de escaneo. Para evitar esto, examine el registro VCOUNT a continuación y retrase el procesamiento de la interrupción en una línea cuando no se haya producido ningún retraso de WSYNC.

54283

D40B

VCOUNT

 

 

(L) Contador de línea vertical. Se utiliza para realizar un seguimiento de qué línea se está generando actualmente en la pantalla. Se utiliza durante las interrupciones de la Lista de Despliegue para cambiar los colores o los modos gráficos. Al hacer PEEK aquí se devuelve el recuento de líneas dividido por 2, con un rango de 0 a 130 ($82; 0 a 155 en el sistema PAL; consulte la ubicación 53268; $D014) para las 262 líneas por cuadro de TV.

54284

D40C

PENH

 

 

(L) Posición horizontal del lápiz de luz (564). Devuelve el conteo horizontal de relojes de color cuando se presiona el botón del lápiz.

54285

D40D

PENV

 

 

(L) Posición vertical del lápiz de luz (565). Devuelve el valor de VCOUNT (arriba) cuando se presiona el botón del lápiz. Para una descripción del funcionamiento del lápiz de luz, consulte la página II-32 del Manual del Hardware.

54286

D40E

NMIEN88

 

 

(E) Habilitación de la NMI (Non-Maskable Interrupt - Interrupción No Enmascarable). Haga POKE con 192 en esta ubicación para habilitar las interrupciones de la Lista de Despliegue. Cuando el bit 7 se establece en 1, significa interrupción de la instrucción de la DL; cualquier instrucción de Lista de Despliegue donde el bit 7 sea igual a 1 hace que esta interrupción se habilite al comienzo de la última línea de video mostrada por dicha instrucción. Cuando el bit 6 es igual a 1, permite la Interrupción del Blanqueo Vertical. Y cuando el bit 5 es igual a 1, permite la interrupción del botón RESET. El Sistema Operativo nunca deshabilita la interrupción RESET. Nunca debe presionar RESET durante el encendido del equipo, ya que se activará.

NMIEN es establecido en 64 ($40) por el código IRQ del Sistema Operativo durante el encendido del equipo, habilitando la VBI, pero deshabilitando la DLI. Para determinar su causa, todas las interrupciones NMI se dirigen a la ubicación almacenada en el vector 65530 ($FFFA), que corresponde a la rutina de servicio NMI en la ubicación 59316 ($E7B4).

Bit76543210
Interrupción:DLIVBIRESET....sin uso....


88 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

54287

D40F

NMIRES

 

 

(E) Restablece NMIST (la ubicación que viene a continuación) en 0. Borra el registro de solicitud de interrupción. Restablece todo el estado de la NMI.

 

 

NMIST

 

 

(L) Estado de la NMI; contiene la causa de la interrupción NMI en los bits 5, 6 y 7; correspondientes a los mismos bits en NMIEN de la ubicación anterior. Si hay una DLI pendiente, se realiza un salto a la ubicación almacenada en el vector de RAM global VDSLST (512; $200). El Sistema Operativo no utiliza la DLI, por lo que la ubicación 512 se inicializa para que apunte a una instrucción RTI y el usuario debe cambiarla antes de permitir una DLI.

Si la interrupción no corresponde a una DLI, entonces se realiza una prueba para ver si la interrupción fue causada al presionar la tecla RESET y, si es así, se realiza un salto a la ubicación 58484 ($E474). Si no es una interrupción RESET, entonces el sistema asume que la interrupción fue una interrupción VBLANK y se realiza un salto a la ubicación almacenada en el vector VVBLKI en la ubicación 546 ($222), que normalmente apunta al procesador de la etapa 1 del VBLANK. Desde allí, verifica la bandera CRITIC (66; $42) y, si no se trata de una sección crítica, salta a la ubicación almacenada en el vector VVBLKD en la ubicación 548 ($224), que normalmente apunta a la rutina de salida del VBLANK. Al encender el equipo, las interrupciones VBLANK se habilitan mientras que las interrupciones de la Lista de Despliegue se deshabilitan. Para obtener una descripción de los procedimientos del VBLANK, consulte el final del mapa de memoria. Para más información acerca de las interrupciones IRQ, consulte la ubicación 53744 ($D20E).


Las ubicaciones 54288 a la 54303 ($D410 a la $D41F) son repeticiones de las ubicaciones 54272 a la 54287 ($D400 a la $D40F).
Las ubicaciones 54784 a la 55295 ($D600 a la $D7FF) no se utilizan pero no están vacías ni pueden ser modificadas por el usuario. Vea la nota en la ubicación 53504 ($D100).

ROM DEL SISTEMA OPERATIVO


Las ubicaciones 55296 a la 65535 ($D800 a la $FFFF) corresponden a la ROM del Sistema Operativo. Estas ubicaciones están contenidas en el cartucho ROM de 10K, que se encuentra en la ranura frontal del Atari 800 o dentro del Atari 400. El Sistema Operativo es idéntico para ambos computadores.

Las ubicaciones indicadas aquí corresponden a la versión "A" de la ROM del Sistema Operativo. Hay cambios en la ROM de la nueva versión "B", que se explican en el apéndice. La mayoría de los cambios afectan a las rutinas del controlador de interrupciones y SIO. Al realizar estos cambios, Atari solucionó algunos errores, como el problema del tiempo de espera del dispositivo. Lamentablemente, este aspecto positivo tiene una sombra: no todo el software antiguo funcionará con las nuevas ROM. Megalegs, uno de mis juegos favoritos, no puede ejecutarse con la nueva ROM. Una lástima. Hay otros; estoy seguro que los encontrará. La solución es tener ambos conjuntos de ROMs para poder utilizar todo el software.

ROM DEL PAQUETE DE COMA FLOTANTE


Las ubicaciones 55296 a la 57343 ($D800 a la $DFFF) están reservadas para la ROM del paquete de matemáticas de coma flotante. Hay otras áreas utilizadas por el paquete FP: en la Página Cero (ubicaciones 212 a 254; $D4 a la $FE) y en la Página Cinco (ubicaciones 1406 a 1535; $57E a la $5FF), que se utilizan solo si se llaman a las rutinas FP. También hay funciones trigonométricas en el cartucho BASIC ubicadas entre las direcciones 48549 y la 49145 ($BDA5 a la $BFF9) que utilizan las rutinas de FP. Para obtener más información, consulte el libro De Re Atari.

Estos son los puntos de entrada a algunas de las subrutinas. A menos que se indique lo contrario, utilizan el registro #0 de FP (FR0 en las ubicaciones 212 a la 217, $D4 a la $DB):

55296

D800

AFP

 

 

Conversión de ASCII a coma flotante.

55526

D8E6

FASC

 

 

Conversión de valor en FP a ASCII.

55722

D9AA

IFP

 

 

Conversión de entero a FP.

55762

D9D2

FPI

 

 

Conversión de FP a entero.

55876

DA44

ZFR0

 

 

Limpia FR0 en las ubicaciones 212 a la 217 ($D4-$DB), estableciendo todos sus bytes en 0.

55878

DA46

ZF1

 

 

Limpia FR1 en las ubicaciones 224 a 229 ($E0 a la $E5), estableciendo todos sus bytes en 0. También llamado AF1 en el libro De Re Atari.

55904

DA60

FSUB

 

 

Rutina de resta de FP; el valor en FR0 menos el valor de FR1.

55910

DA66

FADD

 

 

Rutina de suma de FP; FR0 más FR1.

56027

DADB

FMUL

 

 

Rutina de multiplicación de FP; FR0 por FR1.

56104

DB28

FDIV

 

 

Rutina de división de FP; FR0 dividido por FR1.

56640

DB40

PLYEVL

 

 

Evaluación de polinomios en FP.

56713

DD89

FLD0R

 

 

Carga en FR0 el número en FP desde los registros X, Y del microprocesador 6502.

56717

DD8D

FLD0P

 

 

Carga en FR0 el número en FP desde la rutina del usuario, utilizando FLPTR en la ubicación 252 ($FC).

56728

DD98

FLD1R

 

 

Carga en FR1 el número en FP desde los registros X, Y del microprocesador 6502.

56732

DD9C

FLD1P

 

 

Carga en FR1 el número en FP desde el programa del usuario, utilizando FLPTR.

56743

DDA7

FST0R

 

 

Almacena el número FR0 en los registros X, Y del microprocesador 6502.

56747

DDAB

FST0P

 

 

Almacena el número FR0, utilizando FLPTR.

56758

DDB6

FMOVE

 

 

Mueve el número en FP desde FR0 a FR1.

56768

DDC0

EXP

 

 

Exponenciación en base e del número en FP.

56780

DDCC

EXP10

 

 

Exponenciación en base 10 del número en FP.

57037

DECD

LOG

 

 

Logaritmo natural del número en FP.

57041

DED1

LOG10

 

 

Logaritmo base 10 del número en FP.


Las ubicaciones 5734489 a la 58367 ($E000 a la $E3FF) contienen el conjunto de caracteres estándar de Atari: en $E000 comienzan los caracteres especiales, la puntuación y los números; en $E100 (57600) comienzan las letras mayúsculas; en $E200 (57856) comienzan los gráficos especiales y en $E300 (58112) comienzan las letras minúsculas.

Aquí se tienen 1024 bytes ($400), y cada carácter requiere 8 bytes, para un total de 128 caracteres (los caracteres inversos simplemente manipulan la información de aquí para invertir los bits realizando un OR con 128, el valor en la ubicación 694 ($2B6), cuando se activa la tecla del logotipo de Atari. Para volver a la visualización ATASCII normal, a los caracteres inversos se les realiza un EOR con 128). La primera mitad de la memoria es para números, puntuación y caracteres mayúsculas; la segunda mitad ($E200 a la $E3FF) es para caracteres en minúsculas y de control. Cuando se hace POKE a la ubicación 756 ($2F4) con 224 ($E0), se está haciendo POKE con el byte más significativo de esta ubicación ($E000). Cuando se hace POKE con 226 ($E2), está moviendo el puntero de la dirección a la segunda mitad del conjunto de caracteres. En GRAPHICS 0, tiene todo el conjunto de caracteres para utilizar. En GRAPHICS 1 y GRAPHICS 2, solo se puede utilizar la mitad del conjunto a la vez. No puede hacerle POKE con 225 porque el número del POKE debe ser divisible por 2.

Los caracteres almacenados aquí no están en orden ATASCII: tienen su propio orden interno de almacenamiento. El orden de los caracteres aparece en la página 55 del Manual de Referencia del BASIC. Aquí tiene un ejemplo de cómo se almacena la letra A en la ROM. Cada línea representa un byte. Los valores decimales son los que encuentra si mira las 8 ubicaciones donde se almacena la letra "A" (comenzando en la ubicación 57608; $E108):

Bit   76543210   Decimal
                           +--------+
      00000000       0     |        |
      00011000      24     |   ##   |
      00111100      60     |  ####  |
      01100110     102     | ##  ## |
      01100110     102     | ##  ## |
      01111110     126     | ###### |
      01100110     102     | ##  ## |
      00000000       0     |        |
                           +--------+
Cuando se crea un conjunto de caracteres propio (o se modifica el conjunto de caracteres Atari cuando se le mueve a la memoria RAM - consulte la ubicación 756; $2F4 para ver una rutina que hace justo esto), se debe hacer un "mapa de bits" para cada carácter, tal como en el ejemplo anterior. Podría ser fácilmente una nave espacial, una letra hebrea, un carácter del lenguaje APL, o un rostro. El juego Eastern Front 1941 (APX) de Chris Crawford muestra un excelente uso de un conjunto de caracteres modificado para crear un gran mapa de Rusia, además de los símbolos de los ejércitos.

A continuación, se muestra un ejemplo del uso del mapa de bits del conjunto de caracteres para proporcionar texto en GRAPHICS 8:

1 GRAPHICS 8
5 DLIST=PEEK(560)+PEEK(561)*256
6 BYTEBAJO=DLIST+4:BYTEALTO=DLIST+5
7 REAL=PEEK(BYTEBAJO)+PEEK(BYTEALTO)*256:PANTALLA=REAL:TV=PANTALLA
10 CHBASE=57344
20 DIM A$(128),BYTE(128),QUIERO(128)
27 PRINT "INGRESE UNA CADENA DE 40 CARACTERES:"
30 INPUT A$
35 TIEMPO=TIEMPO+1
40 FOR MIRAR=1 TO LEN(A$)
50 BYTE(MIRAR)=ASC(A$(MIRAR,MIRAR))
51 IF BYTE(MIRAR)>127 THEN BYTE(MIRAR)=BYTE(MIRAR)-128
52 IF BYTE(MIRAR)<32 THEN BYTE(MIRAR)=BYTE(MIRAR)+64:GOTO 55
53 IF BYTE(MIRAR)<97 THEN BYTE(MIRAR)=BYTE(MIRAR)-32
55 NEXT MIRAR
59 FOR EXTRA=0 TO 7
60 FOR MIRAR=1 TO LEN(A$)
70 QUIERO(MIRAR)=PEEK(CHBASE+EXTRA+BYTE(MIRAR)*8)
80 POKE TV+EXTRA,QUIERO(MIRAR):TV=TV+1
82 NEXT MIRAR
85 PANTALLA=PANTALLA+39:TV=PANTALLA
90 NEXT EXTRA
100 PANTALLA=REAL+TIEMPO*320
110 IF PANTALLA>REAL+6080 THEN TIEMPO=0:GOTO 100
120 GOTO 30

Este programa simplemente toma los bytes que representan las letras que ingresa en A$ y encuentra sus lugares en el conjunto de caracteres en la ROM. Luego procede a introducir los bytes en la RAM de la pantalla, utilizando un ciclo FOR-NEXT.

Para convertir códigos ATASCII a códigos internos, utilice esta tabla:

valor ATASCIIOperación para el código interno
0-31sumar 64
32-95restar 32
96-127queda igual
128-159sumar 64
160-223restar 32
224-255queda igual

Vea el programa "TextPlot" que muestra texto en diferentes tamaños en los modos GRAPHICS 3 al 8 en la revista COMPUTE! de noviembre de 1981. Para ver un programa para editar conjuntos de caracteres llamado "SuperFont", vea la revista COMPUTE! de enero de 1982.


89 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)


Las ubicaciones 58368 a la 5844790 ($E400 a la $E44F) son las tablas de vectores, almacenadas en formato byte menos significativo seguido del byte más significativo. Estas direcciones base son utilizadas por los controladores residentes. Los vectores de controlador utilizan el siguiente formato:
Vector ABRIR 
Vector CERRAR
Vector OBTENER BYTE
Vector PONER BYTE
Vector OBTENER ESTADO
Vector ESPECIAL
Salto a la rutina de inicialización del controlador (JMP byte menos significativo/byte más significativo)
Las tablas de dispositivos en la ubicación 794 ($31A) apuntan a los vectores particulares utilizados en cada tabla correspondiente. En cada caso, se utiliza el registro X del microprocesador 6502 para señalar el IOCB de origen.

90 Encuentre información adicional para estas ubicaciones en la Adenda. (N. del T.)

58368

E400

EDITRV

 

 

Tabla de puntos de entrada del Editor de pantalla (E:).

58383

E40F

....

 

 

Si hace PEEK en esta ubicación y obtiene 56, entonces tiene la versión "A" de la ROM del Sistema Operativo, la más antigua. Si el resultado es igual a 0, entonces tiene la versión más nueva, la "B", que se lanzó en enero de 1982. La versión "B" corrige algunos errores menores, incluidos los problemas de tiempo de espera del dispositivo, habilita el temporizador #4 de POKEY y proporciona un vector para las interrupciones de la tecla BREAK. Vea el Apéndice 4.

58384

E410

SCRENV

 

 

Controlador de la pantalla de televisión (S:).

58400

E420

KEYBDV

 

 

Controlador del teclado (K:).

58416

E430

PRINTV

 

 

Controlador de la impresora (P:).

58432

E440

CASETV

 

 

Controlador de la cassettera (C:).


Las ubicaciones 58448 a la 58533 ($E450 a la $E4A5) son más vectores: los de la ubicación 58495 ($E47F) corresponden a vectores de salto, y los de la ubicación 58496 a la 58533 ($E480 a la $E4A5) corresponden a los vectores de RAM iniciales.

58448

E450

DISKIV

 

 

Vector de inicialización del controlador de disco. Su valor inicial es igual a 60906 ($EDEA).

58451

E453

DISKINV91

 

 

Entrada del controlador de disco (interfaz); verifica el estado del disco. Su valor inicial es igual a 60912 ($EDF0).


91 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

58454

E456

CIOV92

 

 

Punto de entrada al utilitario CIO (Central Input Output - Entrada/Salida Central). El CIO maneja todas las operaciones de E/S o transferencias de datos. La información colocada en el IOCB le dice al CIO qué operaciones son necesarias. CIO pasa esta información a la rutina del controlador del dispositivo correcto y luego pasa el control al DCB (Device Control Block - Bloque de Control del Dispositivo). Este a su vez llama a SIO (abajo) para controlar los periféricos reales. CIO trata todas las E/S de la misma manera, independiente del dispositivo. La diferenciación entre operaciones la realizan los propios controladores del dispositivo.

Salte aquí para utilizar las rutinas del controlador IOCB almacenadas en la ROM. BASIC sólo admite E/S de un registro o de un byte a la vez (GET y PUT). El direccionar a CIOV directamente le permite al usuario ingresar o generar un búfer de caracteres a la vez, como cargar un programa en lenguaje de máquina directamente en la memoria desde un archivo de disco. Esto es considerablemente más rápido que usar funciones BASIC como GET. A continuación, se muestra una subrutina típica en lenguaje de máquina para hacer esto:

PLA, PLA, PLA, TAX, JMP $E456 
(104,104,104,170,76,86,228) 
($68,$68,$68,$AA,$4C,$56,$E4)

Esto lleva el número de IOCB al registro X del microprocesador 6502 y la dirección de retorno a la pila. CIOV espera encontrar el IOCB número 16 en el registro X del 6502 (es decir, IOCB #0 es 0, IOCB #1 es 16; $10, IOCB #2 es 32, $20, etc.). $E456 es el punto de entrada de inicialización de CIO (la ubicación que estamos detallando).

Para utilizar CIOV en un programa, primero debe abrir un canal para las acciones apropiadas, hacer POKE en el IOCB correcto (ubicaciones 848 a 959; $350 a la $3BF) con los valores correctos y establecer una ubicación en la cual cargar su archivo (dirección del IOCB más 4 y más 5). Un caso de uso puede ser el cargar una imagen de alta resolución desde un disco y almacenarla en la memoria de la pantalla (ubicaciones 88 y 89; $58 y $59). Puede introducir los valores decimales apropiados en la memoria y llamarlo con una llamada USR, o convertirlo en una cadena (INICIO$ = "hhh*LVd" donde el * y la d son caracteres en video inverso) y llamarlo mediante:

SALTO = USR(ADR(INICIO$))

Este método se utiliza para iniciar el modo concurrente en el RS-232 de la interfaz Atari 850, tal como lo indica su manual. Para ver otro ejemplo de la técnica de rutina en lenguaje de máquina, consulte las ubicaciones 88 y 89 ($58 y $59). Otro uso de este método lo podemos encontrar en el libro De Re Atari. Su valor inicial es igual a 58564 ($E4C4).


92 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

58457

E459

SIOV93

 

 

Punto de entrada de la utilidad de entrada/salida en serie (SIO). SIO controla el bus serie y los periféricos. Cuando un controlador de dispositivo coloca una solicitud en el bloque de control del dispositivo (DCB), SIO toma el control y utiliza los datos en el DCB para realizar la operación requerida. SIO se encarga de la transferencia de datos según lo definido por el DCB. El CIO (en la ubicación de arriba) es responsable del "empaquetado” de los datos y de transferir el control al SIO cuando es necesario. Vea las ubicaciones del DCB, 768 a 779 ($300-$30B).

SIO primero envía una trama de comando al dispositivo, que consta de 5 bytes: el ID del dispositivo, el byte de comando, 2 bytes auxiliares para información específica del dispositivo y luego una suma de comprobación (que corresponde a la suma de los primeros 4 bytes). Si el dispositivo reconoce esta trama, le sigue, si es necesario, la trama de datos de un número fijo de bytes, dependiendo del tamaño del registro del dispositivo, más un byte de suma de comprobación. Su valor inicial es igual a 59737 ($E959).


93 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

58460

E45C

SETVBV

 

 

Establece los temporizadores del sistema durante la rutina VBLANK. Utiliza el registro X del microprocesador 6502 para el byte más significativo del vector/veces, el registro Y para el byte menos significativo, y el registro A para el número del vector a hackear (cambiar). SETVBV asegura que ambos bytes del vector direccionado se actualizarán mientras VBLANK esté habilitado. Puedes usar JSR aquí al crear sus propias rutinas de temporizador. Para ver una aplicación de esto, vea la revista COMPUTE! de noviembre de 1981. Su valor inicial es igual a 59666 ($E912) en la ROM antigua, y 59629 ($E8ED) en la ROM nueva.

58463

E45F

SYSVBV

 

 

Punto de entrada de los cálculos de la primera etapa del VBLANK. Realiza el procesamiento de una interrupción VBLANK. Contiene instrucciones JMP para el vector en las siguientes 2 direcciones: 58464 y 58465 ($E460 y $E461). Esta es la dirección que normalmente se encuentra en la ubicación VVBLKI (546, 547; $222, $223). Su valor inicial es igual a 59345 ($E7D1), que es el punto de entrada de la rutina VBLANK. Su valor inicial es igual a 59345 ($E7D1) en la ROM antigua, y 59310 ($E7AE) en la ROM nueva.

58466

E462

XITVBV

 

 

Salida de la rutina VBLANK, punto de entrada. Contiene un JMP a la dirección almacenada en las siguientes 2 ubicaciones: 58467 y 58468 ($E463, $E464). Esta es la dirección que normalmente se encuentra en VVBLKD (ubicaciones 548 y 549; $224 y $225). Su valor inicial es igual a 59710 ($E93E), que es la rutina de salida del VBLANK. Se utiliza para restaurar el computador a su estado anterior a la interrupción y reanudar el procesamiento normal. Su valor inicial es igual a 59710 ($E93E) en la ROM antigua, y 59653 ($E905) en la ROM nueva.

58469

E465

SIOINV

 

 

Inicialización de la utilidad SIO, solo para uso del Sistema Operativo.

58472

E468

SENDEV

 

 

Rutina de habilitación de envío, solo para uso del Sistema Operativo.

58475

E46B

INTINV

 

 

Inicialización del controlador de interrupciones, solo para uso del Sistema Operativo.

58478

E46E

CIOINV

 

 

Inicialización de la utilidad CIO, solo para uso del Sistema Operativo.

58481

E471

BLKBDV

 

 

Entrada al modo pizarrón. El modo pizarrón es el modo "ATARI MEMO PAD". Se puede acceder desde el BASIC escribiendo "BYE", "B." o encendiendo su computador sin periféricos ni cartuchos94. Nada de lo que usted escribe en el modo pizarrón es procesado por el computador. Puede ingresar a este modo para proteger sus programas temporalmente de dedos curiosos y entrometidos.

Todos los comandos de edición de pantalla continúan funcionando en el modo pizarrón. Puede ingresar al modo pizarrón desde cualquier modo gráfico con una ventana de texto; la pantalla permanece intacta en la pantalla mientras la ventana de texto esté en modo pizarrón. Al presionar RESET, por supuesto, toda la pantalla vuelve a GRAPHICS 0. También puede ingresar al modo pizarrón desde un programa, pero no puede salir de él en BASIC una vez que está dentro del mismo.

Si ingresó al modo pizarrón desde el BASIC, puede regresar a él presionando la tecla RESET. Cualquier programa BASIC sigue estando allí. Lo mismo ocurre con cualquier controlador RS-232 o DOS iniciado previamente. Su valor incial es igual a 61987 ($F223).


94 Sólo para los modelos Atari 400/800. En los modelos XL/XE, arrancará el BASIC incorporado. (N. del T.)

58484

E474

WARMSV95

 

 

Punto de entrada del arranque en caliente (vector del botón RESET). Inicializa la región RAM del Sistema Operativo. La tecla RESET produce una interrupción NMI y un reinicio del chip (vea la ubicación a continuación). Salta aquí en un NMI causado al presionar la tecla RESET. Su valor inicial es igual a 61723 ($F11B).


95 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

58487

E477

COLDSV96

 

 

Punto de entrada del arranque en frío (encendido del equipo). Inicializa las regiones de RAM del usuario y del Sistema Operativo; borra cualquier programa en la memoria. Su valor inicial es igual a 61733 ($F125).


96 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)


97 Encuentre información adicional para esta ubicación en la Adenda. (N. del T.)

58490

E47A

RBLOKV

 

 

Punto de entrada de la rutina de bloque de lectura de cassette, solo para uso del Sistema Operativo.

58493

E47D

CSOPIV

 

 

Vector de entrada para apertura de cassette; uso exclusivo del Sistema Operativo.

58496

E480

VCTABL

 

 

Tabla de valores iniciales del vector RAM.


Las siguientes corresponden a las direcciones de las rutinas de los controladores:

58534-59092

E4A6-E6D4

CIOORG

 

 

Las siguientes son las direcciones para las rutinas de CIO (Central Input/Output - Entrada/Salida Central):

58534 ($E4A6) CIOINT Corresponde a la rutina de inicialización de CIO llamada por el monitor al encenderse el equipo.

58577 ($E4D1) Mueve el IOCB del usuario al ZIOCB.

58596 ($E4E4) Comprueba si hay un comando válido

58633 ($E509) Rutinas del comando OPEN.

58675 ($E533) Rutinas del comando CLOSE.

58702 ($E54E) Rutinas del comando STATUS y de los comandos especiales.

58729 ($E569) CIREAD Procesa los comandos CIO para lectura y escritura, incluida la verificación del búfer para comprobar si está lleno o vacío.

58907 ($E61B) Rutina para regresar al usuario desde CIO.

58941 ($E63D) Rutinas para calcular el punto de entrada del controlador del dispositivo, saltar al controlador, transferir el control y luego regresar al CIO después de la operación.

59093-59715

E6D5-E943

INTORG

 

 

Direcciones para las rutinas del controlador de interrupciones:

59123 ($E6F3) PIRQ Las rutinas de servicio de la interrupción IRQ comienzan aquí.

59126 ($E6F6) Vector de IRQ inmediato para el controlador de IRQ. Los vectores de RAM de la NMI global y de la IRQ en las ubicaciones 512 a la 527 ($200 a la $20F) se inicializan todos con esta ubicación (59142, $E706 para la nueva ROM del Sistema Operativo).

59314 ($E7B2) El vector de las interrupciones IRQ durante el encendido; apunta a una secuencia de instrucciones PLA y RTI (nueva ROM del Sistema Operativo; 59219; $E78F).

59316 ($E7B4) PNMI El controlador NMI comprueba el motivo de la NMI y luego salta a través del vector RAM apropiado. También llamada ISR (Interrupt Service Routine - Rutina de Servicio de la Interrupción).

59345 ($E7D1) SYSVBL Las rutinas VBLANK comienzan aquí, incluido el contador de cuadros, el temporizador de actualización, la actualización de los registros de hardware desde los registros sombra, la actualización del contador del modo de atracción y del reloj en tiempo real. El vector inmediato del blanqueo vertical, VVBLKLI, normalmente señalado por las ubicaciones 546, 547 ($222, $223), apunta a esta ubicación. La ROM actualizada del Sistema Operativo apunta a la ubicación 59310 ($E7AE).

59666 ($E912) SETVBL Subrutinas para configurar los temporizadores y vectores de VBLANK. La interrupción diferida del blanqueo vertical, normalmente invocada por el vector de las ubicaciones 548, 549 ($224, $225), apunta a la ubicación 59710 ($E93E). En la ROM actualizada del Sistema Operativo apunta a la ubicación 59653 ($E905). En ambos casos apuntan a la rutina de salida de VBLANK. Para obtener una explicación del proceso VBLANK, vea la revista Micro de enero de 1982. Para obtener una lista de los vectores, consulte la página 104 del Manual del Usuario del Sistema Operativo.

59716-60905

E944-EDE9

SIOORG

 

 

Rutinas para las rutinas de entrada/salida en serie (SIO):

60011 ($EA6B) SEND Es el punto de entrada de la rutina de envío de búfer de SIO.

60048 ($EA90) ISRODN Corresponde al vector de IRQ de salida serie listo.

60113 ($EAD1) ISRTD Corresponde al vector de IRQ completo de salida serie. Se encuentra en la ubicación 60111 ($EACF) en las nueva ROM del Sistema Operativo.

60177 ($EB11) ISRSIR Corresponde al vector de IRQ de entrada serie listo. Se encuentra en la ubicación 60175 ($EB0F) en las nueva ROM del Sistema Operativo.

60292 ($EB84) CASENT Es el inicio de la subrutina SIO del manejo de cassette para establecer la velocidad en baudios, los valores de tono, el espacio entre grabaciones, para cargar el búfer desde el cassette y para encender el motor de la grabadora. Las rutinas de escritura se encuentran en las ubicaciones 61249 a la 61666 ($EFF5 a la $F0E2).

60515 ($EC63) Es el inicio de la entrada de la rutina de deshabilitación de interrupciones de POKEY, que también deshabilita las funciones de envío y recepción.

60583 ($ECA7) COMPUT Corresponde a la subrutina para calcular la tasa de baudios utilizando los registros de frecuencia de POKEY y el temporizador VCOUNT. Las tablas para los valores AUDF y VCOUNT se encuentran entre las ubicaciones 60882 y 60905 ($EDD2 y $EDE9).

60906-61047 EDEA-EE77 DSKORG

Rutinas para el controlador de disco.

La inicialización se encuentra en la ubicación DINIT, 60906 ($EDEA), y el punto de entrada en la ubicación DISKIF, 60912 ($EDF0).

61048-61248 EE78-EF40 PRNORG

Rutinas para el controlador de la impresora.

61249-61666 EF41-F0E2 CASORG

Rutinas para el controlador de la grabadora de cassettes.

El zumbido utilizado en el comando CLOAD del cassette se puede llamar desde BASIC mediante:

ZUMBIDO = USR(61530)

Puede apagarlo con la tecla RESET. Si bien esto no es terriblemente emocionante, señala el potencial de usar el altavoz de la consola para sonido en lugar de solo pitidos (la ubicación en RAM del altavoz está en la ubicación 53279; $D01F). Para ver una rutina breve sobre cómo utilizar el altavoz para efectos de sonido, consulte la ubicación del altavoz y la revista COMPUTE! de agosto de 1981.

61667-62435 F0E3-F3E3 MONORG

Rutinas para el controlador del monitor. Esta también es el área de la dirección PWRUP, el módulo de encendido (ubicación 61733; $F125). Las rutinas de inicio en frío se inicializan en esta ubicación. La rutina para verificar la instalación del cartucho comienza en la ubicación 61845 ($F195). La inicialización del hardware comienza en la ubicación 62081 ($F281).

61723 ($F11B) RESET

La rutina del botón RESET comienza aquí.

62081 ($F281) HARDI

Corresponde al inicio de las rutinas de inicialización del hardware.

62100 ($F294) OSRAM

El inicio de las rutinas de inicialización y configuración de la RAM del Sistema Operativo.

62159 ($F2CF) BOOT

El punto de entrada para la rutina de arranque del disco.

62189 ($F2ED) DOBOOT

La activación de la rutina de arranque del disco.

62334 ($F37E) DOPEN

El punto de entrada para la reinicialización del software del disco.

62436-65535

F3E4-FFFF

KBDORG

 

 

Rutinas para el controlador de pantalla y de teclado. El controlador de pantalla comienza en la ubicación 62454 ($F3F6) y el controlador de teclado comienza en la ubicación 63197 ($F6DD), a continuación.

63038

F63E

EGETCH

 

 

Al igual que el comando INPUT del BASIC, EGETCH obtiene una línea de la pantalla y el teclado, pero solo un carácter a la vez. Debe realizar un JSR a la ubicación $F63E para cada entrada de carácter. Esta es también la dirección del inicio de las rutinas del editor de pantalla.

63140

F6A4

EOUTCH

 

 

Esta rutina coloca en la pantalla el carácter actualmente en el Acumulador del microprocesador 6502, en la siguiente ubicación de impresión. Similar al comando PUT del BASIC.

63197

F6DD

KGETC2

 

 

Inicio del controlador del teclado.

63202

F6E2

KGETCH

 

 

Esta rutina espera a que se presione una tecla y devuelve su valor en el Acumulador (registro A del microprocesador 6502). Similar al comando GET del BASIC.

64428

FBAC

SCROLL

 

 

La rutina de desplazamiento de pantalla comienza aquí.

64764

FCFC

DRAW

 

 

Las rutinas de dibujo de pantalla comienzan aquí y terminan en la ubicación 65092 ($FE44). Para ver un ejemplo de una modificación a las rutinas de dibujo para evitar el error de "fuera de límites" para su uso en GRAPHICS 7+, consulte la revista Creative Computing de marzo de 1982.

65093-65469

FE45-FFBD

....

 

 

Las tablas en la ROM para las listas de despliegue, los códigos ANTIC, los códigos de control y los códigos de conversión ATASCII.

65470

FFBE

PIRQQ

 

 

Aquí comienzan las subrutinas para probar la aceptación de la última tecla presionada y para procesar las rutinas de retardo de rebote.

Cuando se presiona una tecla, se inicia una IRQ a través de VKEYBD en las ubicaciones 520, 521 ($208, $209) a 65470 ($FFBE). Esta es la rutina de servicio del teclado. Procesa el rebote y la lógica SHIFT-CONTROL (vea ubicación 559; $22F); guarda el código interno del teclado en las ubicaciones 754 ($2F2) y 764 ($2FC); establece el indicador de modo ATTRACT en 77 ($4D) y establece la ubicación 555 ($22B - SRTIMR) en 48 ($30).

65528

FFF8

CHKSUN

 

 

Según la revista Softside de diciembre de 1981, si un PEEK aquí devuelve 255, entonces tiene la ROM más antigua del Sistema Operativo. En las ROM más antiguas hubo algunos problemas con las cargas de cassettes, que a veces requieren lo siguiente para solucionarse:

Realice un LPRINT sin una impresora conectada antes de hacer CLOAD. Esto borra el búfer del cassette.

Presione RESET antes de hacer CSAVE o CLOAD para restaurar el sistema a sus parámetros de inicialización y ayudar con la carga y el guardado de rutinas.

Hay disponible un nuevo Sistema Operativo de Atari que corrige un error que causa que las operaciones de E/S se "agoten" después unos segundos. Aparentemente no altera ninguna de las rutinas mencionadas aquí.

Los vectores de interrupción de reinicio del chip (encendido) apuntan a la ubicación 65532 ($FFFC) almacenada en el vector 58487 ($E477), donde se ubica un JMP al vector de la rutina de encendido. Reiniciar un chip no es lo mismo que presionar la tecla RESET, que por sí sola no genera un reinicio del chip.

Las interrupciones NMI se envían a través de 65530 ($FFFA) a la rutina de servicio (ISR o Interrupt Service Routine - Rutina de Servicio de Interrupción) de la NMI en la ubicación 59316 ($E7B4), y todas las interrupciones IRQ se envían a través de la ubicación 65534 ($FFFE) a la rutina de servicio IRQ en la ubicación 59123 ($E6F3). En estas áreas de rutina de servicio se determina la causa de la interrupción y se toma la acción adecuada, ya sea por el Sistema Operativo o mediante un JMP a un vector en RAM donde existe una rutina de usuario.