Página Dos
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.
| Decimal | Hexadecimal | Nombre | Descripción |
|---|---|---|---|
| 524, 525 | $20C, $20D | VSEROR | Estas dos posiciones de memoria son similares a las anteriores pero trabajan en la salida de bytes del computador a los periféricos. Cuando el Pokey está listo para transmitir un byte por la salida serial, interrumpe al procesador para que éste le defina a través de SEROUT que también es la posición $D20D, el byte a transmitir. Este trabajo se realiza en una rutina que en el Sistema Operativo se encuentra apuntada por estas dos posiciones. |
| 526, 527 | $20E, $20F | VSEROC | Vector de interrupción de transmisión del bus serie POKEY, inicializado a 60113 ($EAD1), que establece una bandera de transmisión realizada después de enviar el byte de suma de comprobación. IRQ. SIO utiliza las tres últimas interrupciones para controlar la comunicación del bus serie con los dispositivos del bus serie. Durante la comunicación del bus serie, toda la ejecución del programa se detiene. La E/S en serie es controlada por interrupciones; POKEY espera y vigila que se active una bandera cuando la operación de E/S solicitada se complete. Durante esta espera, POKEY está enviando o recibiendo bits a lo largo del bus serie. Cuando se ha transmitido (o recibido) el byte completo, se genera la IRQ de salida necesaria (VSEROR) o de entrada lista (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 establezca una bandera de "transmisión realizada". En este punto, SIO sale de nuevo a la rutina de llamada. Puedes ver que SIO pierde tiempo esperando a que POKEY envíe o reciba la información en el bus. |
| 528, 529 | $210, $211 | VTIMR1 | Vector de interrupción del temporizador POKEY uno, inicializado a 59314 ($E7B2), que es una secuencia de instrucciones PLA, RTI. Las interrupciones del temporizador se establecen cuando el temporizador POKEY AUDF1 (53760; $D200) cuenta hasta cero. Los valores de los registros AUDF se cargan en STIMER en 53769 ($D209). IRQ. |
| 530, 531 | $212, $213 | VTIMR2 | POKEY vector del temporizador dos para AUDF2 (53762, $D202), inicializado a 59314 ($E7B2). IRQ. |
| 532, 533 | $214, $215 | VTIMR4 | POKEY vector del temporizador cuatro para AUDF4 (53766, $D206), inicializado a 59314 ($E7B2). Esta IRQ sólo está vectorizada en la versión "B" de las ROMs del SO. |
| 534, 535 | $216, $217 | VIMIRQ |
El vector inmediato IRQ (general). Inicializado a 59126 ($E6F6). JMP a través de aquí para determinar la causa de la interrupción IRQ. Tenga en cuenta que con las nuevas ("B") ROMs del SO, hay un vector de interrupción de la tecla BREAK en las posiciones 566, 567 ($236, $237). Las nuevas ROMs del SO de la versión "B" cambian los vectores anteriores de la siguiente manera:
VDSLST 59280 ($E790) |
Las posiciones de 536 a 558 ($218 a $22E) se utilizan para los temporizadores de software del sistema. Los temporizadores de hardware se encuentran en el chip POKEY y utilizan los registros AUDF. Estos temporizadores cuentan hacia atrás cada intervalo de 1/60 segundos (etapa uno de VBLANK) o 1/30 segundos (etapa dos de VBLANK) hasta llegar a cero. Si el proceso de VBLANK está desactivado o interceptado, los temporizadores no se actualizarán. Consulte De Re Atari para obtener información sobre la configuración de estos temporizadores en una rutina de ensamblaje utilizando el registro SETVBV (58460; $E45C). Estas ubicaciones son accesibles para el usuario y se pueden hacer para contar el tiempo para la duración de la música, el juego E/S del juego, reloj del juego y otras funciones.
Los temporizadores de software se utilizan para duraciones superiores a un intervalo VBLANK (1/60 segundos). Para periodos de menor duración, utilice los registros de hardware.
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 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 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 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. 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!, diciembre de 1981. 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: 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 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.
