Mapping the Atari - Revised Edition, por Ian Chadwick
APÉNDICE DOCE
El mapa de memoria de los computadores XL/XE
La mayor parte de la información de la primera edición del libro Mapping the Atari se aplica igualmente a las líneas de computadoras XL y XE; solo las ubicaciones que se indican a continuación presentan cambios conocidos. Atari realizó varios cambios en las ubicaciones de la memoria RAM, y en los modelos más nuevos, el Sistema Operativo se reescribió casi por completo.
La información presentada aquí corresponde a los modelos 600XL, 800XL, 1200XL, 65XE y 130XE. A excepción del 1200XL, los modelos XL y XE son prácticamente idénticos. Se han hecho cambios en la ROM del BASIC, pero no tengo información oficial sobre cambios en el Sistema Operativo, aunque tengo motivos para creer hubo algunos.
Para quienes tengan computadoras XL y tengan dificultades para usar software antiguo de las computadoras modelo 800, Atari (y varias otras compañías) han fabricado un disco Translator que carga el Sistema Operativo del modelo 800 encima del XL, lo que permite ejecutar casi todos los programas de las computadoras modelo 800. Si aún no lo tiene, solicite este disco a su distribuidor local Atari. La cara A del disco Translator le permite el pulsar la tecla RESET y, por lo general, permanecer en el Sistema Operativo antiguo; la cara B no contiene este parche, por lo que al pulsar RESET se vuelve al Sistema Operativo XL. También en CompuServe se encuentra disponible un traductor de dominio público llamado FIXXL. También existe una solución hardware: el chip XL BOSS de Allen MacroWare.
El subprograma DDT del ensamblador MAC/65 de la compañía OSS es una herramienta excelente para examinar la memoria, especialmente porque permite visualizar y desensamblar el código ASCII que ésta contiene. Permite escribir directamente en la memoria o saltar a cualquier ubicación. Lo usé constantemente mientras escribía este capítulo.
A menos que se indique lo contrario, este material se aplica a todos los modelos XL y XE (al igual que gran parte de la sección anterior del libro). Las ubicaciones de la RAM, los vectores de interrupción y del Sistema Operativo se mantendrán iguales en todos los sistemas. Sin embargo, la ubicación y el contenido de las rutinas a las que apuntan pueden variar entre computadoras. No todas las ubicaciones de la ROM del Sistema Operativo descritas aquí serán las mismas en el 1200XL. Algunos de los cambios se refieren a vectores, no a funciones. Las referencias a las teclas de función (F1 a la F4) y a los LED son solo para usuarios del 1200XL. Mi mapa de memoria original del 1200XL apareció en el libro COMPUTE!'s Third Book of Atari.
En general, la mayoría de las ubicaciones de la RAM y del hardware de los chips GTIA, ANTIC, POKEY y PIA (ubicaciones 53248 a la 55295; $D000 a la $D7FF, excepto PORTB) no han cambiado. El paquete de coma flotante se mantiene en las ubicaciones 55296 a la 57343 ($D800 a la $DFFF), pero se han modificado sus rutinas. El cambio principal en el Sistema Operativo fue el traslado de los controladores de interrupciones desde la ROM alta al área previamente no utilizada entre las ubicaciones 49152 a la 52223 ($C000 a la $CBFF) y la adición del conjunto de caracteres internacionales en las ubicaciones 52224 a la 53247 ($CC00 a la $CFFF).
Atari promete que la serie XE mantendrá una compatibilidad total con la serie XL, siempre que el software cumpla las normas, se ajuste a los vectores y puntos de entrada oficiales publicados y no intente aprovechar alguna rutina de la ROM para ahorrar algunos bytes (véanse las ubicaciones 62026 y 62128 a continuación). El Sistema Operativo de la serie XE es el mismo que el del 800XL, al menos al momento de escribir este artículo. Cuando la rutina se mueve de ubicación en la ROM, el software falla. No culpen a Atari; han publicado este material desde el primer día. Si los desarrolladores no prestan atención, no es culpa de Atari.
Registros Eliminados
Los siguientes registros han sido eliminados por completo de las computadoras XL/XE y se han encontrado otros usos para la ubicación (se indican las ubicaciones 400/800 anteriores):
PTEMP | (31; $1F) |
LINBUF | (583-622; $247-$26E) |
CSTAT | (648; $288) |
TMPX1 | (668; $29C) |
HOLD5 | (701; $2BD) |
ADDCOR | (782; $30E) |
00 |
00 |
LNFLG |
Utilizado por los programas de depuración internos de Atari y por el Sistema Operativo durante el encendido.
01 |
01 |
NGFLAG |
Se utiliza durante las rutinas de encendido para el Self-Test; verifica si hay bytes de memoria defectuosos; cero significa falla de memoria.
07 |
07 |
CMCMD |
Indicador de comando para los módems 835 y 1030 de Atari; establecida en cualquier número distinto de 0 para pasar comandos al módem. Anteriormente era TSTDAT.
10,11 |
A,B |
DOSVEC |
Apunta a la ubicación 6047 ($179F).
12,13 |
C,D |
DOSINI |
Apunta a la ubicación 5440 ($1540).
28-31 |
11C-1F |
ABUFPT |
Uso previsto del Sistema Operativo como punteros de búfers; actualmente sin uso.
54,55 |
36,37 |
LTEMP |
Búferes temporales para las rutinas de carga de controladores de periféricos de propósito general. Estas rutinas ayudan al Sistema Operativo a gestionar nuevos controladores y periféricos que cargan los suyos. Todas las ubicaciones marcadas como utilizadas por el controlador o cargador de periféricos son de uso exclusivo del Sistema Operativo; no las utilice.
74,75 |
4A,4B |
ZCHAIN |
Registros de almacenamiento temporal para el cargador del controlador de periféricos de propósito general.
96,97 |
60,61 |
FKDEF |
El 1200XL tiene cuatro teclas de función redefinibles. FKDEF apunta (byte menos significativo/byte más significativo) a su tabla de definiciones: una tabla de 8 bytes para las teclas F1 a la F4 y luego SHIFT-F1 a SHIFT-F4. A cada byte se le asigna un valor que corresponde a un código interno (distinto de ASCII). Estas teclas tienen valores del 138 al 141 ($8A-$8D), pero no se debe asignar un valor a una tecla de estas teclas, ya que se genera un ciclo infinito. Inicialmente apunta a 64529 ($FC11).
Las teclas de función realizan las siguientes acciones:
Combinación de teclas | Función |
F1 | Cursor hacia arriba (ATASCII 28; $1C) |
F2 | Cursor hacia abajo (29; $1D) |
F3 | Cursor hacia la izquierda (30; $1E) |
F4 | Cursor hacia la derecha (31; $1F) |
Con SHIFT | |
F1 | Inicio (cursor arriba a la izquierda, 28; $1C) |
F2 | Cursor a la esquina inferior izquierda (29; $1D) |
F3 | Cursor al inicio de la línea física (30; $1E) |
F4 | Cursor al extremo derecho de la línea física (31; $1F) |
Con CONTROL | |
F1 | Activación o desactivación del teclado (Excepto las teclas de la consola) |
F2 | Habilitar/deshabilitar la visualización de la pantalla |
F3 | Activar o desactivar el sonido del clic de la tecla F3 |
F4 | Alternar conjunto de caracteres nacionales/internacionales |
Las teclas de función se ignoran con la combinación de teclas SHIFT y CONTROL. No se pueden redefinir las teclas CONTROL-función.
98 |
62 |
PALNTS |
Bandera para determinar la versión PAL o NTSC del controlador de pantalla, anteriormente en la ubicación 53268 ($D014). 0 significa estándar norteamericano.
121,122 |
79,7A |
KEYDEF |
Puntero (byte menos significativo/byte más significativo) a la tabla de definición del teclado. Su valor inicial es 64337 ($FB51), donde reside la tabla del teclado del sistema. Puede redefinir el teclado escribiendo una tabla de 192 bytes y poniendo su dirección aquí. La tabla consta de 3 partes de 64 bytes: teclas minúsculas, teclas con la tecla SHIFT, y teclas con la tecla CONTROL. La tabla del sistema tiene las siguientes asignaciones:
Byte | Tecla | Byte | Tecla | |
00 | 1 | 32 | , | |
01 | j | 33 | Espacio | |
02 | ; | 34 | . | |
03 | F1 (1200XL) | 35 | n | |
04 | F2 (1200XL) | 36 | (128) | |
05 | k | 37 | m | |
06 | + | 38 | / | |
07 | * | 39 | Tecla Video Inverso (114) | |
08 | o | 40 | r | |
09 | (128; vea más abajo) | 41 | (128) | |
10 | p | 42 | e | |
11 | u | 43 | y | |
12 | RETURN | 44 | TAB | |
13 | i | 45 | t | |
14 | - | 46 | w | |
15 | = | 47 | q | |
16 | v | 48 | 9 | |
17 | HELP (128) | 49 | (128) | |
18 | c | 50 | 0 | |
19 | F3 (1200XL) | 51 | 7 | |
20 | F4 (1200XL) | 52 | BACKSPACE | |
21 | b | 53 | 8 | |
22 | x | 54 | < | |
23 | z | 55 | > | |
24 | 4 | 56 | f | |
25 | (128) | 57 | h | |
26 | 3 | 58 | d | |
27 | 6 | 59 | (128) | |
28 | ESC | 60 | CAPS (130) | |
29 | 5 | 61 | g | |
30 | 2 | 62 | s | |
31 | 1 | 63 | a |
Los siguientes 64 bytes contienen los caracteres desplazados (shifted) (por ejemplo, "a" es A, "5" es %; observe los caracteres superiores de su teclado). Los siguientes 64 bytes son caracteres de la tecla CONTROL (muchos caracteres gráficos). Debe crear una tabla para los 192 bytes, aunque solo necesite cambiar la asignación de teclas para algunos caracteres específicos. Use los valores ATASCII al escribir la tabla.
Varios valores tienen un significado específico para el decodificador del teclado del XL:
Dec/Hex | Uso |
128/80 | No utilizado; combinación inválida |
129/81 | Salida en video inverso |
130/82 | Alternar entre mayúsculas y minúsculas |
131/83 | Bloqueo de la tecla SHIFT |
132/84 | Bloqueo de la tecla CONTROL |
133/85 | Fin de archivo (EOF - End of File) |
137/89 | Alternar clic del teclado |
138-141/8A-8D | Teclas de función F1-F4 (solo 1200XL) o: |
cursor hacia arriba (ATASCII 28; $1C) | |
cursor hacia abajo (ATASCII 30; $1D) | |
cursor a la izquierda (ATASCII 31; $1E) | |
cursor a la derecha (ATASCII 32; $1F) | |
142/8E | Cursor al inicio (esquina superior izquierda de la pantalla) |
143/8F | Cursor a la esquina inferior izquierda |
144/90 | Cursor al margen izquierdo (1200) |
145/91 | Cursor al margen derecho (1200) |
No se pueden redefinir las teclas BREAK, SHIFT, CONTROL ni las teclas de la consola (ni las asignaciones de las teclas de CONTROL-función en el 1200XL). El Addenda del 1200XL ofrece una asignación de teclado Dvorak que se guarda fácilmente en la memoria. La dirección de la tabla del sistema se devuelve a la RAM al encender o reiniciar el equipo.
128,129 |
80,81 |
LOMEM |
Apunta a la ubicación 7676 ($1DFC1).
1 En el libro original, dice $$1DFC en vez de $1DFC. (N. del T.)
512-551 |
200-227 |
Vectores de las interrupciones |
Las ubicaciones de los vectores y sus funciones siguen siendo las mismas, pero ahora apuntan a diferentes ubicaciones en la memoria del Sistema Operativo:
Vector | Hex | Etiqueta | Apunta a |
512,513 | 200,201 | VDSLST | 49358 ($C0CE) |
514,515 | 202,203 | VPRCED | 49357 ($C0CD) |
516,517 | 204,205 | VINTER | 49357 ($C0CD) |
518,519 | 206,207 | VBREAK | 49357 ($C0CD) |
520,521 | 208,209 | VKEYBD | 64537 ($FC19) |
522,523 | 20A,20B | VSERIN | 6691 ($1A23) |
524,525 | 20C,20D | VSEROR | 6630 ($19E6) |
526,527 | 20E,20F | VSEROC | 60140 ($EAEC) |
528,529 | 210,211 | VTIMR1 | 49357 ($C0CD) |
530,531 | 212,213 | VTIMR2 | 49357 ($C0CD) |
532,533 | 214,215 | VTIMR3 | 49357 ($C0CD) |
534,535 | 216,217 | VIMIRQ | 49200 ($C030) |
546,547 | 222,223 | VVBLKI | 49378 ($C0E2) |
548,549 | 224,225 | VVBLKD | 49802 ($C28A) |
550,551 | 226,227 | CDTMA1 | 60433 ($EC11) |
El Sistema Operativo fue reescrito en los modelos XL/XE, moviendo los controladores de interrupciones a la región previamente no utilizada 49152-53247 ($C000-$CFFF).
563 |
233 |
LCOUNT |
Contador temporal para el cargador del controlador periférico.
566,567 |
236,237 |
BRKKY |
Ahora apunta a la ubicación 49298 ($C092).
568,569 |
238,239 |
RELADR(1200XL) |
VPIRQ (Todos los XL/XE excepto 1200XL) |
Anteriormente bytes sobrantes, ahora corresponde a la dirección de la rutina reubicable del cargador en el 1200XL y el vector para solicitudes de interrupción del bus paralelo en todos los XL/XE, excepto el 1200XL (donde apunta a una rutina en la ubicación 51566; $C96E) - el vector genérico para cualquier dispositivo paralelo inicializado.
581 |
245 |
RECLEN |
Variable de rutina del cargador reubicable para la longitud del registro.
583-618 |
$247-$26A |
.... |
Reservado (sin uso) en el 1200XL.
583 |
247 |
PDVMSK |
Máscara del registro sombra del registro de selección de dispositivo en la ubicación 53759 ($D1FF; activa solo cuando el Sistema Operativo deselecciona la ROM de coma flotante escribiendo en esa dirección). Se pueden tener hasta 8 dispositivos funcionando en paralelo a través del bus; cada bit de este registro corresponde a un dispositivo. La máscara debe configurarse para el dispositivo correcto antes de que el Sistema Operativo permita el envío de una IRQ a dicho dispositivo.
584 |
248 |
SHPDVS |
Registro sombra para el registro de bus paralelo; cada bit representa uno de los 8 dispositivos paralelos. Permite que el Sistema Operativo dé servicio a las VBI mientras ejecuta el dispositivo enmascarado por este bit.
585 |
249 |
PDMSK |
Máscara de interrupción del bus paralelo; permite que el Sistema Operativo atienda las IRQ del dispositivo que ha sido enmascarado por el bit de este registro. Vea la ubicación de arriba.
586,587 |
24A,24B |
RELADR |
Dirección relativa del cargador reubicable.
588,589 |
24C,24D |
PPTMPA,PPTMPX |
Registros de almacenamiento temporal de un byte para el cargador reubicable.
590-618 |
24E-26A |
.... |
Bytes sobrantes, reservados para uso futuro.
619 |
26B |
CHSALT |
Puntero del conjunto de caracteres alternativo para el 1200XL, inicializado en 204 ($CC) para indicar al conjunto de caracteres internacionales como el siguiente conjunto que se mostrará al alternar entre pulsaciones de las teclas CONTROL+F4. El XL tiene dos conjuntos de caracteres internos: uno en la ubicación 52224 ($CC00) y el otro en la ubicación 57344 ($E000).
620 |
26C |
VSFLAG |
Registro temporal de desplazamiento (scroll) fino.
621 |
26D |
KEYDIS |
Desactivación del teclado. Haga POKE en esta ubicación con 255 para desactivar el teclado, o con 0 para reactivarlo. Si se bloquea, debe pulsar la tecla RESET (todos los XL/XE excepto el 1200XL) para recuperar el control. Los usuarios del 1200XL pueden pulsar las teclas CONTROL-F1 (activa y desactiva el teclado; el LED 1 se enciende cuando el teclado está desactivado).
622 |
26E |
FINE |
Habilitar desplazamiento (scroll) fino para el modo gráfico 0 (texto); Haga POKE en esta ubicación con un 0 para el desplazamiento grueso (predeterminado) y 255 ($FF) para el desplazamiento fino. Después de este POKE, haga GR.0 o un OPEN para el dispositivo E:. Intente listar un programa largo: ¡es lento y fluido! La Lista de Despliegue para el desplazamiento fino es un byte más larga que para desplazamiento grueso. El Sistema Operativo coloca la dirección (64708; $FCC4) de una interrupción de Lista de Despliegue (DLI) en las ubicaciones 512 y 513 ($200 y 201), reemplazando cualquier otro valor que pudiera haber colocado allí. El registro de color en la ubicación 53271 ($D017) se modifica para la última línea visible de la pantalla.
Si activa el desplazamiento fino y accede inmediatamente a DOS, verá que sigue activado al copiar a la pantalla o al directorio del disco. Jerry White escribió un artículo que muestra el desplazamiento fino y otras funciones del XL en la revista Analog de febrero de 1984.
628-631 |
272-277 |
PADDL4-7 |
El XL tiene solo 2 puertos, por lo que solo los paddles del #0 al #3 están activos.
634-635 |
27A-27B |
STICK2-3 |
Ya no se utiliza porque solo hay puertos para los joysticks #0 y #1. El proceso VBLANK del Sistema Operativo ahora copia los valores del joystick PORTA (0-1) y de los paddles (0-3) en los registros sombra de PORTB de modo que STICK0 afecta tanto a STICK0 como a STICK2, STICK1 afecta a STICK1 y STICK3, PADDL0 afecta a PADDL0 y PADDL4, y así sucesivamente.
640-643 |
280-283 |
PTRIG4-7 |
Sin uso (Vea PADDL4-7).
646-647 |
286-287 |
STRIG2-3 |
Sin uso (Vea STICK2-3).
648 |
288 |
HIBYTE |
Registro del byte alto para la rutina del cargador reubicable.
651 |
28B |
IMASK |
Sin uso.
652 |
28C |
JVECK |
Vector de salto temporal; sin uso.
654,655 |
28E,28F |
NEWADR |
Utilizado por el cargador reubicable; nuevo vector de dirección.
668 |
29C |
CRETRY |
Número de reintentos del comando: originalmente en la ubicación 54 ($36) en los computadores 400/800.
701 |
2BD |
DRETRY |
Número de reintentos del dispositivo: originalmente en la ubicación 55 ($37) en los computadores 400/800.
713,714 |
2C9,2CA |
RUNADR |
Registro de dirección de ejecución para la rutina del cargador reubicable.
715,716 |
2CB,2CC |
HIUSED |
Utilizado por las rutinas del cargador reubicable.
717,718 |
2CD,2CE |
ZHIUSE |
Utilizado por las rutinas del cargador reubicable.
719,720 |
2CF,2D0 |
GBYTEA |
Utilizado por las rutinas del cargador reubicable.
721,722 |
2D1,2D2 |
LOADAD |
Utilizado por las rutinas del cargador reubicable.
723,724 |
2D3,2D4 |
ZLOADA |
Utilizado por las rutinas del cargador reubicable.
725,726 |
2D5,2D6 |
DSCTLN |
Registro de tamaño de sector de disco; el valor predeterminado es 128 ($80) bytes, pero se puede modificar a una longitud de entre 0 y 65535 ($FFFF). Sin embargo, es posible que su unidad no permita otros tamaños.
717,718 |
2D7,2D8 |
ACMISR |
Dirección de rutina de servicio de interrupción; sin uso.
729 |
2D9 |
KRPDEL |
Velocidad de retardo automático: el tiempo transcurrido antes de que comience la repetición del teclado. Inicialmente configurado en 48 ($30; $28 para los equipos PAL) para 0,8 segundos; puede ajustarlo con el número de intervalos VBLANK (1/60 de segundo cada uno) antes de que comience la repetición. Un valor de 60 corresponde a un retardo de 1 segundo. Un valor de 0 significa que no hay repetición.
730 |
2DA |
KEYREP |
La velocidad de repetición; el valor predeterminado es 6, lo que significa 10 caracteres por segundo (uno cada 6 intervalos VBLANK después del retardo indicado). Ajuste el número de intervalos VBLANK entre repeticiones; con un valor de 1, obtendrá 60 caracteres por segundo (50 en sistemas PAL). Un valor de 0 proporciona solo una repetición de tecla por pulsación.
731 |
2DB |
NOCLIK |
Este es el registro de desactivación de los clics del teclado; haga POKE en esta ubicación usando cualquier número distinto de 0 para desactivar el molesto sonido del teclado que se produce en el televisor. Haga POKE con 0 en esta ubicación para activar el sonido. En el 1200XL, CONTROL+F3 también activa el sonido.
732 |
2DC |
HELPFG |
Registro que contiene el estado de la tecla HELP; 17 significa que se presionó sola, 81 significa que se presionó junto con la tecla SHIFT y 145 con la tecla CONTROL. Este registro solo se puede borrar bajo control del programa haciendo POKE con 0 en esta ubicación. De lo contrario, el Sistema Operativo lo ignora.
733 |
2DD |
DMASAV |
En el 1200XL, al presionar CONTROL-F2 para desactivar la pantalla, esta ubicación almacena el valor de la ubicación DMA (559;$22F). En todos los computadores XL/XE, excepto el 1200XL, si se hace POKE 559,0 para desactivar la pantalla, el valor no se guarda en la ubicación 733. Sin embargo, si se hace POKE en la ubicación 733 con el valor de la ubicación DMA (normalmente 34), al presionar la siguiente tecla, la pantalla se activará de nuevo automáticamente.
734 |
2DE |
PBPNT |
Puntero del búfer de impresión; originalmente en la ubicación 29 ($1D) en los computadores 400/800.
735 |
2DF |
PBUFSZ |
Tamaño del búfer de impresión: originalmente en la ubicación 30 ($1E) en los computadores 400/800.
745 |
2E9 |
HNDLOD |
Bandera del controlador de la rutina del cargador reubicable.
746-749 |
2EA-2ED |
DVSTAT |
Registros de estado de dispositivo adicionales que contienen la información que el periférico devuelve al computador tras los nuevos sondeos del tipo 3 y 4. Los bytes contienen:
746/747 byte menos significativo/byte más significativo del tamaño del controlador (debe ser un número par)
748 Dirección SIO del dispositivo que se utilizará para la carga
749 Número de revisión del dispositivo periférico
Los nuevos tipos de sondeo se explican detalladamente en el manual del Sistema Operativo del 1200XL; los tipos de sondeo anteriores se describen en el manual de hardware del 400/800. Básicamente, el tipo 3 es un sondeo de tipo "¿estás ahí?" (dirección del dispositivo $4F, byte de comando $40, AUX1 $4F, AUX2 $4F, suma de comprobación normal), y el sondeo 4 es un sondeo nulo (valores $4F, $40, $4E y $4E, respectivamente; suma de comprobación normal).
756 |
2F4 |
CHBAS |
Selección del conjunto de caracteres; el valor predeterminado es 224. El conjunto internacional se puede seleccionar haciendo POKE 756,204 ($CC). En el 1200XL, el valor de CHBAS se intercambia con el de CHSALT (619; $26B) al usar CONTROL+F4 para alternar entre los conjuntos de caracteres alternativos. Los valores de ambos registros se intercambian y el LED 2 se enciende.
757 |
2F5 |
NEWROW |
Originalmente 96 ($60) en los computadores 400/800.
758,759 |
2F6,2F7 |
NEWCOL |
Originalmente en las ubicaciones 97,98 ($61,$62) en los computadores 400/800.
760 |
2F8 |
ROWINC |
Originalmente 121 ($79) en los computadores 400/800.
761 |
2F9 |
COLINC |
Originalmente 122 ($7A) en los computadores 400/800.
782 |
30E |
JMPERS |
Almacenamiento para los jumpers (puentes) de opciones de hardware del 1200XL, diseñado para indicar la configuración del sistema al Sistema Operativo. Si el bit 0 (POT 4) no está configurado (es igual a 0), se ejecutará el Self-Test. Los bits 1 al 7 no se utilizan. Solo se utilizan en el 1200XL.
787 |
313 |
TEMP2 |
Registro de almacenamiento temporal de un byte.
788 |
314 |
PTIMOT |
Originalmente en la ubicación ($1C) en los computadores 400/800. Mismo valor inicial (30).
829-831 |
33D-33F |
PUPBT1-3 |
Registros 1 al 3 de la validación de encendido y reinicio. Se utilizan en el arranque en caliente para verificar la integridad de la memoria. El Sistema Operativo inicializa estas ubicaciones en 92 ($5C), 147 ($93) y 37 ($25), respectivamente. Al pulsar la tecla RESET, se comprueban estos bytes y, si coinciden con los inicializados, se realiza un arranque en caliente; de lo contrario, se realiza un arranque en frío.
838,839 |
346,347 |
IOCB0 |
Para enviar la salida a la impresora, haga POKE 838,202 y POKE 839,254. Para apagar la impresora y enviar todo de vuelta a la pantalla, haga POKE 838,175 y POKE 839,242. Este programa de Matt Ratcliff permite alternar entre la salida de la impresora y la pantalla pulsando la tecla SELECT (funciona igual de bien en los computadores 400/800):
10 DIM A$(1):CONSOL=53279:GRAPHICS 0:IOCB0E=838 20 PHDLR=58422 30 EHDLR=58374 40 PL=PEEK(PHDLR):PH=PEEK(PHDLR+1) 50 EL=PEEK(EHDLR):EH=PEEK(EHDLR+1) 60 PRINT "El texto se imprime de manera continua" 70 PRINT "Presione SELECT para alternar entre" 80 PRINT "salida por impresora y pantalla.":? 90 PRINT "Prepare su impresora y presione RETURN" 100 INPUT A$:I=1:DIR=0 110 PRINT I;" Presione select para cambiar salida.":I=I+1 120 IF PEEK(CONSOL)<>5 THEN 110 130 IF DIR THEN POKE IOCB0E,EL:POKE IOCB0E+1,EH 140 IF NOT DIR THEN POKE IOCB0E,PL:POKE IOCB0E+1,PH 150 DIR= NOT DIR 160 IF PEEK(CONSOL)<>7 THEN 160 170 GOTO 110
1000 |
3E8 |
SUPERF |
Registro del editor de pantalla; se borra al ingresar a la rutina "poner byte", el editor cambia los códigos de teclas 142 y 145 ($8E y $91) a 28 y 31 ($1C y $1F; vea la ubicación 121; $79) y establece SUPERF en un valor distinto de 0.
1001 |
3E9 |
CKEY |
Originalmente en la ubicación ($4A) en los computadores 400/800.
1002 |
3EA |
CASSBT |
Originalmente en la ubicación 75 ($4B) en los computadores 400/800.
1003 |
3EB |
CARTCK |
Suma de comprobación del cartucho. Suma de comprobación de la Página Uno del cartucho. La suma de comprobación se recalcula cada VBLANK y se compara con este registro. Si no es la misma, el Sistema Operativo asume que el cartucho ya no está (se extrajo) y realiza un arranque en frío; solo para 1200XL.
1004 |
3EC |
DERRF |
Bandera de error de pantalla abierta; si es igual a 0, entonces no hay error; si es distinto de 0, entonces el Sistema Operativo no puede inicializar el editor de pantalla.
1005-1015 |
3ED-3F7 |
ACMVAR |
Reservado para las variables del Sistema Operativo; durante el encendido o el arranque en frío, todas las variables entre las ubicaciones 1005 y 1023 ($3ED y $3FF), inclusive, se establecen en 0, pero no se modifican durante el arranque en caliente.
1016 |
3F8 |
BASICF |
Registro sombra del estado actual del BASIC. 0 significa que la ROM del BASIC está habilitada; un valor distinto de 0 significa que no lo está. Debe estar sincronizado con la desactivación de la ROM del BASIC. Para desactivar BASIC, configure BASICF en un valor distinto de 0 y realice un arranque en caliente (pulse la tecla RESET); el DOS cargará y le indicará que no hay cartucho presente al intentar volver al BASIC.
1017 |
3F9 |
MINTLK |
Sin uso.
1018 |
3FA |
GINTLK |
Registro entrelazado (interlock) del cartucho; complemento de la ubicación BASICF, un poco más arriba. Es igual a 1 cuando hay un cartucho externo instalado, e igual a 0 cuando no lo hay (o si se usa la ROM del BASIC). El valor de TRIG3 (53267; $D103) se carga aquí mediante la rutina de inicialización del Sistema Operativo. Si en algún momento se extrae el cartucho externo, el sistema se bloqueará.
1019,1020 |
3FB,3FC |
CHLINK |
Uso de la cadena de controladores reubicables; permite encadenar partes de rutinas de controladores.
1792-7419 |
700-1CFB |
.... |
Utilizado por DOS cuando éste se carga; de lo contrario, disponible como RAM libre.
3889 |
F31 |
DOS 3 |
Si hace PEEK en esta ubicación y se observa el valor 76 ($4C), entonces tiene una versión anterior de DOS 3 (la última versión mostrará 78). Para corregir algunos errores en los archivos FMS anteriores, escriba lo siguiente:
10 FOR N=1 A 9:READ A,B:POKE A,B:NEXT N 20 DATA 3889,78,3923,78,3943,78,3929,76,3895,76 30 DATA 3901,77,3935,77,3955,77,2117,240
Mejor aún, consígase el DOS 2.5 de Atari (compatible con discos de doble densidad y el disco RAM del 130XE). DOS 3.0 guarda en bloques, no en sectores, con un mínimo de 1.000 bytes por bloque. Si escribe un programa de 1.001 bytes, se guardan 2.000 bytes, desperdiciando 999 bytes en el disco.
20480-22527 |
$5000-$57FF |
ROM del Self-Test |
ROM del Self-Test, cuando está habilitado; controlado por el bit 7 de la ubicación PORTB (54017; $D301). El código del Self-Test se encuentra en un área especial de la ROM debajo del área de los chips GTIA, POKEY y ANTIC (a partir de la ubicación 53248; $D3000) y se traslada (reasigna) aquí al escribir BYE en BASIC o al usar POKE en el puerto B con el valor correcto y hacer JMP (o USR) al vector de inicialización (véase las ubicaciones 58481; $E471 y 58496 a la 58499, $E480 a la $E483). Corresponde a memoria RAM cuando el Self-Test no está habilitado.
39967-40959 |
9C1F-9FFF |
.... |
Lista de Despliegue y RAM de pantalla, movidas a la memoria inferior si un cartucho tiene 16K (usando RAM de 32767 a 49151 también).
43234 |
A8E2 |
ROM del BASIC |
Si hace PEEK en esta ubicación y obtiene el valor 96 ($60), tiene la Revisión B de la ROM del BASIC. Lo que necesita es la Revisión C. ¡B significa errores (Bugs)! Consulte el Apéndice 13 sobre mejoras y errores. Si obtiene el valor 234 ($EA), tiene la Revisión C. Aporte de Matt Ratcliff.
Puede desactivar BASIC al acceder a DOS y haciendo POKE en esta ubicación con el valor 1016 ($3F8) y luego presionando la tecla RESET. El problema es volver a activarlo desde DOS en lugar de reiniciar el sistema. Hay un programa de dominio público de Matt Ratcliff en el BBS Gateway que hace esto automáticamente.
Introducción a la ROM del Sistema Operativo
Atari modificó la nueva ROM del los XL/XE a partir de la Revisión B. Atari mantuvo el controlador y los vectores de interrupción, aunque cambiaron las rutinas a las que apuntan. Atari elaboró un listado del código fuente del Sistema Operativo XL, aunque por alguna razón nunca se publicó para la venta pública, tal como estaba previsto. Puede que ya esté disponible a través de Atari: escriba y solicítelo. Es un excelente recurso de más de 500 páginas.
49152-52223 |
C000-CBFF |
Controladores de las interrupciones |
ROM del Sistema Operativo. En los computadores 400/800, el bloque entre las ubicaciones 49152 y 53247 no se utiliza. Ahora, esta área contiene muchos de los controladores de las interrupciones (referenciados por los vectores de la Página Dos). Algunos programas de los computadores 400/800 comprueban ciertos valores en estas ubicaciones y no se ejecutan si no los encuentran. En ese caso, utilice el disco Translator (con el Sistema Operativo del 400/800 instalado; el área entre las ubicaciones $C000 y $CEFF se convierte en RAM accesible para el usuario). El área entre las ubicaciones 52069 ($CB65) y 52223 ($CBFF) está vacía (solo ceros).
Muchas interrupciones están configuradas para saltar a la ubicación 49357 o 49358 ($C0CD o $C0CE). La primera contiene una instrucción PLA seguida de una RTI. El resultado final es un simple retorno al programa sin ninguna otra actividad. Los bytes 49152 al 49163 ($C000 al $C00B) se utilizan para identificar la computadora y la ROM en el bloque $C000-$DFFF:
Byte | Uso |
49152-3/C000-1 | Suma de comprobación (byte menos significativo/byte más significativo) de todos los bytes de la ROM excepto los propios bytes de la suma de comprobación. |
49154/C002 | Fecha de la revisión, almacenada en formato DDMMYY. El día, DD, generalmente es igual a $10. |
49155/C003 | Mes de la fecha de la revisión; generalmente es igual a $05. |
49156/C004 | Año de la fecha de la revisión; generalmente es igual a $83. |
49157/C005 | Byte de opción reservada; igual a 0 para el 1200XL, el 800XL y el 130XE. |
49158/C006 | Número de pieza en formato AANNNNNN; AA es un carácter ASCII y NNNNNN es un número BCD de cuatro bits. Este es el byte A1. |
49159-62/C007-A | Número de pieza, bytes A2, N1-N6 (cada byte tiene 2 valores N de 4 bits cada uno). |
49163-C00B | Número de revisión. Mis modelos 800XL y 130XE devuelven 2 en esta ubicación. |
49164/C00C | Inicialización del controlador de interrupciones |
49176/C018 | Inicialización de la NMI |
Controladores de las interrupciones y otras rutinas en el bloque $C000:
Entrada | Controlador o Uso |
49196/C02C | Procesador de las IRQ |
49298/C092 | IRQ de la tecla BREAK |
49312/C0A0 | Continuar el procesamiento de la IRQ |
49359/C0CF | Tabla de tipos y desplazamientos de las IRQ (16 bytes) |
49378/C0E2 | Procesamiento de la NMI del VBLANK inmediato |
49743/C24F | Procesar el vencimiento de la cuenta regresiva del temporizador #1 |
49890/C2E2 | Procesar el vencimiento de la cuenta regresiva del temporizador #2 |
49749/C255 | Decremento de la cuenta regresiva del temporizador |
49778/C272 | Establecimiento de parámetros de VBLANK |
49802/C28A | Procesamiento de la NMI del VBLANK diferido |
49808/C290 | Arranque en caliente |
49834/C2AA | Procesamiento de RESET |
49864/C2C8 | Arranque en frío |
49866/C2CA | Memoria preestablecida (continuación del arranque en frío y en caliente) |
50217/C429 | Inicialización del software del cartucho |
50220/C42C | Procesamiento de la interrupción ACMI |
50237/C43D | Mensaje BOOT ERROR |
50248/C448 | Especificación del editor de pantalla (E:) |
50251/C44B | Tabla de vectores del controlador de interrupciones (mismo orden que los vectores de la RAM en las ubicaciones 512 a la 549 ($200 a la $225) |
50289/C471 | Rutinas de inicialización diversas: Estado de la tecla OPTION comprobado en la ubicación 50330 ($C49A); BASIC habilitado en 50337 ($C4A1) |
50394/C4DA | Inicialización del hardware |
50485/C535 | Inicialización de variables de software y RAM |
50571/C58B | Intentar arrancar del disco |
50619/C5BB | Arrancar e inicializar el disco |
50633/C5C9 | Completar el arranque e inicializar |
50729/C629 | Ejecutar el cargador de arranque |
50747/C63B | Inicializar el software de arranque |
50750/C63E | Mostrar mensaje BOOT ERROR |
50777/C659 | Obtener la rutina del siguiente sector |
50798/C66E | Intentar arrancar del cassette |
50851/C6A3 | Inicializar DIO (Disk Input/Output - Entrada/Salida del disco) |
50867/C6B3 | E/S del disco (DIO) |
51002/C73A | Establecer dirección de búfer |
51013/C745 | Reubicar rutina reubicable a nueva dirección |
51093/C795 | Gestionar tipo de registro final |
51151/C7CF | Obtener byte |
51154/C7D2 | Ejecutar "ejecutar en la dirección" |
51157/C7D5 | Gestionar registro de texto |
51281/C851 | Reubicar texto en memoria |
51309/C86D | Manejar tipo de registro de referencia de palabra (word) |
51346/C892 | Manejar tipos de registro de un byte y de byte bajo |
51452/C8FC | Seleccionar y ejecutar Self-Test |
51468/C90C | Inicializar dispositivo paralelo genérico |
51507/C933 | PIO: E/S del dispositivo paralelo; las tablas de vectores PIO (consulte la ubicación 58368, $E400) comienzan en la ubicación 51601 ($C991) |
51631/C9AF | Seleccionar el siguiente dispositivo paralelo |
51658/C9CA | Invocar controlador de dispositivo paralelo |
51753/CA29 | Cargar e inicializar el controlador periférico |
51799/CA57 | Inicio del desplazamiento y textos del Self-Test (utiliza valores hardware para la visualización de caracteres) |
52054/CB56 | Tabla de vinculación de suma de comprobación |
52224-53247 |
CC00-CFFF |
CHARSET2 |
Juego de caracteres internacionales, estructurado de la misma manera que el juego de caracteres estándar de la ubicación 57344 (E000). La serie XL incluye 2 juegos de caracteres, y se puede cambiar entre ellos haciendo POKE 756,224 (estándar) o POKE 756,204 (internacional).
53279 |
D01F |
CONSOL |
Si mantiene presionada la tecla OPTION al iniciar una aplicación en el computador XL, se deshabilita el BASIC (pero ningún otro cartucho), lo que permite que el espacio de memoria se use para aplicaciones. Por lo general, debe mantener la tecla presionada solo durante los primeros segundos del arranque.
53504-53759 |
D100-D1FF |
.... |
Esta área, que el Sistema Operativo no utiliza en los modelos 400/800 ni XL, se desactiva cuando se selecciona un dispositivo externo conectado al bus de expansión y se activa la memoria del dispositivo. La situación se invierte cuando se completa la E/S del dispositivo.
Ubicación | Hexadecimal | Uso |
53504-53758 | D100-D1FE | Registros del dispositivo |
53504 | D100 | Registro hardware para obtener y poner un byte (HWGET, HWPUT); los datos del dispositivo que se encuentran en el bus se almacenan aquí. |
53505 | D101 | Reinicio del hardware y registro de estado (HWRSET para escritura; esto reinicia el registro de obtener y poner un byte; HWSTAT para lectura). |
53759 | D1FF | Registro de selección de hardware. Su registro sombra es el byte 583 ($247). El bit 0 corresponde al dispositivo 0, el bit 1 al dispositivo 1, y así sucesivamente. Escribir en este byte deselecciona la ROM del paquete FP y selecciona la ROM del dispositivo (intente visualizar esta y las ubicaciones subsiguientes con el DDT de MAC/65 o una herramienta similar mientras modifica la ubicación $D1FF). |
54017 |
D301 |
PORTB |
Dado que las series XL y XE ya no tienen un PORT B (en los modelos 400/800 este controla los puertos de joystick #3 y #4), este registro se utiliza para el control de LED (sólo 1200XL) y la gestión de memoria.
Puede desactivar la ROM entre las ubicaciones 49152 a la 53247 ($C000 a la $CFFF) y 55296 a la 65535 ($D800 a la $FFFF) estableciendo en 0 el bit 0 (el área de la ROM se convierte en RAM; tenga en cuenta que el área entre $D000 y $D7FF permanece intacta). Sin embargo, a menos que se haya proporcionado otro Sistema Operativo, el sistema se bloqueará en la siguiente interrupción (¡1/60 de segundo después!), por lo que primero debe desactivar las interrupciones.
El bit 1 controla el BASIC; si es igual a 0, BASIC está habilitado; si es igual a 1, está deshabilitado y los 8K de RAM están disponibles para el uso del programa. Si deshabilita BASIC dentro de un programa BASIC, se bloquea. Deshabilite BASIC durante el arranque manteniendo presionada la tecla OPTION.
Los bits 2 y 3 controlan los LEDs del modelo 1200XL; 0 significa encendido, 1 significa apagado.
El LED #1 indica que el teclado está desactivado; el LED #2 indica que se seleccionó el conjunto de caracteres internacionales. En el modelo 130XE, estos bits se utilizan para la conmutación de bancos (bank switching) de 16 KB de RAM. El 130XE permite usar la memoria adicional como memoria de vídeo o memoria de programa o datos. Consulte la sección sobre gestión de memoria del 130XE al final de este capítulo.
Los bits 4 al 6 están reservados (sin uso) en los modelos XL y 65XE. Los bits 4 y 5 en el modelo 130XE se utilizan para habilitar la conmutación de bancos de memoria (vea más abajo).
El bit 7 controla la región de la RAM desde la ubicación 20480 a la 22527 ($5000 a la $57FF), normalmente habilitada (igual a 1). Cuando está deshabilitada (igual a 0), se habilita la ROM del Sistema Operativo en esa área y el acceso al código del Self-Test se traslada de la ubicación 53248 a la 55295 ($D000 a la $D7FF).
Pruebe esto: Haga POKE 54017,PEEK(54017)-128 para activar el Self-Test de la ROM. Ahora escriba X=USR(20480). Aparece la pantalla del Self-Test. La RAM se reinicia al encender o al arrancar en caliente. Por supuesto, también puede escribir BYE para acceder a las rutinas del test.
Aquí tiene un programa de Joe Miller de Koala Technologies que copia partes (omite el bloque $D000-$D7FF) del Sistema Operativo en la RAM, desactiva la ROM y luego mueve la parte copiada hacia atrás en la memoria:
100 REM RAMROM - Instala en un computador XL 110 REM el Sistema Operativo basado en RAM 120 REM por Joe Miller 130 REM 23 de Marzo de 1985 190 PRINT "MOVIENDO EL SISTEMA OPERATIVO A LA RAM" 200 FOR I=1536 TO 1635 210 READ B:POKE I,B:NEXT I 220 B=USR(1536) 230 PRINT CHR$(125) 240 PRINT "SISTEMA OPERATIVO INSTALADO EN LA RAM" 250 PRINT "PRESIONE RETURN PARA COMPROBARLO" 260 PRINT :PRINT :PRINT 270 PRINT "POKE 57344,1" 275 PRINT " $E000=1":PRINT 280 PRINT "POKE 57344,0" 290 POSITION 1,4 300 DATA 169,0,133,203,133,205,169 310 DATA 192,133,204,169,64,133,206 320 DATA 160,0,177,203,145,205,200 330 DATA 208,249,230,206,230,204,240 340 DATA 12,165,204,201,208,208,237 350 DATA 169,216,133,204,208,231,8 360 DATA 120,173,14,212,72,169,0 370 DATA 141,14,212,173,1,211,41 380 DATA 254,141,1,211,169,192,133 390 DATA 206,169,64,133,204,177,203 400 DATA 145,205,200,208,249,230,204 410 DATA 230,206,240,12,165,206,201 420 DATA 208,208,237,169,216,133,206 430 DATA 208,231,104,141,14,212,40 440 DATA 104,96
Puede convertir esto en un archivo AUTORUN.SYS en lenguaje máquina cambiando el ciclo a 1634, eliminando el número 104 de la línea 440 y eliminando la llamada USR de la línea 220. Vaya al DOS y guarde en un archivo binario (opción K) el contenido de las direcciones $600 a la $662, con la dirección de ejecución igual a $600. Esto cambiará su Sistema Operativo de la ROM a la RAM cada vez que inicie ese disco. Al pulsar la tecla RESET, el Sistema Operativo vuelve a la ROM. El código fuente en lenguaje máquina de este breve programa (también de Joe Miller) se incluye aquí porque consideré importante que los programadores en lenguaje máquina vieran cómo se hace:
;Mueve a la RAM el Sistema Operativo del modelo XL ; ;RAMROM: Instala en la RAM el Sistema ; Operativo basado en ROM del modelo XL, ; en el mismo espacio de direcciones. ; Esto resulta útil para realizar pequeñas ; modificaciones al sistema operativo o ; para experimentar con nuevos conceptos ; de diseño, como multitarea, la gestión ; de ventanas, etc. ; ; Por Joe Miller. ; ;Esta version se configura como ;un archivo AUTORUN.SYS. ; ORIGEN EQU $CB ;usar Página Cero DESTINO EQU ORIGEN+2 INICIO EQU $0600 ;direccion de comienzo OSROM EQU $C000 ;direccion de comienzo del OS en ROM OSRAM EQU $4000 ;direccion del DESTINOino en la ROM NMIEN EQU $D40E ;registro de habilitacion de NMI PORTB EQU $D301 ;bloqueo del control de la admin. de memoria ORG INICIO LDA #low OSROM STA ORIGEN STA DESTINO ;direcciones de inicializacion de la copia LDA #high OSROM STA ORIGEN+1 LDA #high OSRAM STA DESTINO+l LDY #0 ;Repetir Paso1 LDA (ORIGEN),Y ;copiar ROM a la RAM STA (DESTINO),Y INY BNE Paso1 INC DESTINO+1 INC ORIGEN+1 BEQ Swap ;Si termina LDA ORIGEN+l CMP #$D0 BNE Paso1 ;saltar bloque de 2K en la ubicacion $D000 LDA #$D8 STA ORIGEN+1 BNE Paso1 ;Hasta que ORIGEN = $0000 Swap PHP ;guardar el estado del procesador SEI ;deshabilitar IRQs LDA NMIEN PHA ;guardar NMIEN LDA #0 STA NMIEN ;deshabilitar NMIs LDA PORTB AND #$FE ;apagar las ROMs STA PORTB ;(dejando BASIC sin cambios!) LDA #high OSROM STA DESTINO+1 ;configurar bloque de copia LDA #high OSRAM STA ORIGEN+1 ;Repetir Paso2 LDA (ORIGEN),Y ;mover el OS de la RAM a una ubicacion apropiada STA (DESTINO),Y INY BNE Paso2 INC ORIGEN+1 ;mover a la siguiente pagina INC DESTINO+1 BEQ Habilit ;Si se completa LDA DESTINO+1 CMP #$D0 BNE Paso2 ;saltar bloque en la ubicacion $D000 LDA #$D8 STA DESTINO+1 BNE Paso2 ;Hasta que DESTINO = $000 Habilit PLA STA NMIEN ;restablecer la mascara de la NMI PLP ;volver a habilitar las IRQs RTS END INICIO
El BBS Gateway de St. Louis, Missouri cuenta con un sofisticado programa gratuito de Matt Ratcliff llamado "RamMaster".
Este no solo crea un Sistema Operativo en RAM, sino que también incluye una trampa para mantenerlo así incluso después de pulsar la tecla RESET. También permite activar y desactivar BASIC desde el DOS. Probablemente la solución más elegante sea la placa XL BOSS, que permite activar y desactivar BASIC con solo pulsar unas teclas. Está disponible en Allen MacroWare en Redondo Beach, California.
Al convertir la memoria del Sistema Operativo de ROM a RAM, puede modificarlo por completo, salvo una pequeña parte, entre las ubicaciones 53248 a la 55295 ($D000 a la $D7FF), ya que es RAM. Siempre puede escribir su propio SO, cargarlo en RAM, desactivar la ROM e instalarlo. Puede cambiar los conjuntos de caracteres a sus ubicaciones originales en lugar de tener que moverlos y usar más memoria. Puede reescribir los controladores, las interrupciones y otras rutinas; prácticamente cualquier cosa.
Esto es exactamente lo que hace el disco Translator al escribir el Sistema Operativo 800 en el modelo XL. Arranque el Translator e inserte un disco DOS normal cuando aparezca el mensaje READY en BASIC. Ahora escriba:
10 FOR N=57344 TO 57351 20 READ A:POKE N,A:NEXT N 30 DATA 255,1,1,1,1,1,1,1
Verá una pantalla de "tablero gráfico": Ha hecho POKE directamente en el conjunto de caracteres en la ubicación $E000, modificando el primer carácter (espacio). Esto también significa que el área que va desde la ubicación 49152 a la 52991 ($C000 a la $CEFF) no se utiliza: casi 4K de RAM libre para gráficos player/missile, rutinas de lenguaje máquina y cualquier otra función que necesite. Tenga cuidado de no sobrepasar los controladores de interrupciones en la ubicación 52992 ($CF00).
54019 |
D303 |
PBCTL |
El control del PORT B del 400/800; sin uso, ya que no hay uno en la serie XL/XE.
54528-54783 |
D500-D5FF |
.... |
No se utiliza en los modelos XL ni 400/800. Cualquier acceso de lectura o escritura a esta área habilita la línea de control del cartucho (CCNTL), como en la interfaz del cartucho del modelo 400/800.
55296-57343 |
D800-DFFF |
FP |
Paquete de coma flotante; aunque corregido, el punto de entrada sigue siendo el mismo que en el 400/800. Ahora se produce un error al intentar obtener un LOG(0) o un LOG10(0). Esta área se vuelve direccionable por el dispositivo cuando el Sistema Operativo conmuta la ROM para realizar operaciones de E/S en un dispositivo conectado a la ranura de expansión.
Hay varias tablas integradas en el paquete FP:
Dirección | Tabla |
56909/DE4D | Coeficientes de potencia de 10 |
57202/DF72 | Coeficientes logarítmicos |
57262/DFAE | Coeficientes de arcotangente (¿sin uso?) |
Cuando se selecciona un dispositivo externo conectado a través del bus, el Sistema Operativo desactiva el paquete de coma flotante y activa la ROM de la interfaz del bus paralelo (PBI), y luego lo vuelve a activar al finalizar la E/S. Esto significa que un dispositivo externo no puede usar el paquete de coma flotante ni ningún otro software (como el BASIC).
Los primeros 26 bytes del área del vector ROM de hardware (cuando la ROM del Sistema Operativo no está seleccionada) son:
Byte | Hex | Uso |
55296/55297 | D800/D801 | Suma de comprobación de la ROM (byte menos significativo/byte más significativo) (opcional) |
55298 | D802 | Número de revisión de la ROM (opcional) |
55299 | D803 | Número de identificación (128; $80) |
55300 | D804 | Tipo de dispositivo (opcional) |
55301 | D805 | Instrucción JMP ($4C) |
55302/55303 | D806/D807 | Vector de E/S (byte menos significativo/byte más significativo) |
55304 | D808 | JMP |
55305/55306 | D809/D80A | Vector de interrupción (byte menos significativo/byte más significativo) |
55307 | D80B | Número de identificación (145; $91) |
55308 | D80C | Nombre del dispositivo en ASCII (opcional) |
55309/55310 | D80D/D80E | Vector abierto (byte menos significativo-1/byte más significativo) |
55311/55312 | D80F/D810 | Vector cerrado (byte menos significativo-1/byte más significativo) |
55313/55314 | D811/D812 | Obtener byte (byte menos significativo-1/byte más significativo) |
55315/55316 | D813/D814 | Poner byte (byte menos significativo-1/byte más significativo) |
55317/55318 | D815/D816 | Vector de estado (byte menos significativo-1/byte más significativo) |
55319/55320 | D817/D818 | Vector especial (byte menos significativo-1/byte más significativo) |
55321 | D819 | JMP |
55322/55323 | D81A/D81B | Vector de inicialización (byte menos significativo/byte más significativo) |
55324 | D81C | Sin uso |
En un arranque en frío, el Sistema Operativo busca dispositivos paralelos y, si encuentra uno, envía con un JMP (hasta 55321; $D819) a la rutina INIT en 55322/55323 ($D81A, $D81B), que coloca la dirección del controlador de dispositivo paralelo genérico en las tablas de controladores con el nombre del dispositivo.
57344-58367 |
E000-E3FF |
CHARSET1 |
Conjunto de caracteres estándar (doméstico); predeterminado al encender el equipo o al apretar la tecla RESET; la ubicación 756 ($2F4) apunta acá.
58368-65535 |
E400-FFFF |
OS |
El Sistema Operativo se ha reescrito y modificado considerablemente a partir del 400/800. Los chips ANTIC, PIA y POKEY son los mismos, pero se han trasladado muchas rutinas del Sistema Operativo. Los vectores en la RAM se han mantenido prácticamente intactos, por lo que el software que utiliza estas ubicaciones puede ejecutarse en todas las máquinas. Al escribir software para usar rutinas del Sistema Operativo, utilice siempre los vectores, nunca las rutinas en sí; estas pueden cambiar, mientras que los vectores no.
Las ubicaciones 58368 a la 58495 ($E400 a la $E47F) aún contienen las tablas de vectores, pero apuntan a ubicaciones diferentes a las del Sistema Operativo de los modelos 400/800 (para más información, consulte la sección 400/800). Todos los vectores (excepto JMP) apuntan a la dirección de la rutina menos 1:
Dispositivo y ubicación | Abrir | Cerrar | Obtener | Poner | Estado | Especial | JMP a |
E: 58368 $E400 | EF93 | F2D2 | F249 | F2AF | F21D | F2C2 | EF6E |
S: 58384 $E410 | EF8D | F2D2 | F17F | F1A3 | F21D | F9AE | EF6E |
K: 58400 SE420 | F21D | F21D | F2FC | F22C | F21D | F22C | EF6E |
P: 58416 $E430 | FEC1 | FF06 | FEC0 | FECA | FEA2 | FEC0 | FE99 |
C: 58432 $E440 | FCE5 | FDCE | FD79 | FDB3 | FDCB | FCE4 | FCDB |
Los vectores JMP en las ubicaciones 58448 a la 58533 ($E450 a la $E4A52) siguen siendo los mismos, pero apuntan a nuevas direcciones de vectores3:
Etiqueta | Ubicación | JMP a |
DISKIV | E450 | C6A3 |
DISKINV | E453 | C6B3 |
CIOV | E456 | E4DF |
SIOV | E459 | C933 |
SETVBV | E45C | C272 |
SYSVBV | E45F | C0E2 |
XITVBV | E462 | C28A |
SIOINV | E465 | E95C |
SENDEV | E468 | EC17 |
INTINV | E46B | C00C |
CIOINV | E46E | E4C1 |
SELFSV | E471 | F223 (antes era BLKBVD) |
WARMSV | E474 | C290 |
COLDSV | E477 | C2C8 |
RBLOKV | E47A | FD8D |
CSOPIV | E47D | FCF7 |
Varias de estas son ubicaciones que hacen JMP hacia otras rutinas, y se hizo de esta manera para mantener la compatibilidad con el antiguo Sistema Operativo 800.
Se han agregado nuevos vectores fijos de puntos de entrada:
58496/E480 | PUPDIV: Entrada a la pantalla de encendido (modo de Self-Test en todas los modelos XL/XE excepto el 1200XL; visualización del logotipo de Atari en el 1200XL). Pruebe X=USR(58496). Apunta a la ubicación 61987 ($F223). |
58499/E483 | SLFTSV: Solo 1200XL: acceso al modo de Self-Test. Apunta a la ubicación 20480 ($5000) (vea PORTB más arriba). |
58502/E486 | PENTV: Entrada al controlador cargada desde un periférico o disco. Apunta a la ubicación 61116 ($EEBC). |
58505/E489 | PHUNLV: Entrada a la desvinculación del controlador cargado. Apunta a la ubicación 59669 ($E915). |
58508/E48C | PHINIV: Entrada a la inicialización del controlador cargado. Apunta a la ubicación 59544 ($E898). |
2 En el libro original, dice 58583 en vez de 58533 y dice $E4D7 en vez de $E4A5. (N. del T.)
3 En la tabla del libro original, dice SETBV en vez de SETVBV; dice SYSBV en vez de SYSVBV; y dice XITBV en vez de XITVBV. (N. del T.)
58481 |
E471 |
SELFTST |
Para acceder al modo Self-Test, en BASIC se escribe BYE o X = USR(58481). Este solía ser el modo pizarrón (o Bloc de notas), una función que los padres usaban para entretener a sus hijos, evitando que manipularan el sistema o los programas. En el 1200XL, esta corresponde a la ubicación de la pantalla del logotipo. Echo de menos el modo pizarrón; el Self-Test no es muy útil. No existe un modo equivalente al pizarrón en los sistemas XL/XE.
58511 |
E48F |
GPDVV |
Vector genérico de propósito general del controlador de dispositivos paralelos. Puede usarlo para comunicarse con cualquier dispositivo del puerto de expansión; transfiera esta dirección a HATABS (794 a la 831; $31A a la $33F) junto con un nombre de dispositivo apropiado, como V: o T:. Consulte el apéndice sobre el bus de expansión. Esta tabla tiene 7 vectores, correspondientes a las tablas de vectores de la ubicación 583684 ($E400).
4 En el libro original, dice 58348 en vez de 58368. (N. del T.)
58528-58560 |
E4A0-E4C0 |
.... |
Área en blanco (todos ceros).
58561 |
E4C1 |
ICIO |
Inicializar CIO.
58588 |
E4DC |
IIN |
Rutina de error IOCB no abierto.
58591 |
E4DF |
CIO |
El área del CIO incluye las siguientes rutinas:
Dirección | Rutina |
58640/E510 | Error de dispositivo inexistente |
58645/E515 | Cargar controlador de periférico para OPEN (abrir) |
58650/E51A | Ejecutar comando CIO |
58687/E53F | Ejecutar comando OPEN |
58716/E55C | Inicializar IOCB para hacer OPEN |
58742/E576 | Periférico de sondeo para hacer OPEN |
58748/E57C | Ejecutar comando CLOSE (cerrar) |
58775/E597 | Ejecutar comandos STATUS y SPECIAL |
58802/E5B2 | Ejecutar comando GET (obtener) |
58910/E610 | Ejecutar comando PUT (poner) |
58992/E670 | Establecer estado |
58994/E672 | Completar operación CIO |
59029/E695 | Calcular punto de entrada del controlador |
59067/E6BB | Decrementar la longitud del búfer |
59080/E6C8 | Decrementar el puntero del búfer |
59089/E6D1 | Incrementar el puntero del búfer |
59096/E6D8 | Establecer la longitud final del búfer |
59114/E6EA | Ejecutar comando del controlador |
59124/E6F4 | Invocar controlador de dispositivo |
59135/E6FF | Buscar tabla de controladores |
59158/E716 | Buscar controlador de dispositivo |
59193 |
E739 |
PHR |
Cargador de controladores de los periféricos. Incluye las siguientes rutinas:
Dirección | Rutina |
59193/E739 | Inicialización |
59326/E7BE | Realizar sondeo (poll) |
59358/E7DE | Controlador de carga |
59414/E816 | Rutina de obtención de bytes |
59443/E833 | Obtener el siguiente bloque de carga |
59485/E85D | Buscar cadena del controlador |
59540/E894 | Inicialización de arranque en caliente del controlador |
59544/E898 | Inicialización de arranque en caliente en cadena |
59550/E89E | Inicialización de arranque en frío |
59584/E8C0 | Inicializar el controlador y actualizar MEMLO |
59648/E900 | Inicializar el controlador |
59669/E915 | Desvinculación del controlador |
59740 |
E95C |
SIO |
La sección SIO incluye las siguientes rutinas:
Dirección | Rutina |
59740/E95C | Inicialización |
59761/E971 | Rutina principal de SIO |
59946/EA2A | Operación SIO completa |
59959/EA37 | Esperar la finalización o ACK |
60040/EA88 | Enviar búfer al bus serie |
60077/EAAD | Proceso de salida serie IRQ listo |
60140/EAEC | Proceso de salida serie completo |
60157/EAFD | Recibir |
60199/EB27 | Indicar tiempo de espera |
60204/EB2C | Proceso de entrada serie IRQ listo |
60295/EB87 | Establecer punteros del búfer |
60317/EB9D | Procesar E/S del cassette |
60433/EC11 | Vencimiento del temporizador |
60439/EC17 | Habilitar envío de SIO |
60480/EC40 | Habilitar recepción de SIO |
60502/EC56 | Configurar envío o recepción |
60548/EC84 | Deshabilitar envío o recepción |
60570/EC9A | Obtener tiempo de espera del dispositivo |
60585/ECA9 | Tabla de controladores de interrupciones SIO (6 bytes) |
60591/ECAF | Enviar a dispositivo inteligente |
60608/ECC0 | Establecer temporizador y esperar |
60616/ECC8 | Calcular la tasa de baudios |
60718/ED2E | Ajustar el valor de VCOUNT |
60733/ED3D | Establecer la velocidad inicial en baudios |
60871/EDC7 | Procesar tecla BREAK |
60898/EDE2 | Establecer parámetros de VBLANK del SIO |
60921 |
EDF9 |
TPFV |
Tabla de valores de frecuencia de POKEY (24 bytes).
60945 |
EE11 |
NTSC/PAL |
Tabla de valores constantes.
60957 |
EE1D |
Tablas |
Tablas de memoria de pantalla y de Listas de Despliegue.
Dirección | Tabla |
60957/EE1D | Asignación de memoria de pantalla |
60973/EE2D | Mostrar el recuento de entradas en la lista |
61005/EE4D | Modos gráficos ANTIC |
61021/EE5D | Vulnerabilidad de la Lista de Despliegue |
61037/EE6D | Recuento de desplazamiento a la izquierda |
61053/EE7D | Recuento de columnas del modo |
61069/EE8D | Recuento de filas del modo |
61085/EE9D | Recuento de desplazamiento a la derecha |
61101/EEAD | Máscaras de visualización |
61116 |
EEBC |
PHE |
Entrada del controlador periférico, incluye las siguientes rutinas:
Dirección | Rutina |
61177/EEF9 | Sondeo PH al hacer OPEN |
61222/EF26 | Rutina de colocación de bytes para IOCB abierto de manera provisoria |
61294 |
EF6E |
SIN |
Rutina de inicialización de pantalla. Incluye otras rutinas de gestión de pantalla:
Dirección | Rutina |
61326/EF8E | Ejecutar OPEN (abrir) de la pantalla |
61332/EF94 | Ejecutar OPEN del editor |
61340/EF9C | Completar comando OPEN |
61824/F180 | Rutina de obtención de byte de la pantalla |
61839/F18F | Obtener datos bajo el cursor |
61860/F184 | Rutina de colocación de bytes en pantalla |
61828/F184 | Verificación del final de línea |
61898/F1CA | Dibujar punto |
61929/F1E9 | Desplegar |
61960/F208 | Establecer condiciones de salida |
61982/F21E | STATUS (Estado) de la pantalla |
61997/F22D | SPECIAL (especial) del editor de la pantalla (solo RTS) |
61998/F22E | CLOSE (cerrar) del editor de la pantalla |
62026/F24A | Obtener byte del Editor (vea más abajo) |
62128/F2B0 | Poner byte del Editor (vea más abajo) |
62142/F2BE | Procesar carácter |
62026 |
F24A |
GETCHAR |
Nueva ubicación para la rutina "obtener carácter" (anteriormente estaba en la ubicación 63038). Si usa las rutinas de visualización por pantalla del libro Machine Language for Beginners, deberá cambiar esta dirección para que funcione correctamente en los modelos XL.
62128 |
F2B0 |
OUTCHAR |
Nueva ubicación de la rutina "poner carácter". Consulte la nota en la ubicación 62026. Varios programas utilizan una llamada no válida a las rutinas "obtener carácter" y "poner carácter", anteriormente en las ubicaciones 63038 y 63140 ($F63E y F6A4), ahora en las ubicaciones 62026 y 62128 ($F24A y $F2B0), respectivamente. Es posible que pueda corregir algunos problemas en su software buscando y reemplazando los vectores antiguos con las nuevas ubicaciones.
62200 |
F2F8 |
IGN |
Ignorar el carácter y realizar la operación de obtención de bytes mediante el teclado.
62205 |
F2FD |
KGB |
Rutina obtener byte del teclado. El controlador del teclado incluye las siguientes rutinas:
Dirección | Rutina |
62432/F3E0 | Controlador del carácter Escape |
62438/F3E6 | Mover el cursor hacia arriba |
62451/F3F3 | Mover el cursor hacia abajo |
62464/F400 | Mover el cursor a la izquierda |
62474/F40A | Mover el cursor al margen derecho |
62476/F40C | Establecer columna de cursor |
62481/F411 | Mover el punto del cursor |
62491/F41B | Mover el cursor al margen izquierdo |
62496/F420 | Limpiar la pantalla |
62528/F440 | Mover el cursor a la posición inicial (esquina superior izquierda) |
62586/F47A | Controlador del carácter Tabulación |
62613/F495 | Establecer tabulación |
62618/F49A | Limpiar tabulación |
62623/F49F | Insertar carácter |
62677/F4D5 | Eliminar carácter |
62732/F50C | Insertar línea |
62752/F52D | Eliminar línea |
62806/F556 | Sonar el timbre |
62815/F55F | Cursor hacia abajo |
62821/F565 | Decremento doble del byte doble |
62825/F569 | Almacenar datos para el desplazamiento (scroll) fino |
62840/F578 | Decremento simple de byte doble |
62880/F5A0 | Establecer entrada desplazable de la Lista de Despliegue |
62892/F5AC | Convertir la fila/columna del cursor en dirección |
62986/F60A | Rutinas de cursor avanzadas |
63073/F661 | Retorno con desplazamiento |
63077/F665 | Retorno |
63150/F6AE | Restar punto final |
63164/F6BC | Comprobar las rutinas del rango del cursor |
63256/F718 | Restaurar datos antiguos bajo el cursor |
63267 |
F723 |
BMI |
Rutinas de mapa de bits para el editor y el controlador de pantalla.
63479 |
F7F7 |
SCR |
Rutinas de desplazamiento (scroll) de la pantalla.
63665 |
F8B1 |
CBC |
Rutinas de cálculo de conteo del búfer; varias rutinas del teclado, editor y pantalla, incluyendo:
Dirección | Rutina |
63768/F918 | Eliminar línea |
63804/F93C | Verificar carácter de Control |
63820/F94C | Guardar valores de filas y columnas |
63831/F957 | Restaurar fila y columna |
63842/F962 | Intercambiar cursor con posición del cursor normal |
63875/F983 | Sonido clic de la tecla |
63895/F997 | Colocar el cursor en el borde izquierdo |
63910/F9A6 | Establecer la dirección del contador de escaneo de memoria |
63919/F9AF | Ejecutar comando SPECIAL de pantalla |
64260 |
FB04 |
TMSK |
Aquí comienzan varias tablas de la pantalla y del teclado:
Dirección | Tabla |
64260/FB04 | Máscaras de bits |
64264/FB08 | Colores de pantalla predeterminados (PF0-3, BAK) |
64269/FB0D | Rutinas de caracteres de control (cada entrada tiene 3 bytes; carácter de control y dirección de 2 bytes de la rutina de procesamiento) |
64317/FB3D | Rutinas de teclas de función con Shift (1200XL) |
64329/FB49 | Constantes de conversión ATASCII a código interno |
64333/FB4D | Constantes de conversión de código interno a ATASCII |
64337/FB51 | Definición del teclado (vea más abajo) |
64529/FC11 | Definiciones de las teclas de función |
64337 |
FB51 |
.... |
Inicio de la tabla de definición de teclado de 192 bytes; consulte las ubicaciones 121 y 122 ($79 y $7A).
64537 |
FC19 |
KIR |
Rutinas de procesamiento de IRQ del teclado; verificación y procesamiento de caracteres, CONTROL-1, tecla HELP, teclas CONTROL y de función (1200XL; aunque el código para las teclas de función permanece en los modelos 800XL y XE)
64708 |
FCC4 |
FDL |
Procesamiento de la interrupción de Lista de Despliegue para el desplazamiento fino.
64728 |
FCD8 |
CIN |
Rutina de inicialización del cassette, seguida de las rutinas de E/S de cassette y una tabla de constantes NTSC/PAL para la longitud del líder del archivo y la duración del pitido.
65177 |
FE99 |
PIN |
Rutinas de inicialización de impresora y E/S que incluyen:
Dirección | Rutina |
65218/FEC2 | Abrir impresora |
65227/FECB | Byte de transferencia de la impresora |
65261/FEED | Llenar el búfer de la impresora |
65270/FEF6 | Hacer PUT en la impresora |
65287/FF07 | Cerrar la impresora |
65300/FF17 | Configurar DCB para la impresora |
65348/FF44 | Tiempo de espera de la impresora desde STATUS |
65355/FF4B | Modo de impresión de proceso |
65395 |
FF73 |
VFR |
Rutinas de verificación de suma de comprobación de la ROM para el primer banco de 8K.
65426 |
FF92 |
VSR |
Rutinas de verificación para la suma de comprobación de la ROM, segundo banco de 8K, incluidas las rutinas para examinar la región de suma de comprobación y la tabla de direcciones a verificar.
65518-65529 |
FFEE-FFF9 |
.... |
Datos de identificación y suma de comprobación para el área de la ROM 57344 a la 65535 ($E000 a la $FFFF--para más información, vea la ubicación 49152, $C000):
Byte | Uso |
65518/FFEE | Fecha de revisión D1 y D2 (BCD de cuatro bits) |
65519/FFEF | Fecha de revisión M1 y M2 |
65520/FFF0 | Fecha de revisión Y1 y Y2 |
65521/FFF1 | Byte de opción; debe ser 1 para el 1200XL (en mi 800XL es 2) |
65522-26/FFF2-6 | Número de pieza en formato AANNNNNN |
65527/FFF7 | Número de revisión (de nuevo, en el mío es 2) |
65528-9/FFF8-9 | Suma de comprobación, bytes (byte menos significativo/byte más significativo) |
En la revisión A de la ROM 400/800, las ubicaciones 65527 y 65528 deben ser igual a 221 ($DD) y 87 ($57). Para la ROM B, deben ser igual a 243 ($F3) y 230 ($E6). Para las versiones PAL, deben ser igual a 214/87 ($D6/$57) y 34/88 ($22/$58), respectivamente. En el 1200XL, la ubicación 65527 debe ser igual a 10 para la revisión A, e igual a 11 para la revisión B. En el 600XL, debe ser igual a 1, y en el 800XL, debe ser igual a 2. Para el 1200XL, la ubicación 64728 ($FCD8) debe ser distinta a 162 ($A2).
65530-65535 |
FFFA-FFFF |
Vectores de la máquina |
Contiene los vectores de los servicios NMI, RESET (encendido) e IRQ. Sus valores iniciales son 49176 ($C018), 49834 ($C2AA) y 49196 ($C02C), respectivamente.