Idioma

Ver el código de Página Dos

{{toc}}

===512,513 200,201 VDSLST===

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

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

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

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

A continuación, se muestra un breve ejemplo de DLI. Imprime la mitad inferior de la pantalla de texto al revés:
%%
10 INICIO=PEEK(560)+PEEK(561)*256:POKE INICIO+16,130
20 PAGINA=1536:FOR PGM=PAGINA TO PAGINA+7:READ BYTE:POKE PGM,BYTE:NEXT PGM
30 DATA 72,169,4,141,1,212,104,64
40 POKE 512,0:POKE 513,6:POKE 54286,192
50 FOR PRUEBA=1 TO 240:PRINT "VEA ";:NEXT PRUEBA
60 GOTO 60
%%
Este otro ejemplo de DLI cambia el color de la mitad inferior de la pantalla. Para usarlo, simplemente cambie PAGINA+7 a PAGINA+10 en el programa anterior y reemplace la línea 30 con:
%%
30 DATA 72,169,222,141,10,212,141,24,208,104,64
%%
Por último, elimine las líneas 50 y 60. Vea también la ubicación 54282 ($D40A).

===514,515 202,203 VPRCED===

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

===516,517 204,205 VINTER===

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

===518,519 206,207 VBREAK===

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

===520,521 208,209 VKEYBD===

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

===522,523 20A,20B VSERIN===

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

===524,525 20C,20D VSEROR===

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

===526,527 20E,20F VSEROC===

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

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

===528,529 210,211 VTIMR1===

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

En la sección "From Here to Atari" de las revistas Micro entre junio y diciembre de 1983, Paul Swanson explicó el correcto funcionamiento de los temporizadores POKEY. Los manuales contienen una descripción inexacta que provoca el bloqueo del sistema. El método a continuación se basa en esos problemas.

Esto se describe para el canal #1; puede usarse en los canales #2 y #4 (y no el #3) seleccionando los vectores de control e interrupción adecuados. Primero, haga POKE en AUDCTL (53768; $D208) con un valor de frecuencia (0 = 64 kilohercios, 1 = 15 kilohercios, 96 = 1,79 megahercios). (Si lo desea, puede cambiar la frecuencia entre interrupciones ). A continuación, configure el registro de control del canal (53761; $D201). Introduzca su rutina de interrupción e introduzca su dirección en las ubicaciones 528 y 529 ($210 y $211).

