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 N
Ahora abra un canal para escribir en el disco (OPEN #4,8,0, "D:filename.ext"). Encuentre RAMTOP (FIN = PEEK(106) * 256 - 160), restando 160 bytes en caso de tener una ventana de texto. Encuentre la dirección de la lista de despliegue (DLIST = PEEK(560) + 256 * PEEK(561): INICIO = PEEK(DLIST + 4) + 256 * PEEK(DLIST + 5): ALTO = INT(INICIO/256): BAJO = INICIO - 256 * ALTO) e introdúzcala en la ubicación correcta en el IOCB (POKE 900,BAJO: POKE 901,ALTO).

A continuación, calcule la longitud de la pantalla (TAMANO = (FIN - INICIO) + 1: TAMANOA = INT(TAMANO/256): TAMANOB = TAMANO - 256 * B1), e introdúzcala en el IOCB usando POKE (POKE 904,TAMANOB: POKE 905,TAMANOA). Haga POKE en el IOCB con el comando "guardar binario" (POKE 898,11). Llame al CIO con el comando USR (X=USR(ADR(ML$),4 * 16)). Finalmente, guarde el modo gráfico actual (MODO = PEEK(87): PUT #4,MODO) y los registros de color (FOR N = 708 TO 712; PUT #4,PEEK(N): NEXT N) y haga CLOSE #4.

Para recuperar la pantalla, utilice la misma rutina USR y los PEEK y POKEs anteriores, pero haciendo POKE 898,7 en vez de 11. Esto se derivó de un programa más extenso de Fred Pinto en la edición de marzo de 1984 de la revista Antic. Un artículo de Steve Kaufman en la revista COMPUTE! de noviembre de 1983 presenta un método rápido y sencillo que funciona igual de bien (guardar y cargar), pero no guarda los registros de color. La revista Creative Computing de noviembre de 1983 también tiene un ejemplo similar en su sección "Outpost Atari".

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 #4
Para 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:

ByteUso
125Los 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)
126Siguiente número de sector (8 bits inferiores del número de sector)
127Nú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:

ByteUso
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

ByteUso
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.