Página Cero
Las posiciones de cero a 255 ($0 a $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 más rápida y fácilmente.
Las ubicaciones cero a 127 ($0 a $7F) están reservadas como la página cero del sistema operativo2, mientras que de 128 a 255 ($80 a $FF) son la página cero del BASIC y la usada por el usuario en RAM.
Las ubicaciones cero a 1792 ($0 a $700) se usan como sistema operativo y (si el cartucho está presente) 8K BASIC RAM (excepto la página seis). Las ubicaciones cero a 8191 ($0 a $1FFF) son el mínimo requerido para la operación (8K).
Las ubicaciones dos a siete no se borran en ninguna operación de arranque.
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.)
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?
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.
Un valor igual a 3 significa que tanto el cassette como el disco se iniciaron correctamente. Puede activar el botón RESET haciendo POKE 9,3 seguido de un POKE a las ubicaciones 2 y 3 (CASINI) con la dirección (byte menos significativo/byte más significativo) de su rutina de lenguaje de máquina para atrapar el RESET (dentro de la rutina, almacene también un 3 en la ubicación 9) y un RTS al final.
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ón8" (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 RTS9, debe establecer el valor de BOOT? en 1 y la dirección 580 ($244) en 0.
8 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.)
9 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 DOSINI
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.
Cargue aquí la dirección de inicialización de su programa en lenguaje de máquina para atrapar el RESET y evitar que éste vuelva a ejecutarlo. También puede hacerlo mediante CASINI; vea la ubicación de más arriba.
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 Despliegue10 ,) (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.
10 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) 11 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).
11 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 RTCLOK
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"12. 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.
El número al que se refiere el segundo párrafo debe ser igual a 256 al cubo, menos 1 (256 * 256 * 256 - 1). Además, para obtener los segundos del conteo de jiffys, divida por 59,92334 (el intervalo de tiempo real del VBI), y no por 60. Para obtener información sobre los temporizadores de Atari, consulte los artículos de Stephen Levy en el libro COMPUTE!'s Third Book of Atari y de Bob Cockcroft en la revista ROM (diciembre de 1984 y febrero de 1985).
12 "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 PBPNT
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. El puntero al byte o carácter actual que se enviará a la impresora.
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 ICDNOZ
Número de dispositivo o número de unidad actual. En DOS se le conoce como MAXDEV, e indica el número máximo de dispositivos. Su valor inicial es igual a 1.
Las posiciones 32 a 47 ($20 a $2F) son los ZIOCB: Bloque de Control de Entrada-Salida de la página cero. Utilizan la misma estructura que los IOCB's en las ubicaciones 832 a 959 ($340 a $3BF). El ZIOCB se utiliza para comunicar los datos de control de E/S entre CIO y los manejadores de dispositivos. Cuando se inicia una operación de CIO, la información almacenada en el canal IOCB se mueve aquí para ser utilizada por las rutinas de CIO. Cuando la operación termina, la información actualizada es devuelta al área de usuario.
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 trama13 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).
13 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 CHKSNT
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. 0 significa no enviado.
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 CRITIC
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.
Haga POKE 66,1 para deshabilitar la actualización entre los registros sombra y hardware; luego, puede usar POKE directamente en los registros hardware. También puede deshabilitar el proceso VBLANK de la ubicación 54286 ($D40E).
67-73 43-49 FMZSPG
Registros de Página Cero del Sistema Administrador de Archivos del disco (FMS) (7 bytes). Reiniciado por FMS cada vez que toma el control.
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 DLI14, 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.
14 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áscara15 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).
15 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 LMARGN
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. Tienen un rango de 0 a 39 igual que RMARGN.
83 53 RMARGN
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.
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 DINDEX
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 11). 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 Comando16, 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.
Para apagar el cursor al dibujar en modo texto, haga POKE 752,1 seguido de una declaración PRINT. Para obtener colores diferentes, agregue una sentencia COLOR antes de la rutina PLOT. El carácter será el equivalente ASCII del número que sigue a la sentencia COLOR.
16 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 SAVMSC
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:
| 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 cartucho17. 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).
El programa para guardar la pantalla gráfica no funciona. Para lograr este objetivo, cree una cadena que contenga una rutina de llamada en lenguaje de máquina:
1 DATA 104,104,104,170,76,66,228 2 REM PLA, PLA, PLA, TAX, JMP $E456 5 FOR N=1 A 7:READ BYTE:ML$(N,N)=CHR$(BYTE):NEXT N
Ahora abra un canal para escribir en el disco (OPEN #4,8,0, "D:filename.ext"). Encuentre RAMTOP (FIN = PEEK(106) * 256 - 160), restando 160 bytes en caso de tener una ventana de texto. Encuentre la dirección de la lista de despliegue (DLIST = PEEK(560) + 256 * PEEK(561): INICIO = PEEK(DLIST + 4) + 256 * PEEK(DLIST + 5): ALTO = INT(INICIO/256): BAJO = INICIO - 256 * ALTO) e introdúzcala en la ubicación correcta en el IOCB (POKE 900,BAJO: POKE 901,ALTO).
A continuación, calcule la longitud de la pantalla (TAMANO = (FIN - INICIO) + 1: TAMANOA = INT(TAMANO/256): TAMANOB = TAMANO - 256 * B1), e introdúzcala en el IOCB usando POKE (POKE 904,TAMANOB: POKE 905,TAMANOA). Haga POKE en el IOCB con el comando "guardar binario" (POKE 898,11). Llame al CIO con el comando USR (X=USR(ADR(ML$),4 * 16)). Finalmente, guarde el modo gráfico actual (MODO = PEEK(87): PUT #4,MODO) y los registros de color (FOR N = 708 TO 712; PUT #4,PEEK(N): NEXT N) y haga CLOSE #4.
Para recuperar la pantalla, utilice la misma rutina USR y los PEEK y POKEs anteriores, pero haciendo POKE 898,7 en vez de 11. Esto se derivó de un programa más extenso de Fred Pinto en la edición de marzo de 1984 de la revista Antic. Un artículo de Steve Kaufman en la revista COMPUTE! de noviembre de 1983 presenta un método rápido y sencillo que funciona igual de bien (guardar y cargar), pero no guarda los registros de color. La revista Creative Computing de noviembre de 1983 también tiene un ejemplo similar en su sección "Outpost Atari".
17 Sólo en los modelos Atari 400/800. En los modelos XL/XE, el BASIC viene incorporado.
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 RAMTOP
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).
Para ver cómo proteger la memoria alta, consulte el artículo "RAMTOP Dragon" de KW Harm en el libro COMPUTE!'s Second Book of Atari Graphics. Otro artículo en el mismo libro, por Jim Clark, describe cómo proteger la memoria baja.
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 DELTAR
Fila del delta o diferencia. Contiene el valor absoluto de NEWROW (ubicación 96; $60) menos ROWCRS (ubicación 84; $54).
Este es el cambio de posición vertical al dibujar una línea inclinada.
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 ROWINC
Valor de incremento o decremento de la fila (más o menos 1). Dirección del trazado de la línea: 0 es hacia abajo, 255 es hacia arriba.
122 7A COLINC
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).
Dirección del trazado: 0 es derecha, 255 es izquierda.
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 COUNTR
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.
Iteraciones o pasos necesarios para trazar una línea.
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 pila18. 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.
18 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 VNTD
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
La revista COMPUTE! de octubre de 1983 tiene un artículo de EH Foerster sobre cómo reservar una porción de RAM por encima de la VNTD (dentro de un programa BASIC), que también se guardará intacta cuando guarde su programa.
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 Variable | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 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 STMCUR
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 RETURN19. 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:.
Otra forma de bloquear el sistema si se hace algo no debido (por ejemplo, se presiona la tecla BREAK) es mediante la sentencia Z=USR(0).
19 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,211 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 5734320 ($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.
Área de trabajo de la coma flotante del BASIC. $D2 se utiliza para el tipo de variable, $D3 para el número de variable y la longitud de la mantisa en FP.
20 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 FR0
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 flotante21 , dejando el resultado en FR0. Para revertir esta operación, haga un JSR a $D9D2 (55762).
Usado por el comando USR para devolver un número de 2 bytes a BASIC. Si no se almacena nada aquí, la sentencia "I=USR(dirección, variables)" devuelve la dirección de la subrutina USR. De lo contrario, se puede almacenar un entero (rango 0-65535) que se convierte en el valor de la función USR. Contribución de Judson Pewther, Nueva York.
21 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.