Mapping the Atari - Revised Edition, por Ian Chadwick
APÉNDICE ONCE
ADENDA Y ERRATA DE LA PRIMERA EDICIÓN
El material que viene a continuación está organizado por dirección decimal, hexadecimal, seguido por el nombre y la descripción. En algunos lugares, lo que se agrega es un artículo o libro de referencia particularmente bueno que explica con más detalle el uso de esa ubicación.
En otros lenguajes, las ubicaciones inferiores de de memoria del BASIC y de la Página Seis pueden utilizarse para otros fines. Por ejemplo, los compiladores ABC y Datasoft BASIC, así como el MAC/65, utilizan muchas ubicaciones para realizar tareas distintas a las que BASIC realiza en ese mismo espacio. Para evitar conflictos, lea el mapa de memoria del lenguaje o del compilador antes de usar estas ubicaciones. Esto también puede aplicarse a los programas DOS personalizados más recientes publicados después de la primera edición de este libro.
9 |
9 |
Un valor igual a 3 significa que tanto el cassette como el disco se iniciaron correctamente. Puede activar el botón RESET haciendo POKE 9,3 seguido de un POKE a las ubicaciones 2 y 3 (CASINI) con la dirección (byte menos significativo/byte más significativo) de su rutina de lenguaje de máquina para atrapar el RESET (dentro de la rutina, almacene también un 3 en la ubicación 9) y un RTS al final.
12,13 |
C,D |
Cargue aquí la dirección de inicialización de su programa en lenguaje de máquina para atrapar el RESET y evitar que éste vuelva a ejecutarlo. También puede hacerlo mediante CASINI; vea la ubicación de más arriba.
18,19,20 |
12,13,14 |
El número al que se refiere el segundo párrafo debe ser igual a 256 al cubo, menos 1 (256 * 256 * 256 - 1). Además, para obtener los segundos del conteo de jiffys, divida por 59,92334 (el intervalo de tiempo real del VBI), y no por 60. Para obtener información sobre los temporizadores de Atari, consulte los artículos de Stephen Levy en el libro COMPUTE!'s Third Book of Atari y de Bob Cockcroft en la revista ROM (diciembre de 1984 y febrero de 1985).
29 |
1D |
El puntero al byte o carácter actual que se enviará a la impresora.
33 |
21 |
El número de dispositivo actual.
59 |
3B |
0 significa no enviado.
66 |
42 |
Haga POKE 66,1 para deshabilitar la actualización entre los registros sombra y hardware; luego, puede usar POKE directamente en los registros hardware. También puede deshabilitar el proceso VBLANK de la ubicación 54286 ($D40E).
67-73 |
43-49 |
Reiniciado por FMS cada vez que toma el control.
82,83 |
52,53 |
Ambos tienen un rango de 0 a 39.
85,86 |
55,56 |
Tiene un rango de 0 a 319.
87 |
57 |
Para apagar el cursor al dibujar en modo texto, haga POKE 752,1 seguido de una declaración PRINT. Para obtener colores diferentes, agregue una sentencia COLOR antes de la rutina PLOT. El carácter será el equivalente ASCII del número que sigue a la sentencia COLOR.
88,89 |
58,59 |
El programa para guardar la pantalla gráfica no funciona. Para lograr este objetivo, cree una cadena que contenga una rutina de llamada en lenguaje de máquina:
1 DATA 104,104,104,170,76,66,228 2 REM PLA, PLA, PLA, TAX, JMP $E456 5 FOR N=1 A 7:READ BYTE:ML$(N,N)=CHR$(BYTE):NEXT NAhora abra un canal para escribir en el disco (OPEN #4,8,0, "D:filename.ext"). Encuentre RAMTOP (FIN = PEEK(106) * 256 - 160), restando 160 bytes en caso de tener una ventana de texto. Encuentre la dirección de la lista de despliegue (DLIST = PEEK(560) + 256 * PEEK(561): INICIO = PEEK(DLIST + 4) + 256 * PEEK(DLIST + 5): ALTO = INT(INICIO/256): BAJO = INICIO - 256 * ALTO) e introdúzcala en la ubicación correcta en el IOCB (POKE 900,BAJO: POKE 901,ALTO).
A continuación, calcule la longitud de la pantalla (TAMANO = (FIN - INICIO) + 1: TAMANOA = INT(TAMANO/256): TAMANOB = TAMANO - 256 * B1), e introdúzcala en el IOCB usando POKE (POKE 904,TAMANOB: POKE 905,TAMANOA). Haga POKE en el IOCB con el comando "guardar binario" (POKE 898,11). Llame al CIO con el comando USR (X=USR(ADR(ML$),4 * 16)). Finalmente, guarde el modo gráfico actual (MODO = PEEK(87): PUT #4,MODO) y los registros de color (FOR N = 708 TO 712; PUT #4,PEEK(N): NEXT N) y haga CLOSE #4.
Para recuperar la pantalla, utilice la misma rutina USR y los PEEK y POKEs anteriores, pero haciendo POKE 898,7 en vez de 11. Esto se derivó de un programa más extenso de Fred Pinto en la edición de marzo de 1984 de la revista Antic. Un artículo de Steve Kaufman en la revista COMPUTE! de noviembre de 1983 presenta un método rápido y sencillo que funciona igual de bien (guardar y cargar), pero no guarda los registros de color. La revista Creative Computing de noviembre de 1983 también tiene un ejemplo similar en su sección "Outpost Atari".
106 |
6A |
Para ver cómo proteger la memoria alta, consulte el artículo "RAMTOP Dragon" de KW Harm en el libro COMPUTE!'s Second Book of Atari Graphics. Otro artículo en el mismo libro, por Jim Clark, describe cómo proteger la memoria baja.
118 |
76 |
Este es el cambio de posición vertical al dibujar una línea inclinada.
121 |
79 |
Dirección del trazado de la línea: 0 es hacia abajo, 255 es hacia arriba.
122 |
7A |
Dirección del trazado: 0 es derecha, 255 es izquierda.
126,127 |
7E,7F |
Iteraciones o pasos necesarios para trazar una línea.
132,133 |
84,85 |
La revista COMPUTE! de octubre de 1983 tiene un artículo de EH Foerster sobre cómo reservar una porción de RAM por encima de la VNTD (dentro de un programa BASIC), que también se guardará intacta cuando guarde su programa.
138,139 |
8A,8B |
Otra forma de bloquear el sistema si se hace algo no debido (por ejemplo, se presiona la tecla BREAK) es mediante la sentencia Z=USR(0).
146 |
92 |
MEOLFLG |
Registro modificado de la bandera EOL del BASIC. El libro Atari Basic Sourcebook enumera todas las ubicaciones de RAM utilizadas por BASIC (páginas 144 a la 147).
147 |
93 |
.... |
Sobrante.
149,150 |
95,96 |
POKADR |
Dirección (byte menos significativo/byte más significativo) de la última ubicación POKE. Si no se hizo ningún comando POKE, corresponde a la dirección del último token de OPERATOR (generalmente 155 para EOL).
182 |
B6 |
DATAD |
El elemento de datos que se lee. Registra el número del elemento en esa línea; por ejemplo, el décimo elemento en una instrucción DATA.
183,184 |
B7,B8 |
DATALN |
Número de línea de la instrucción DATA; el número de línea BASIC de la instrucción DATA que se está leyendo. La instrucción RESTORE (y la ubicación 182, de más arriba) restablece las ubicaciones a 0. Puede hacer lo mismo con un POKE. A continuación se presenta un programa de Steve Rockower, del Atari SIG de CompuServe, que muestra estas ubicaciones:
10 REM DEMOSTRACION DE LAS UBICACIONES 182-184($B6-$B8) COMO SUSTITUTO DE RESTORE 20 REM LA UBICACION 182($B6) APUNTA A UN ITEM DE LA LINEA QUE SE LEERA A CONTINUACION 30 REM LAS DECLARACIONES DATA TIENEN EL NOMBRE DEL ELEMENTO SECUENCIALMENTE Y 40 REM EL NUMERO EN LA LINEA ACTUAL 50 DIM C$(2),A$(20):C$=CHR$(125) 100 DATA UNO-1, DOS-2, TRES-3, CUATRO-4, 0 110 DATA CINCO-1, SEIS-2, SIETE-3, OCHO-4, 0 120 DATA <9-1>,<10-2>,<11-3>,<12-4>,1 150 PRINT C$:RESTORE 100 160 READ A$:IF A$="0" THEN 200 170 IF PEEK(182)=1 THEN PRINT :PRINT "LEYENDO LINEA: ";PEEK(183)+256*PEEK(184) 180 IF A$="1" THEN 300 190 PRINT "#";PEEK(182);" ";A$;" ";:GOTO 160 200 PRINT :GOTO 160 300 PRINT :PRINT 310 TRAP 400:PRINT "CUAL LINEA DE DATOS (1,2, O 3)";:INPUT LINEADATA 320 PRINT "CUAL ITEM (1,2,3, O 4)";:INPUT ITEM 330 LET LINEADATA=90+10*LINEADATA 340 POKE 184,INT(LINEADATA/256):POKE 183,LINEADATA-INT(LINEADATA/256) 350 POKE 182,ITEM-1 360 READ A$:PRINT A$ 370 GOTO 310 400 END
190 |
BE |
SAVCUR |
Guarda la dirección de la línea actual.
192 |
C0 |
IOCMD |
Comando de E/S.
193 |
C1 |
IODVC |
Dispositivo de E/S.
194 |
C2 |
PROMPT |
Carácter del cursor.
200 |
C8 |
COLOR |
Almacena el número de COLOR utilizado en una instrucción PLOT o DRAWTO. La instrucción COLOR x puede reemplazarse por POKE 200,x. Igual que la ubicación 763 ($2FB), pero BASIC toma el valor de 200 y lo carga en la ubicación 763 antes de dibujar o rellenar. Contribución de Judson Pewther, Nueva York.
202 |
CA |
LOADFLG |
Indicador de carga en progreso.
210,211 |
D2,D3 |
Área de trabajo de la coma flotante del BASIC. $D2 se utiliza para el tipo de variable, $D3 para el número de variable y la longitud de la mantisa en FP.
212,213 |
D4,D5 |
Usado por el comando USR para devolver un número de 2 bytes a BASIC. Si no se almacena nada aquí, la sentencia "I=USR(dirección, variables)" devuelve la dirección de la subrutina USR. De lo contrario, se puede almacenar un entero (rango 0-65535) que se convierte en el valor de la función USR. Contribución de Judson Pewther, Nueva York.
522,523 |
20A,20B |
Vector para entrada serie listo.
524,525 |
20C,20D |
Vector para salida serie listo.
528-533 |
210-215 |
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.
555 |
22B |
Cada vez que se lee esta ubicación, se obtiene un número diferente. Esto se debe a que la cuenta regresiva comienza cuando se presiona una tecla y se cronometra el retardo antes de repetir la pulsación.
558 |
22E |
Se establece en 1 cuando la ubicación 544,545 ($220,$221) llega a 0. Contribución de Joe Gelman, del Atari SIG de CompuServe.
570 |
23A |
El número de identificación del bus SIO (dispositivo) actual.
632 |
278 |
Los pines del puerto del joystick están asignados de la siguiente manera:
_______________________ \ / \ 1 2 3 4 5 / \ / \ 6 7 8 9 / \_____________/
1 Bastón hacia adelante
2 Bastón hacia atrás
3 Bastón a la izquierda
4 Bastón a la derecha (1-4 son 4 bits del puerto PIA)
5 Entrada del potenciómetro B (paddle) (pin análogo #1)
6 Botón
7 +5 voltios (carga recomendada de un TTL a 50 mA)
8 Tierra
9 Entrada del potenciómetro A (pin análogo #2)
Para ver un ejemplo del uso de los puertos Atari para control externo, consulte la revista Creative Computing de agosto de 1983.
743,744 |
2E7,2E8 |
Es muy útil reservar un bloque de memoria debajo de su programa BASIC y usarlo para almacenar variables que pueden pasarse entre programas con PEEK y POKE. Aquí tiene otra rutina que reservará memoria baja para usted:
5 PRINT FRE(0) 6 REM ESTE PROGRAMA SE BORRA DESPUES DE SU EJECUCION: PRIMERO ASEGURESE DE GUARDARLO 7 REM HAGA PRINT FRE(0) LUEGO DE LA EJECUCION PARA COMPARAR LOS VALORES 10 REM REEMPLACE LA VARIABLE BYTES CON EL NUMERO DE BYTES A PROTEGER 20 MEMLO=BYTES+PEEK(743)+PEEK(744)*256 30 BYTEALTO=INT(MEMLO/256) 40 BYTEBAJO=MEMLO-(INT(MEMLO/256)*256) 50 POKE 743,BYTEBAJO:POKE 744,BYTEALTO 60 POKE 128,BYTEBAJO:POKE 129,BYTEALTO:REM PUNTERO LOMEM DEL BASIC 70 POKE 8,0:REM BANDERA DE LA TECLA RESET 80 X=USR(40960):REM SALTAR AL ARRANQUE EN FRIO CLASICO
752 |
2F0 |
Al establecer en 1 esta ubicación, tenga cuidado con el conflicto que podría tener con la ubicación 755 (y viceversa).
755 |
2F3 |
Para ver un artículo de Frank Jones sobre la creación de caracteres parpadeantes, consulte el libro COMPUTE!'s Third Book of Atari.
763 |
2FB |
No es el color multiplicado por 16 más la luminancia; este es el número de la última declaración COLOR, tomado de la ubicación 200 ($C8). Si se introduce el número aquí, BASIC tomará el número almacenado en la posición 200 y lo desechará, cambiando su valor (sin embargo, no así en lenguaje de máquina). Contribución de Karl Wiegers, Rochester y Judson Pewther, Nueva York.
764 |
2FC |
En el libro COMPUTE!'s Third Book of Atari, Orson Scott Card explica el teclado y cómo leerlo utilizando el registro CH.
Los valores que figuran como "código interno" en el Apéndice 10 no son los mismos que los generados por la ubicación 764. El código interno indica el orden en que se almacenan los caracteres en el conjunto de caracteres. El código de tecla reflejado en la ubicación 764 es el código de hardware, que es completamente diferente, sin que haya podido determinar por qué.
768-779 |
300-30B |
Aquí tiene algunos ejemplos breves que muestran cómo usar estas ubicaciones con la unidad de disco (ya cuenta con un controlador, por lo que no es necesario crear uno nuevo). La rutina de llamada al CIO puede usarse en todas las rutinas de E/S de disco basadas en estas ubicaciones.
Para comprobar si un sector tiene datos:
5 DIM SEC$(128),CHK$(128) 10 DATA 104,32,83,228,96 15 SEC$(1)=CHR$(0):SEC$(128)=SEC$:SEC$(2)=SEC$:CHK$(1)=CHR$(0):CHK$(128)=CHK$:CHK$(2)=CHK$ 16 REM CONFIGURA ESPACIO DEL ARREGLO Y LO LLENA 17 REM CHK$ ESTA LLENO DE ESPACIOS EN BLANCO - EL CONTENIDO DE LOS SECTORES SIN USO 20 FOR N=1536 TO 1540:READ X:POKE N,X:NEXT N 25 REM ESTO HACE POKE DE LA RUTINA DE LLAMADA A CIO EN LA PAGINA SEIS 30 POKE 769,1:POKE 770,82 35 REM ESTO HACE POKE DEL NUMERO DE UNIDAD (1) Y LA FUNCION DE LECTURA (82) 40 PRINT "INGRESE UN NUMERO DE SECTOR A VERIFICAR":INPUT NUMSECT 45 IF NUMSECT<0 OR NUMSECT>720 THEN 40:REM VERIFICAR VALIDEZ DE LOS NUMEROS 50 POKE 778,NUMSECT-(INT(NUMSECT/256)*256):POKE 779,INT(NUMSECT/256) 51 REM HACE POKE DEL BYTE MENOS Y MAS SIGNIFICATIVO DEL SECTOR EN LAS UBICACIONES 778, 779 55 BUFER=ADR(SEC$):BUFRB=BUFER-(INT(BUFER/256)*256):BUFRA=INT(UFFER/256) 56 POKE 772,BUFRB:POKE 773,BUFRA 57 REM HACE POKE DE LA DIRECCION DE SEC$ EN LA DIRECCION DEL BUFER 60 Z=USR(1536):REM LLAMADA A LA RUTINA CIO 70 IF SEC$=CHK$ THEN PRINT "SIN DATOS EN EL SECTOR":GOTO 40 80 PRINT "EL SECTOR TIENE DATOS":GOTO 40
Otro método para comprobar el uso de un sector es ver si el byte 125 ($7D) indica que un sector contiene datos; si no es igual a 0, está en uso (registra el número de bytes utilizados en un sector). Puede examinar el contenido del sector añadiendo PRINT SEC$ después de la lectura.
El hacer PRINT PEEK(771) después de leer un sector mostrará el estado: 1 significa correcto, cualquier otro número significa incorrecto. Haga PEEK en esta ubicación después de leer cualquier sector para comprobar si hay sectores defectuosos.
La rutina anterior, con algunas modificaciones, imprime una lista de todos los sectores de un disco con datos (se recomienda usarla en la impresora, pero en el ejemplo a continuación uso la pantalla). Es una rutina lenta y poco elegante, pero puede adaptarla fácilmente para su propio uso.
5 DIM SEC$(128),CHK$(128),CNT(720) 10 DATA 104,32,83,228,96 15 SEC$(1)=CHR$(0):SEC$(128)=SEC$:SEC$(2)=SEC$:CHK$(1)=CHR$(0):CHK$(128)=CHK$:CHK$(2)=CHK$ 16 REM CONFIGURA ESPACIO DEL ARREGLO Y LO LLENA 17 REM CHK$ ESTA LLENO DE ESPACIOS EN BLANCO - EL CONTENIDO DE LOS SECTORES SIN USO 18 FOR CICLO=0 TO 720:CNT(CICLO)=0:REM ARREGLO VACIO 20 FOR N=1536 TO 1540:READ X:POKE N,X:NEXT N 25 REM ESTO 30 POKE 769,1:POKE 770,82 35 TRAP 100 40 FOR NUMSEC=1 TO 720 50 POKE 778,NUMSEC-(INT(NUMSEC/256)*256):POKE 779,INT(NUMSEC/256) 51 REM HACE POKE DEL BYTE MENOS Y MAS SIGNIFICATIVO DEL SECTOR EN LAS UBICACIONES 778, 779 55 BUFER=ADR(SEC$):BUFERB=BUFER-(INT(BUFER/256)*256):BUFERA=INT(BUFER/256) 56 POKE 772,BUFERB:POKE 773,BUFERA 60 Z=USR(1536) 70 IF SEC$=CHK$ THEN CNT(NUMSEC)=0:NEXT NUMSEC:GOTO 100 80 CNT(NUMSEC)=NUMSEC:NEXT NUMSEC 100 FOR CICLO=1 TO 720 110 IF CNT(CICLO)=0 THEN NEXT CICLO:GOTO 150 120 PRINT CNT(CICLO);" ";:NEXT CICLO 150 END
Para copiar de un sector a otro, utilice la siguiente rutina. Añada un bucle para copiar más de un sector a la vez. Esta rutina copia los 128 bytes, incluidos los 3 bytes de registro.
1 DIM SEC$(128),Z$(1) 2 REM ESPACIO PARA DATOS DEL SECTOR 5 DATA 104,32,83,228,96 10 FOR N=1536 TO 1540:READ X:POKE N,X:NEXT N 15 REM HACER POKE DE LA RUTINA DE LLAMADA A CIO EN LA PAGINA SEIS 20 PRINT "?COPIAR DESDE CUAL SECTOR?" 25 INPUT INICIO:IF INICIO<0 OR INICIO>720 THEN 25 30 PRINT "?A CUAL SECTOR COPIAR?" 35 INPUT TERMINO:IF TERMINO<0 OR TERMINO>720 OR TERMINO=INICIO THEN 35 40 POKE 770,82:REM COMANDO LEER 45 POKE 778,INICIO-(INT(INICIO/256)*256):POKE 779,INT(INICIO/256) 46 REM HACER POKE DEL BYTE MENOS Y MAS SIGNIFICATIVO DEL SECTOR A COPIAR 50 UBIC=ADR(SEC$):POKE 772,UBIC-(INT(UBIC/256)*256):POKE 773,INT(UBIC/256) 55 REM HACER POKE DEL BYTE MENOS Y MAS SIGNIFICATIVO DE LA DIRECCION DE LOS DATOS (SEC$) EN LA DIRECCION DEL BUFER 60 A=USR(1536):REM LEER EL SECTOR EN SEC$ 70 PRINT "PRESIONE RETURN PARA ESCRIBIR EL SECTOR": INPUT Z$ 80 POKE 770,87:REM COMANDO ESCRIBIR 85 POKE 778,TERMINO-(INT(TERMINO/256)*256):POKE 779,INT(TERMINO/256) 86 REM HACER POKE DEL BYTE MENOS Y MAS SIGNIFICATIVO DEL SECTOR DE DESTINO 90 A=USR(1536):REM ESCRIBIRLO 100 GOTO 20
Para obtener más información sobre el control de los dispositivos, consulte la revista Antic de diciembre de 1984. Varias revistas han publicado programas BASIC para editar el disco por sectores. También existen buenos programas de dominio público de este tipo en el Atari SIG de CompuServe.
769 |
301 |
Número actual del dispositivo que está siendo utilizado.
771 |
303 |
Estado = 1 significa bueno.
784,785 |
310,311 |
Valor final del temporizador de velocidad en baudios.
832-959 |
340-3BF |
Cuadro de direcciones de IOCB
Etiqueta | IOCB0 | IOCB1 | IOCB2 | IOCB3 | IOCB4 | IOCB5 | IOCB6 | IOCB7 | Uso |
ICHID | 832 | 848 | 864 | 880 | 896 | 912 | 928 | 944 | índice |
ICDNO | 833 | 849 | 865 | 881 | 897 | 913 | 929 | 945 | # dispositivo |
ICCOM | 834 | 850 | 866 | 882 | 898 | 914 | 930 | 946 | comando |
ICSTA | 835 | 851 | 867 | 883 | 899 | 915 | 931 | 947 | estado |
ICBAL/H | 836 | 852 | 868 | 884 | 900 | 916 | 932 | 948 | búfer |
ICPTL/H | 838 | 854 | 870 | 886 | 902 | 918 | 934 | 950 | poner búfer |
ICBLL/H | 840 | 856 | 872 | 888 | 904 | 920 | 936 | 952 | largo del búfer |
ICAX1 | 842 | 858 | 874 | 890 | 906 | 922 | 938 | 954 | # tarea |
ICAX2 | 843 | 859 | 875 | 891 | 907 | 923 | 939 | 955 | aux2 |
ICAX3 | 844 | 860 | 876 | 892 | 908 | 924 | 940 | 956 | sectorl |
ICAX4 | 845 | 861 | 877 | 893 | 909 | 925 | 941 | 957 | sectorh |
ICAX5 | 846 | 862 | 878 | 894 | 910 | 926 | 942 | 958 | # byte |
ICAX6 | 847 | 863 | 879 | 895 | 911 | 927 | 943 | 959 | aux6 |
1152-1405 |
480-57D |
Comienzo de la pila de 254 bytes usada para la verificación de la sintaxis del BASIC; $480 es un índice de entrada BASIC, $481 un índice de salida, $482 un contador de programa.
1536 |
600 |
En BASIC, cualquier E/S mayor a 128 bytes eliminará los últimos 128 bytes de la Página Seis. Esto se debe a que el búfer de E/S comienza en la ubicación 1408 ($580), tan solo 128 bytes por debajo de la Página Seis.
1792 |
700 |
A continuación se muestra una rutina rápida para leer el directorio de un disco en BASIC:
5 DIM R$(20) 10 OPEN #4,6,0,"D:*.*" 20 INPUT #4,R$:TRAP 60 30 PRINT R$ 40 IF R$(10,16)="SECTORS" THEN 100 50 GOTO 20 60 PRINT R$ 100 CLOSE #4Para introducir texto rápidamente en un archivo, seleccione Copy en el menú DOS y responda E:,D:nombrearchivo. Ahora puede escribir directamente en un archivo de disco. Finalice cada línea con RETURN y cierre el archivo con CTRL+3. Puede cambiar el texto con la tecla de retroceso, pero cada línea debe tener un RETURN para que sea válida.
Otra generalidad: los sectores del disco
En un sector de disco normal se tienen 128 bytes, del 0 al 127. Los últimos 3 bytes son reservados por DOS para:
Byte | Uso |
125 | Los 6 bits más a la izquierda corresponden al número de archivo (0-63, $3F); los 2 bits más a la derecha corresponden al siguiente número de sector (2 bits superiores) |
126 | Siguiente número de sector (8 bits inferiores del número de sector) |
127 | Número de bytes utilizados en este sector (0-125, $7D) |
El siguiente sector a leer se encuentra en un número de 10 bits: los 8 bits del byte 126 ($7E) y los 2 bits bajos del byte 125 ($7D). Esto significa que los 6 bits restantes del extremo izquierdo del byte 125 solo se pueden usar para contar hasta 63 (que, con 0, da un total de 64 nombres de archivo en un directorio). Esto se aplica al leer archivos enlazados, como programas BASIC o archivos de texto; los programas de arranque automático suelen ser secuenciales y no están enlazados de esta manera (ni tampoco los 4 primeros sectores de arranque, el VTOC ni los sectores del directorio). Cuando el siguiente sector es igual a 0, no hay más sectores para leer.
Un archivo binario siempre comienza con 255 ($FF) dos veces, y luego vienen 4 bytes: el byte menos significativo y el byte más significativo de las direcciones de inicio y fin, respectivamente, de los datos a continuación (es decir, si fueran 00 A0 00 B0, comenzaría en $A000 y terminaría en $B000). Cuando se carga una cantidad de bytes para completar el vector de carga, DOS asume que los siguientes 4 bytes son más vectores de dirección de inicio/fin y continuará ingresando los siguientes datos en la nueva dirección a menos que se alcance un EOF (Fin de Archivo). El control se devuelve al DOS al final de una carga, a menos que ingrese una nueva dirección de ejecución en las ubicaciones 736 y 737 ($2E0 y $2E1). Puede agregar un código como E0 02 E1 02 00 A0 a su archivo binario (4 bytes de dirección, seguidos por los datos apropiados: 2 bytes para llenar las dos ubicaciones especificadas), que en este caso hace que la nueva dirección de ejecución sea igual a $A000. Vea la revista COMPUTE! de marzo de 1982.
1801 |
709 |
Se puede configurar en un valor mayor a 7, pero solo desperdicia espacio de memoria.
1923 |
783 |
.... |
Almacena el número de unidad del archivo DUP.SYS. Si hace POKE aquí con el equivalente ASCII del número de unidad (por ejemplo, POKE 1923,50 para la unidad 2), al llamar a DOS desde el BASIC, DUP.SYS se cargará desde la unidad especificada en lugar de la predeterminada D1:. Para realizar un cambio permanente en su DOS, haga POKE con el número apropiado, vaya a DOS y escriba los archivos DOS en un nuevo disco.
3118 |
C2E |
.... |
Haga POKE con 0 en esta ubicación para cambiar solo el primero de los nombres de archivo coincidentes en caso de un error de duplicación en el directorio (normalmente, Renombrar cambia todos los archivos con el mismo nombre). Haga POKE con 184 ($B8) para restaurar. Obtenido del manual de OS/A+.
3460 |
D84 |
.... |
Bytes de desasignación del VTOC y del directorio; consulte las siguientes ubicaciones.
4226 |
1082 |
.... |
Byte menos significativo del sector del directorio actual (el primero de 8 sectores reservados). El directorio normalmente se ubica en los sectores 361-368. El número predeterminado es 105 ($69).
4229 |
1085 |
.... |
Byte más significativo del sector del directorio actual. Para cambiar la ubicación del directorio, primero copie los sectores actuales a la ubicación deseada (vea la ubicación 768 arriba) y luego introduzca la nueva ubicación del primer sector en el byte menos significativo/byte más significativo. Este y los siguientes 7 sectores se reconocerán como la nueva área del directorio. Finalmente, escriba el número del nuevo sector de inicio (número de sector/8 + 10) en la ubicación 3460 ($D84). Salga del BASIC y reescriba DOS en un disco recién formateado. Los discos DOS con las ubicaciones del directorio originales no pueden leer su directorio.
Directorio del disco
Formato de una entrada de directorio:
Byte | Uso |
0 | Bandera: |
$00 Entrada nueva (nunca usada) | |
$01 Archivo abierto para E/S | |
$02 Archivo creado por DOS 2 | |
$20 Archivo bloqueado (protegido) | |
$40 Archivo en uso (normal) | |
$80 Archivo eliminado | |
1-2 | Número de sectores en el archivo |
3-4 | Número de sector inicial (byte menos significativo/byte más significativo) |
5-12 | Nombre de archivo (espacio o $20 si está en blanco) |
13-15 | Extensión |
4264 |
10A8 |
.... |
Byte menos significativo del VTOC actual (Tabla de contenido del volumen: solo un sector reservado).
4266 |
10AA |
.... |
Byte más significativo del sector VTOC, normalmente el sector 360. El VTOC es un mapa de bits del contenido del disco; después de los bytes de estado inicial, cada uno de los bits siguientes representa un sector del disco en orden secuencial. Se tienen 720 sectores, pero el Sistema Operativo no puede acceder al sector 0. Los sectores 1 al 4 están reservados como sectores de arranque en un disco DOS; los sectores 360 al 368 están reservados para el VTOC y el directorio, dejando el 707 libre para archivos. Puede mover el VTOC de la misma manera que mueve el directorio. Si cambia la ubicación del directorio (primero asegúrese de que no haya nada que no le importe borrar en la nueva ubicación), acceda al VTOC y desasigne los sectores originales del directorio (escriba un 1 en los bits) y escriba un 0 en los bits que representan la nueva ubicación; esto evitará que se sobrescriban. También puede bloquear sectores desasignándolos en el VTOC.
Tabla de contenidos del volumen
Byte | Uso |
0 | Código DOS (0 = DOS 2.0) |
1-2 | Número total de sectores (707; $2C3) |
3-4 | Número de sectores actualmente no utilizados |
5 | Reservados (sin uso en la actualidad) |
6-9 | Sin uso |
10-99 | Mapa de bits: un bit para cada sector (0=en uso--bloqueado; 1=sin usar--libre). El bit más a la izquierda del byte 10 ($0A) es el sector #0 (vea la ubicación de arriba), el siguiente bit a la derecha es el sector #1, y así sucesivamente, hasta el bit más a la derecha del byte 99 ($63), que es el sector 719 ($2CF). |
100-127 | Sin uso |
Sólo hay 707 sectores contabilizados en los bytes 1 y 2 (y no 720). Dado que los primeros 4 son sectores de "arranque", el VTOC y el directorio toman otros 9, para hacer un total de 13.
Un VTOC típico de DOS 2.0 con DOS.SYS y DUP.SYS, pero nada más excepto los sectores de arranque, VTOC y directorio en uso, se ve así:
Byte
0 | 02 | C3 | 02 | 50 | 02 | 00 | 00 | 00 |
8 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
16 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
24 | 01 | FF | FF | FF | FF | FF | FF | FF |
32 | FF | FF | FF | FF | FF | FF | FF | FF |
40 | FF | FF | FF | FF | FF | FF | FF | FF |
48 | FF | FF | FF | FF | FF | FF | FF | 00 |
56 | 7F | FF | FF | FF | FF | FF | FF | FF |
64 | FF | FF | FF | FF | FF | FF | FF | FF |
72 | FF | FF | FF | FF | FF | FF | FF | FF |
80 | FF | FF | FF | FF | FF | FF | FF | FF |
88 | FF | FF | FF | FF | FF | FF | FF | FF |
96 | FF | FF | FF | FF | 00 | 00 | 00 | 00 |
104 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
112 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
120 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
El VTOC es el bit más a la izquierda del byte 55 ($37), y los sectores del directorio son el resto del byte más el bit más a la izquierda del byte 56 ($38). Los 4 bits más a la izquierda del byte 10 ($0A) son los sectores de arranque, y el resto de los bytes hasta los 7 bits más a la izquierda del byte 24 ($18) inclusive, son utilizados por DOS y DUP. Recuerde que los últimos 3 bytes del VTOC y del directorio no son bytes de estado.
Los directorios del disco y el VTOC (así como muchos otros misterios y curiosidades sobre los discos) se explican en detalle en el libro de COMPUTE! Books "Inside de Atari DOS" de Bill Wilkinson, y se analizan en detalle en el libro "Atari Software Protection Techniques" de George Morrison (Alpha Systems, 1983).
4856 |
12F8 |
Debería decir "tipo de unidad", y no "unidad de cinta".
5446,5450 |
1546,154A |
Byte menos significativo y byte más significativo de la dirección que la rutina de arranque en caliente coloca en 10 y 11 (DOSVEC). Introduzca aquí la dirección de la rutina de control RESET para que siempre la vuelva a cargar en DOSVEC al pulsar la tecla RESET. Apunte a 6047 ($179F); una llamada USR a 6047 carga el DUP y le envía al menú del DOS.
5576 |
15C8 |
.... |
Puede ejecutar algunos programas en lenguaje de máquina desde el BASIC escribiendo OPEN #1,4,0, "D:nombre_archivo" y luego X=USR(5576). Si después regresa al BASIC, haga CLOSE al canal.
40960 |
A000 |
Un USR aquí inicia en frío el cartucho BASIC. Si se le da bien el código de máquina, puede añadir comandos a BASIC capturando las pulsaciones de las teclas antes de que lleguen al editor. Charles Brannon describe cómo hacerlo (con un buen programa de comandos) en el libro COMPUTE!'s Third Book of Atari.
53260 |
D00C |
Haga POKE con 255 en esta ubicación para cuadruplicar el tamaño de todos los missiles.
53268 |
D014 |
Los sistemas NTSC tienen 60 fotogramas por segundo y 262 líneas por fotograma; los sistemas PAL tienen 50 fotogramas y 312 líneas. Debería decir "13 decimal", y no 14.
53768 |
D208 |
Las frecuencias se redondean; en realidad son 63,9210 kilohercios, 15,6999 kilohercios y 1,78979 megahercios. Puede usar la frecuencia para calcular la frecuencia de interrupción de POKEY mediante INTFREQ = frecuencia de reloj/(2 * (1 + valor en el registro AUDF para ese canal)).
El libro COMPUTE!'s Third Book of Atari contiene artículos de Matt Giwer y Fred Tedsen sobre el uso de POKEs para controlar los efectos de sonido, los canales de audio y AUDCTL.
53770 |
D20A |
Por ejemplo, un número aleatorio entre 0 y 9 es INT(PEEK(53770)*10/256) y un número aleatorio entre 0 y 99 es INT(PEEK(53770)*100/256).
54272 |
D400 |
Haga POKE con 0 en esta ubicación para dejar la pantalla en blanco.
54286 |
D40E |
Haga POKE con 0 en esta ubicación para desactivar el VBLANK y el reloj del sistema. El procesamiento de los registros sombra se suspende. Para ver cómo bloquear la tecla RESET en BASIC, vea la página 254 de la revista COMPUTE! de junio de 1983.
57344 |
E000 |
Vea la página 226 de la revista COMPUTE! de junio de 1983.
58368-58447 |
E400-E44F |
Cada vector consta de una tabla de 15 bytes, con 2 bytes para cada una de las direcciones de OPEN (abir), CLOSE (cerrar), GET (obtener) byte, PUT (poner) byte, GET Status y la rutina SPECIAL. Los siguientes 3 bytes corresponden a una instrucción JMP seguida de la dirección de la rutina de inicialización de ese controlador. Un 0 separa a los controladores (byte 16). A continuación, se muestran las ubicaciones de cada rutina en la tabla:
Controlador | ABRIR | CERRAR | OBTENER | PONER | Estado | Especial | JMP |
E: | E400 | E402 | E404 | E406 | E408 | E40A | E40C |
58368 | 58370 | 58372 | 58374 | 58376 | 58378 | 58380 | |
S: | E410 | E412 | E414 | E416 | E418 | E41A | E41C |
58384 | 58386 | 58388 | 58390 | 58392 | 58394 | 58396 | |
K: | E420 | E422 | E424 | E426 | E428 | E42A | E42C |
58400 | 58402 | 58404 | 58406 | 58408 | 58410 | 58412 | |
P: | E430 | E432 | E434 | E436 | E438 | E43A | E43C |
58416 | 58418 | 58420 | 58422 | 58424 | 58426 | 58428 | |
C: | E440 | E442 | E444 | E446 | E448 | E44A | E44C |
58432 | 58434 | 58436 | 58438 | 58440 | 58442 | 58444 |
58451 |
E453 |
Obtiene su información de los bytes en la parte inferior de la Página Tres ($300) para su funcionamiento. Los vectores entre las ubicaciones 58448 y la 58496 ($E450-$E480) son todos de 3 bytes; una instrucción JMP seguida de una dirección en formato byte menos significativo/byte más significativo.
58454 |
E456 |
Página 147: Número de IOCB multiplicado por 16 en el registro X. El registro X se convierte en el número de canal CIO. Dado que la pantalla siempre está abierta para el canal #0, al usarla, el registro X también se convierte en 0. Bill Wilkinson explica que para generar un solo carácter a través del CIO en lugar de un búfer completo (lo habitual), se debe establecer la longitud del búfer en 0. Esto obliga a la E/S a ingresar o generar solo un carácter. Vea la revista COMPUTE! de enero de 1985.
58457 |
E459 |
Estos son los pines para el conector de E/S en serie:
__________________________ / \ / 2 4 6 8 10 12 \ / \ / 1 3 5 7 9 11 13 \ /__________________________________\
1 Entrada de reloj | 2 Salida de reloj |
3 Entrada de datos | 4 Tierra |
5 Salida de datos | 6 Tierra |
7 Comando | 8 Control del motor |
9 Proceder | 10 + 5 V CC/Listo |
11 Entrada de audio | 12 +l2v dc |
13 Interrupción |
58484 |
E474 |
Ejecute un comando USR con esta ubicación para iniciar en caliente la computadora.
58487 |
E477 |
Ejecute un comando USR con esta ubicación para iniciar en frío la computadora.
59280,81 |
E790,91 |
? |
Parece ser la misma dirección del vector DLI de las ubicaciones 512 y 513.
Modos gráficos GTIA
Los modos gráficos 9, 10 y 11 son exclusivos del chip GTIA; el chip CTIA inicial no los incluye. Por supuesto, el GTIA ahora es estándar en todos los modelos 400, 800, XL y XE posteriores. Todos los modos GTIA utilizan 8.138 bytes de RAM, tienen una resolución de pantalla completa de 80 x 192 (sin ventana de texto) y no tienen color de borde. Cada píxel es un rectángulo ancho, pero corto, con una relación de 4:1 entre el ancho y el alto. Cada píxel utiliza 4 bits. Aquí tiene una pequeña tabla que resume estos modos.
GR# | Colores | SETCOLOR | Registros | |
9 | 1 (16 lum) | 4 | 712 | Utilice el comando COLOR (0-15) para la luminancia |
10 | 9 | 0 | 704 | Se debe usar POKE |
1 | 705 | Se debe usar POKE | ||
2 | 706 | Se debe usar POKE | ||
3 | 707 | Se debe usar POKE | ||
4 | 708 | Usar COLOR 0 | ||
5 | 709 | COLOR 1 | ||
6 | 710 | COLOR 2 | ||
7 | 711 | COLOR 3 | ||
8 | 712 | COLOR 4 (BAK) | ||
11 | 1 (16 tonos) | 4 | 712 | Utilice el comando COLOR (0-15) para el tono |
Se ha publicado información sobre los modos GTIA en numerosos libros y revistas, incluyendo los libros "De Re Atari" y "Your Atari Computer" de Poole et al. (ya está disponible una edición revisada de este último). En el artículo de David Sander de la revista Antic de abril de 1983 puede encontrar un ejemplo de cómo añadir una ventana de texto a una pantalla GTIA mediante un DLI.