Una vez hecho esto, haga POKE 53769,0 ($D209). Ahora habilite la interrupción: haga POKE 16 con PEEK(16) más el número de la interrupción que está usando (1 = interrupción del temporizador #1, 2 = temporizador #2, 4 = temporizador #4; ¡No existe el temporizador #3!). Haga POKE con el mismo valor en la ubicación 53774. Su rutina de interrupción comenzará; generará una interrupción cuando el temporizador llegue a 0. El temporizador se recarga con el valor original que introdujo y el proceso comienza de nuevo.

Hay varios problemas a tener en cuenta: Primero, el Sistema Operativo inserta el registro A en la Pila antes de pasar por la dirección del vector. Si necesita los registros X e Y, introdúzcalos también. Antes de regresar de la interrupción, extraiga los registros X e Y de la pila, usando el comando PLA, y borre la interrupción con el comando CLI.

Si no necesita la pantalla, haga POKE 559,0 para desactivarla; el DMA roba ciclos de reloj del temporizador. Esto significa que deberá ejecutar primero cualquier comando que maneje registros sombra (como SETCOLOR y GRAPHICS). El DMA también desactiva la repetición del teclado y del reloj en tiempo real. Desactive el teclado para ganar un poco más de tiempo si es necesario.

Para obtener más información sobre los temporizadores POKEY, consulte las revistas Micro y ROM de diciembre de 1984.

===530,531 212,213 VTIMR2===

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

===532,533 214,215 VTIMR4===

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

===534,535 216,217 VIMIRQ===

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

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

----

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

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

===536,537 218,219 CDTMV1===

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

===538,539 21A,21B CDTMV2===

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

===540,541 21C,21D CDTMV3===

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

===542,543 21E,21F CDTMV4===

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

===544,545 220,221 CDTMV5===

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

===546,547 222,223 VVBLKI===

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

===548,549 224,225 VVBLKD===

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

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

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

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

Si crea sus propios VBI, finalice un VBI inmediato con un JMP a la ubicación 58463 ($E45F) y un VBI diferido con un JMP a la ubicación 58466 ($E462). Para omitir por completo la rutina VBI del Sistema Operativo que se encuentra en la ubicación 59345 ($E7D1), finalice su VBI inmediato con un JMP a la ubicación 58466 ($E462). A continuación, se muestra un ejemplo50 del uso de una VBI para crear un cursor parpadeante. También hace parpadear cualquier texto que se muestre en modo video inverso.
%%(code)
05 REM EJEMPLO DE ATARI 400/800 CON OS-B + PAL
10 FOR BLINK=1664 TO 1680:READ BYTE:POKE BLINK,BYTE:NEXT BLINK
20 POKE 548,128:POKE 549,6
30 DATA 8,72,165,20,41,16,74,74,74,141
40 DATA 243,2,104,40,76,62,233
%%
Para restaurar el cursor y la pantalla normales, POKE 548,62 y POKE 549,233.
%%(code)
05 REM EJEMPLO VERSION XE/XL
10 FOR BLINK=1664 TO 1680:READ BYTE:POKE BLINK,BYTE:NEXT BLINK
20 POKE 548,128:POKE 549,6
30 DATA 8,72,165,20,41,16,74,74,74,141
40 DATA 243,2,104,40,76,98,228
%%


#|
*|Decimal |Hexadecimal|Nombre|Descripción|*
||550, 551|$226, $227|CDTMA1|Dirección de salto del temporizador del sistema, inicializada a 60400 ($EBF0). Cuando las localizaciones 536, 537 ($218, $219) alcanzan (cuenta atrás) el cero, el SO pasa por aquí (salta a la localización especificada por estas dos direcciones). Puedes establecer aquí la dirección de tu rutina de código máquina para que se ejecute cuando el temporizador uno llegue (cuenta atrás) a cero. Su código debe terminar con la instrucción RTS.
Pueden surgir problemas cuando los valores del temporizador son mayores de 255, ya que el 6502 no puede manipular valores de 16 bits directamente (un número en el rango de cero a 255 es un valor de ocho bits; si un valor requiere dos bytes para ser almacenado, como una posición de memoria, es un valor de 16 bits). Técnicamente, podría producirse una interrupción VBLANK cuando un byte del temporizador se está inicializando y el otro aún no se ha establecido. Para evitarlo, mantenga los valores del temporizador por debajo de 255. 
Como el SO utiliza el temporizador uno, se recomienda utilizar el temporizador dos en su lugar, para evitar conflictos con el funcionamiento del Atari. Inicializado a 60396 ($EBEA) en las antiguas ROMs, 60400 ($EBF0) en las nuevas ROMs.||
||552,553|$228, $229|CDTMA2|Dirección de salto del temporizador dos del sistema. No utilizada por el SO, disponible para que el usuario introduzca la dirección de su propia rutina a la que hacer JMP cuando la cuenta del temporizador dos (538, 539; $21A, $21B) llegue a cero. Inicializado a cero; la dirección debe ser especificada por el usuario.||
||554|$22A|CDTMF3|Indicador número tres del temporizador del sistema, se activa cuando la posición 540, 541 ($21C, $21D) llega a cero. Este registro también es utilizado por DOS como una bandera de tiempo de espera.||
||555|$22B|SRTIMR|Temporizador de repetición por software, controlado por la rutina de dispositivo IRQ. Establece el retardo inicial de 1/2 segundo antes de que una tecla se repita. La segunda etapa VBLANK establece la velocidad de repetición de 1/10 segundos, decrementa el temporizador e implementa la lógica de repetición automática.
Cada vez que se pulsa una tecla, STIMER se pone a 48 ($30). Siempre que SRTIMR sea igual a cero y se esté pulsando continuamente una tecla, el valor de esa tecla se almacena continuamente en CH, posición 764 ($2FC).||
||556|$22C|CDTMF4|Indicador número cuatro del temporizador del sistema. Se activa cuando la posición 542, 543 ($21E, $21F) llega a cero.||
||557|$22D|INTEMP|Registro temporal utilizado por la rutina SETVBL en 58460 ($E45C).||
||558|$22E|CDTMF5|Indicador número cinco del temporizador del sistema. Se activa cuando la posición 558, 559 ($22E, $22F) llega a cero.||
||560, 561|$230, $231|SDLSTL|Estas dos posiciones de memoria, definen el comienzo de la dirección del Display List.||
||564|$234|LPENH|En esta posición de memoria, el Sistema Operativo del ATARI almacena la posición horizontal de la lectura del Lápiz de Luz.||
||565|$235|LPENV|Posición vertical del Lápiz de Luz sobre la pantalla.||
||566, 567|$236, $237|BRKKY|Vector de interrupción de la tecla BREAK. Este vector está disponible sólo con la versión "B" OS ROMs, no con la versión anterior. Puede utilizar este vector para escribir su propia rutina de interrupción de tecla BREAK. Inicializado a 59220 ($E754).||
||568, 569|$238, $239| |Dos bytes de reserva.||
||570|$23A|CDEVIC|Dirección de cuatro bytes del búfer de trama de comandos (CFB) para un dispositivo -- utilizado por SIO mientras realiza E/S serie, no para acceso de usuario. CDEVIC se utiliza para el número de ID del bus SIO Los otros tres bytes CFB son:||
||571|$23B|CCOMND|El código de comando del bus SIO.||
||572|$23C|CAUX1|Byte auxiliar de comando uno, cargado desde la posición 778 ($30A) por SIO.||
||573|$23D|CAUX2|Byte auxiliar de comando dos, cargado desde la posición 779 ($30B) por SIO.||
||574|$23E|TEMP|Registro RAM temporal para SIO.||
||575|$23F|ERRFLG|Indicador de error SIO; cualquier error del dispositivo excepto el error de tiempo de espera (tiempo igual a cero).||
||576|$240|DFLAGS|Las banderas de disco se leen del primer byte del archivo de arranque (sector uno) del disco.||
||577|$241|DBSECT|El número de sectores de arranque de disco leídos desde el primer registro de disco.||
||578, 579|$242, $243|BOOTAD|La dirección donde se colocará el cargador de arranque del disco. El registro que se acaba de leer se moverá a la dirección especificada aquí, seguido por los registros restantes a leer. Normalmente, con DOS, esta dirección es 1792 ($700), el valor también almacenado temporalmente en RAMLO en 4, 5. La dirección 62189 ($F2ED) es el punto de entrada de la rutina de arranque del disco OS (DOBOOT).||
||580|$244|COLDST|Esta dirección del mapa de memoria contiene un flag que define la acción que va a tomar el computador en caso de ser presionada la tecla Reset. Si esta posición contiene un cero, al presionar Reset no se genera un reboot del sistema. Si en cambio su contenido es 1, al presionar Reset el equipo realiza las mismas tareas que hace cuando se enciende el computador.||
||581|$245| |Byte de repuesto.||
||623|$26F|GPRIOR|Registro de selección de prioridad, Registro de sombra 53275 ($D01B). Las opciones de prioridad seleccionan qué objetos de la pantalla estarán "delante" de los demás. También le permite usar los cuatro **M**isiles como un quinto **P**layer y permite que ciertos **P**layer superpuestos tengan diferentes colores en las áreas de superposición. Sus valores a continuación : 
  * 1 : P0-P1-P2-P3 M0-M1-M2-M3 Fondo
  * 2 : P0-P1 M0-M1-M2-M3 P2-P3 Fondo
  * 4 : M0-M1-M2-M3 P0-P1-P2-P3 Fondo
  * 8 : M0-M1 P0-P1-P2-P3 M2-M3 Fondo
  * 16 : Unir 4 Misile para formar el 5to Player
  * 32 : Overlapping Players para optener el 3er color
  * 64 : GTIA modo grafico
  * 128 : GTIA modo grafico
Los GTIA modo grafico se puede utilizar para seleccionar uno de los modos 9, 10 y 11. Sus valores son :
  * 9 : luminancias diferentes del mismo tono (color)
  * 10 : colores diferentes
  * 11 : 16 matices (colores) diferentes de la misma luminancia||
||624|$270|PADDLO|En esta posición de memoria, el sistema operativo almacena el valor de la lectura del paddle Nro. 0. Este valor puede oscilar entre 0 y 228.||
||625|$271|PADDL1|Valor del paddle 1.||
||626|$272|PADDL2|Valor del paddle 2.||
||627|$273|PADDL3|Valor del paddle 3.||
||628|$274|PADDL4|Valor del paddle 4, Solo para 400/800.||
||629|$275|PADDL5|Valor del paddle 5, Solo para 400/800.||
||630|$276|PADDL6|Valor del paddle 6, Solo para 400/800.||
||631|$277|PADDL7|Valor del paddle 7, Solo para 400/800.||
||632|$278|STICK0|Esta es la posición que entrega el valor del joystick 1, en la siguiente imagen aparecen los posibles valores en decimal y binario.
((https://www.atariware.cl/archivos/mapping/joystick.png))||
||633|$279|STICK1|Registra el contenido de la lectura del joystick 2.||
||634|$27A|STICK2|Registra el contenido de la lectura del joystick 3, Solo para 400/800.||
||635|$27B|STICK3|Registra el contenido de la lectura del joystick 4, Solo para 400/800.||
||636|$27C|{{anchor href="PTRIG0"}}PTRIG0|Registro del botón del paddle 1, valores posibles 1 no presionado y 0 presionado.||
||637|$27D|{{anchor href="PTRIG1"}}PTRIG1|Registro del botón del paddle 2, valores posibles 1 no presionado y 0 presionado.||
||638|$27E|{{anchor href="PTRIG2"}}PTRIG2|Registro del botón del paddle 3, valores posibles 1 no presionado y 0 presionado.||
||639|$27F|{{anchor href="PTRIG3"}}PTRIG3|Registro del botón del paddle 4, valores posibles 1 no presionado y 0 presionado.||
||640|$280|{{anchor href="PTRIG4"}}PTRIG4|Registro del botón del paddle 5, valores posibles 1 no presionado y 0 presionado.
Solo para 400/800.||
||641|$281|{{anchor href="PTRIG5"}}PTRIG5|Registro del botón del paddle 6, valores posibles 1 no presionado y 0 presionado.
Solo para 400/800.||
||642|$282|{{anchor href="PTRIG6"}}PTRIG6|Registro del botón del paddle 7, valores posibles 1 no presionado y 0 presionado.
Solo para 400/800.||
||643|$283|{{anchor href="PTRIG7"}}PTRIG7|Registro del botón del paddle 8, valores posibles 1 no presionado y 0 presionado.
Solo para 400/800.||
||644|$284|STRIG0|Registro del botón del joystick 1, valores posibles 1 no presionado y 0 presionado.||
||645|$285|STRIG1|Registro del botón del joystick 2, valores posibles 1 no presionado y 0 presionado.||
||646|$286|STRIG2|Registro del botón del joystick 3, valores posibles 1 no presionado y 0 presionado.
Solo para 400/800.||
||647|$287|STRIG3|Registro del botón del joystick 4, valores posibles 1 no presionado y 0 presionado.
Solo para 400/800.||
||648|$288|CSTAT|Registro de estado del casete.||
||649|$289|WMODE|Esta localización especifica el tipo de operación ejecutada por la unidad de casete :
0 = operación de lectura.
128 = operación de escritura.||
||650|$28A|LBLIM|ocalización que mantiene el registro del numero de datos activos en el buffer del casete los valores fluctúan entre 0 y 128.||
||651, 655 |$28B, $28F| |Bytes de repuesto. No se recomienda que utilice los bytes de repuesto para su propio uso del programa. En actualizaciones posteriores del sistema operativo, es posible que se utilicen estos bytes, lo que provocaría un conflicto con su programa. Por ejemplo, las nuevas ROM del sistema operativo utilizan las ubicaciones 652 y 653 ($28C, $28D) en las nuevas rutinas de manejo de interrupciones de IRQ. Lo mejor es usar un área protegida de la memoria como la página seis, ubicaciones 1536 a 1791 ($600 a $6FF).||
||694|$2B6|INVFLG|Esta posición de memoria refleja a un flag que indica si el teclado está o no en video inverso. Un valor cero en esta posición indica que el teclado está en video común, pero si pokeamos un 128 el teclado se convierte en video inverso.||
||702|$2BE|SHFLOK|Esta posición contiene un flag que indica si el teclado está trabajando en mayúsculas o minúsculas o bien si está siendo ocupada la tecla Control. Pokeando un cero, el teclado trabaja con minúsculas, con un 64 lo hace con mayúsculas y cuando posee un 128 la tecla Control está siendo accionada.||
||704|$2C0|PCOLR0|Color del player/missile número 0.||
||705|$2C1|PCOLR1|Color del player/missile número 1.||
||706|$2C2|PCOLR2|Color del player/missile número 2.||
||707|$2C3|PCOLR3|Color del player/missile número 3.||
||708|$2C4|COLOR0|Este byte representa al registro de color cero y es la copia del registro de Hardware ubicado en la posición de memoria $D016 o 53270.||
||709|$2C5|COLOR1|Representa al registro de color 1 cuyo registro de Hardware se encuentra en la posición $D017 ó 53271.||
||710|$2C6|COLOR2|Al igual que el byte anterior, representa al registro de color número 2 cuyo registro de Hardware se encuentra en $D018 o 53272.||
||711|$2C7|COLOR3|Representa al registro de color 3 y su posición en el Hardware es $D019 o 53273.||
||712|$2C8|COLOR4|Representa al registro de color número 4 y como lo indicamos anteriormente es el background de la pantalla. Es un shadow del registro de Hardware ubicado en $D01A o 53274.||
|#

Las posiciones 713 a 735 ($2C9 a $2DF) son bytes de reserva y posiciones 736 a 767 ($2E0 a $2FF) son para usos varios para 400/800.

#|
*|Decimal |Hexadecimal|Nombre|Descripción|*
||729|$2D9|KRPDEL|Cuando mantenemos presionada una misma tecla del teclado durante unos instantes, ésta comienza a repetirse en la pantalla. Esta posición de memoria maneja el tiempo que debe ser presionada antes de comenzar a repetirse. Pero este valor puede modificarse pokeando cualquier valor que va a indicar la cantidad de 1/60 segundos que el computador va a esperar antes de comenzar la repetición.||
||730|$2DA|KEYREP|Esta posición contiene la velocidad de repetición de las teclas al mantenerse oprimidas. Si en esta posición almacenamos un 0 le estamos indicando al S.O. que no repita teclas, es decir, que al presionar una tecla sólo se imprime un carácter, pero cualquier valor puede ser almacenado en esta posición de memoria.||
||731|$2DB|NOCLIK|Si en esta posición almacenamos cualquier valor distinto de cero, el teclado deja de hacer su ruido característico cada vez que presionamos una tecla.||
||732|$2DC|HELPFG|Esta posición de la memoria lee la tecla HELP, solo para la serie XL/XE. Para más detalles de los valores ((Codigodeteclado#h54-3 acá)).||
||736, 737|$2E0, $2E1|RUNAD|En nuestro artículo de Files Binarios, hemos explicado el funcionamiento de la carga de estos archivos. En nuestra Revista Nro. 9 hicimos una completa descripción de este tipo de carga y hemos visto cómo se utilizan las posiciones de memoria $2E0 y $2E1. Cuando un archivo tipo File es terminado de cargar en la memoria del computador, estas dos posiciones de memoria son consultadas por el DOS. Si estas posiciones apuntan a una determinada zona de la memoria, el S.O. interpreta que es en esta zona donde comienza la ejecución del File.||
||738, 739|$2E2, $2E3|INITAD|También en este artículo hemos estudiado el funcionamiento de estas direcciones de la memoria del computador. Pero para refrescar estos conceptos podemos decir que cuando se carga un File con sus respectivos Stage, si las direcciones que definen el INITAD, es decir, 738 y 739, son distintas de $00 $00, se ejecuta un llamado a la subrutina que es apuntada por estas dos direcciones para luego seguir la carga del File.||
||740|$2E4|RAMSIZ|Esta posición de memoria contiene la cantidad de páginas de memoria, es decir, grupos de 256 bytes que contiene nuestro computador disponible en RAM.||
||741, 742|$2E5, $2E6|MEMTOP|Estas dos posiciones de memoria vienen a apuntar a la última posición disponible en RAM para programas o dato: del usuario. Este valor es definido por el Sistema Operativo cuando el computador es encendido y se redefine cada vez que se presiona la teda Reset o se modifican los modos gráficos de la pantalla. Esto es así, porque el Display List del Antic se posiciona en los siguientes bytes apuntados por MEMTDP.||
||743, 744|$2E7, $2E8|MEMLO|Estas dos posiciones de memoria definen la primera posición disponible de la Ram para el usuario.||
||745|$2E9| |Byte de repuesto.||
||746, 749|$2EA, $2ED|DVSTAT|Cuatro registros de estado de dispositivo utilizados por la operación de estado de E/S como sigue:

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

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

747 ($2EB) es el byte de estado del dispositivo. Para el disco, contiene el valor del registro de estado del controlador de la unidad. Para la Interfaz 850, contiene el estado de DSR,CTS,CRX y RCV cuando la E/S concurrente no está activa (véase el Manual de la Interfaz 850). También contiene el valor del byte AUX2 de la operación anterior (véase la descripción de IOCB en 832 a 959; $340 a $3AF).

748 ($2EC) es el valor máximo de tiempo de espera del dispositivo en segundos. Un valor de 60 aquí representa 64 segundos. Este valor se devuelve a la posición 582 ($246) después de cada petición de estado del disco. Inicializado a 31.

749 ($2ED) se utiliza para el número de bytes en el búfer de salida. Ver Manual 850, pagina 43.

Cuando la E/S concurrente está activa, el comando STATUS devuelve el número de caracteres en el buffer de entrada a las posiciones 747 y 748, y el número de caracteres en el buffer de salida a la posición 749.||

||750, 751|$2EE, $2EF|CBAUDL/H|Bytes bajos y altos de la velocidad de transmisión del casete. Inicializado a 1484 ($5CC), que representa un baudio nominal de 600 (bits por segundo). 
Después de los cálculos de la tasa de baudios, estas posiciones contendrán valores POKEY para la tasa de baudios corregida. La velocidad en baudios es ajustada por SIO para tener en cuenta las variaciones del motor, el estiramiento de la cinta, etc. El principio de cada registro de casete contiene un patrón de bits alternados de apagado/encendido (cero/uno) que se utilizan únicamente para la corrección de velocidad (baudios).||
||752|$2F0|CRS1NH|Esta posición de la memoria es utilizada para hacer aparecer o desaparecer al cursor de la pantalla. Si queremos hacer desaparecer al cursor, es necesario pokear a esta posición con un 1 y ejecutar un movimiento del cursor en cualquier sentido. Esto lo podemos realizar de la siguiente manera:
10 POKE 752,1 
20 PRINT " "||
||753|$2F1|KEYDEL|Bandera de retardo de tecla o contador de rebote de tecla; se utiliza para ver si se ha pulsado alguna tecla. Si se devuelve un cero, entonces no se ha pulsado ninguna tecla. Si se devuelve tres, entonces cualquier tecla. Se decrementa cada etapa dos VBLANK (1/60 o 1/30 de segundo) hasta que llega a cero. Si se pulsa cualquier tecla mientras KEYDEL es mayor que cero, se ignora como "rebote". Ver COMPUTE!, Diciembre 1981 en ((https://archive.org/details/1981-12-compute-magazine/page/n111/mode/2up página 111)), para una rutina para cambiar el retardo del teclado para adaptarlo a tus propias necesidades de tecleo.||
||754|$2F2|CH1|Código de carácter de teclado anterior (leído y aceptado más recientemente). Es el valor anterior pasado desde 764 ($2FC). Si el valor del nuevo código de tecla es igual al valor en CH1, el código se acepta sólo si se ha producido un retardo de rebote de tecla adecuado desde que se aceptó el valor anterior.||
||755|$2F3|CHACT|Registro de Modo Carácter. Cero significa caracteres inversos normales, uno significa caracteres inversos en blanco (los caracteres inversos se imprimirán como espacios en blanco, es decir, invisibles), dos significa caracteres normales, tres significa caracteres inversos sólidos. De cuatro a siete es lo mismo que de cero a tres, pero imprime la pantalla al revés. Este registro también controla la transparencia del cursor. Es transparente con los valores dos y seis, y opaco con los valores tres y siete. El cursor está ausente con los valores cero, uno, cuatro y cinco.
Activar y desactivar el bit 0 puede ser una forma práctica de producir un efecto de parpadeo en caracteres impresos inversos (caracteres con valores ATASCII superiores a 128, aquellos que tienen el bit 7 activado).
Sombra para 54273 ($D401). No hay cursor visible para la salida del modo gráfico. CHACT se inicializa a dos.
A continuación, se muestra un ejemplo de texto parpadeante con este registro:
%%(code)
10 CHACT=755:REM USAR INVERSO PARA LAS PALABRAS A CONTINUACIÓN
15 PRINT "[ESTA ES UNA PRUEBA DE PARPADEO] [TEXTO]"
20 POKE CHACT,INT(RND(0)*4)
30 FOR N=1 TO 100:NEXT N:GOTO 15
%%
Véase COMPUTE!, ((https://archive.org/details/1981-12-compute-magazine/page/110/mode/2up diciembre)) de 1981.
Usando una rutina de lenguaje de máquina y espacio en la página seis, intente:
%%(code)
10 PAGE=1536:EXIT=1568
20 FOR N=PAGE TO EXIT:READ BYTE:POKE N,BYTE:NEXT N
30 PGM=USR(PAGE)
40 PRINT "[ESTA] ES UNA [PRUEBA] DE TEXTO [PARPADEANTE]":REM HAGA ALGUNAS PALABRAS INVERTIDAS
50 GOTO 50
60 DATA 104,169,17,141,40,2,169,6,141,41
70 DATA 2,169,30,141,26,2,96,173,243,2
80 DATA 41,1,73,1,141,243,2,169,30,141,26,2,96
%%
La frecuencia de parpadeo se establece en 0,5 segundos; para cambiarla, cambie el 30 en la línea 80 por cualquier número entre 1 (1/30 de segundo) y 255 (ocho 0,5 segundos). Para ver o no el cursor, consulte las posiciones 752.||
||756|$2F4|CHBAS|Set de Caracteres en nuestro ATARI, Básicamente CHBAS contiene el valor de la definición de los caracteres para mostrarlos en la pantalla. Por defecto tiene el valor 224 ($E0) por lo cual usa el set de caracteres definidos en la memoria ROM que están ubicadas entre 57344 al 58367 ($E000 al $E3FF). Esto se extiende en modelos XL/XE con ((#CHARSET2))||
||764|$2FC|CH|Esta posición de la memoria permanentemente contiene el código interno de la última tecla presionada. Si queremos investigar esta posición de la memoria podemos ingresar en nuestro computador el siguiente programa en BASIC:
%%(code)
10 DATA=PEEK(764)
20 PRINT "TECLA PRESIONADA=";DATA
30 POKE 764,255 
40 FOR I=1 TO 250 
50 NEXT I
60 GOTO 10
%%
De esta manera, presionando cada tecla, podemos obtener una tabla de los valores internos de las teclas que puede ser muy útil en nuestra programación. Es muy importante que para volver a leer esta posición la pokees con un 255 o un $FF para limpiar su contenido. Si quiere saber el valor de cada letra o combinaciones revisa por ((Codigodeteclado acá)) ||
|#

 
===765,2FD FILDAT===

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

===766,2FE DSPFLG===

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

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

===767,2FF SSFLAG===

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

----
{{navigation main="/Biblioteca/MapeandoElAtari" title=1}}