Mapping the Atari - Revised Edition, por Ian Chadwick
APÉNDICE UNO
PROCESO VBLANK
Todas las rutinas VBLANK están documentadas en las páginas 35 a la 38 del listado del Sistema Operativo. En la ROM "A", se procesan en las ubicaciones 59345 a la 59665 ($E7D1 a la $E911). En la ROM "B", se procesan en las ubicaciones 59310 a la 59628 ($E7AE a la $E8EC). Para más información, vea también el libro De Re Atari.
Etapa 1 del VBLANK:
Se ejecuta en cada VBI:
1) Incrementar el reloj de tiempo real en las ubicaciones 18 a la 20 ($12 a la $14).
2) Procesar las variables del modo atracción (ubicación 77; $4D).
3) Decrementar el temporizador del sistema en la ubicación 536 ($218) y, si es igual a 0, haga un JSR a la dirección almacenada en la ubicación 550 ($226).
Etapa 2 del VBLANK:
Se ejecuta en cada VBI siempre y cuando no se interrumpen secciones críticas:
1) Actualizar los registros hardware a partir de los registros sombra, de la siguiente manera:
Sombra: | Hardware: | Motivo de la actualización: |
SDLSTL/H35 | DLISTL/H | FIN DE LISTA DE DESPLIEGUE |
SDMCTL | DMACTL | |
CHBAS | CHBASE | |
CHACT | CHACTL | |
GPRIOR | PRIOR | |
COLOR0-4 | COLPF0-3,BAK36 | MODO DE ATRACCIÓN |
PCOLR0-337 | COLPM0-3 | |
LPENV38 | PENV39 | LÁPIZ DE LUZ |
STICK0-1 | PORTA | JOYSTICKS |
PTRIG0-3 | PORTA | BOTONES DE LOS PADDLES |
STICK2-3 | PORTB | |
PTRIG4-7 | PORTB | |
PADDL0-7 | POT0-7 | PADDLES |
STRIG0-3 | TRIG0-3 | BOTONES DEL JOYSTICK |
.... | CONSOL | APAGADO DEL ALTAVOZ DE LA CONSOLA |
2) Los temporizadores del sistema del #2 al #5 (ubicaciones 538, 540, 542 y 544; $21A, $21C, $21E y $220)40 se decrementan y, si el valor es igual a 0, se activan las bandera correspondientes. Si el temporizador #2 es igual a 0, se realiza una secuencia de comandos JSR usando la dirección almacenada en la ubicación 552 ($228).
3) Se lee un carácter del registro de teclado POKEY en la ubicación 53769 ($D209) y se lee CH en la ubicación 764 ($2FC), si la repetición automática está activa.
4) El contador de rebote del teclado se decrementa en 1 si es distinto de 0 y si no se pulsa ninguna tecla.
5) Se procesa la lógica de repetición automática del teclado.
6) Se sale de la rutina VBLANK usando la dirección almacenada en la ubicación 58466 ($E462).
35 En el libro original, dice SDLISTL/H en vez de SDLSTL. (N. del T.)
36 En el libro original, dice COLPF0-4,BAK en vez de COLPF0-3,BAK. (N. del T.)
37 En el libro original, dice PCOL0-3 en vez de PCOLR0-3. (N. del T.)
38 En el libro original, dice LPCNV/H en vez de LPENV. (N. del T.)
39 En el libro original, dice PENV/H en vez de PENV. (N. del T.)
40 En el libro original, se omite la ubicación del temporizador #2: 538, $21A. (N. del T.)
APÉNDICE DOS
MAPA DE MEMORIA GRÁFICO
Este diagrama no está a escala; su objetivo es simplemente ofrecer una idea visual de la estructura de la memoria del Atari. Los números a la derecha son los punteros de memoria: estas ubicaciones apuntan a las direcciones mostradas. Los números a la izquierda son las ubicaciones reales en la memoria.
Ubicación Contenido Punteros +---------------------------------------------------------------------+ 65535 _______ | Parte superior de la memoria_______________________________________ | | ROM del Sistema Operativo | | | 60906-65535 | Rutinas de los controladores de dispositivos 794-831 HATABS | 59716-60905 | Utilidades de Entrada/Salida Serie (SIO) | 59093-59715 | Controlador de las interrupciones 512,513 VDSLST | | 514-527 Vectores | 58534-59092 | Utilidades de la Entrada/Salida Central (CIO) | | | | | 58533 _______ | Vectores del Sistema Operativo_____________________________________ | 58496-58533 | Vectores iniciales del la RAM al encender el equipo | 58448-58495 | Vectores de JMP | 58432-58447 | Cassette | 58416-58431 | Impresora | 58400-58415 | Teclado | 58384-58399 | Pantalla | 58368-58383 | Editor | | | | | 58367 _______ | Juego de caracteres en ROM __________________ 756 CHBAS ____________| | | | | 57344 | | | | | | 57343 _______ | ROM del Paquete de Coma Flotante | | | | | 55295 _______ | Chips de E/S_______________________________________________________ | | | | | 54784-55295 | Sin uso | 54272-54783 | ANTIC 756 CHBAS | | 755 CH1 | | 564-565 LPEN | | 560-561 SDLSTL | | 559 SDMCTL | 54016-54271 | PIA 636-639 PTRIG# | | 632-635 STICK# | 53760-54015 | POKEY 624-631 PADDL# | | 562 SSKCTL | | 16 POKMSK | 53504-53759 | sin uso | 53248-53503 | GTIA o CTIA 704-707 PCOLR# | | 708-712 COLOR# | | 644-647 STRIG# | | 623 GPRIOR | | | | | 53247 _______ | Bloque ROM de 4K sin uso___________________________________________ | | | | | 49151 _______ | ROM del BASIC de 8K | | o cartridge izquierdo (A) | | | | | 40959 _______ | Parte superior de la RAM del BASIC 106 RAMTOP | ______________|_____________________________________________________________________| | 740 RAMSIZ | | | | o ROM del cartidge izquierdo (B), si está presente | | (Sólo en el Atari 800) | | | | | El tamaño y | | la ubicación | | varían con el | | modo GRAPHICS | | | | | RAM de pantalla de la ventana de texto 60,661 TXTMSC | | 40800 para el modo GRAPHICS 0 | | | | Fondo de la RAM de la pantalla 88,89 SAVMSC | | 40000 para el modo GRAPHICS 0 | | | | Lista de Despliegue: 560,561 SDLSTL | | 39968 para el modo GRAPHICS 0 | | | | Parte superior de la RAM del BASIC 741,742 MEMTOP | (SO) | | | | | | | | 32768 | | | | | | 32767 _______ | RAM de los programas del usuario___________________________________ | | | | La cantidad de RAM se puede determinar mediante: | | PRINT FRE(0) | | | | El fondo varía: vea la nota abajo | (13062) | Depende del área asignada a los búfers. | | | | | | RAM usada por el DOS y por el Administrador del Sistema de Archivos | | | | 144,145 MEMTOP | | Pila de FOR-NEXT y GOSUB 142,143 RUNSTK | | 14,15 APPMHI | El tamaño y | | la ubicación | | varían con | | el tamaño del | | programa | | | Tabla de cadenas y arreglos y | | fin del programa BASIC 140,141 STARP | | | | | | área del programa | | BASIC | | | | | | Tabla de sentencias: 136,137 STMTAB | | Comienzo del programa BASIC | | Tabla de valores de variables 134,135 VVTP | | | | VNTP + 1 132,133 VNTD | | | | Tabla de nombres de variables 130,131 VNTP | | | (7420) | Fondo de la memoria del BASIC 743,744 MEMLO | | 128,129 LOMEM | | | | Búfers de sectores 4921,4937 SABUFL/H | 6781 | Búfers de dispositivos y sectores 4905,4913 DBUFA1/H | 6047 | Vector del DOS 10,11 DOSVEC | 5440 | Inicio del DUP.SYS | | | 5377 | Búfer del VTOC | | Inicialización del DOS 12,13 DOSINI | | o RAM del BASIC sin (743,744 MEMLO) | | DOS residente (128,129 LOMEM) | | RAM del FMS | 1792 | Comienzo del DUP.SYS | | | | | 1791 ________ | RAM usada por el OS y el cartucho. | | (hasta el fondo de la RAM) | | | | RAM de la Página Seis | | | | +---------------------------------------------------------+ | 1535 ____ | RAM usada por BASIC ___________________________________ | | | (hasta el fondo de la RAM) | | | | | 1406 | RAM de la Coma Flotante | | 1405 | RAM del BASIC | | | | | | +-------------------------------------------------+ | | 1151 | RAM del Sistema Operativo | | | | | | | | | | | | Búfer del Cassette | | | | | | | | Búfer de la Impresora | | | | | | | | IOCB's | | | | | | | 512 | | | | | ______________________________________________ | | | 511 | Pila | | | | | | | | | | | | | | | 256 | | | | | ______________________________________________ | | | 255 | RAM de la Página Cero del BASIC | | | | | | | | Página Cero de la Coma Flotante | | | | | | | | Página Cero del cartucho Assembler | | | | | | | | | | | | | | | | | | | 128 | | | | | ______________________________________________ | | | 127 | RAM de la Página Cero del SO | | | | | | | | | | | | IOCB de la Página Cero | | | | | | | | | | | 0 | Fondo de la memoria | +-----------+-------+-------------------------------------------------+Notas
El límite inferior de la RAM del BASIC depende de si tiene o no cargados los archivos del DOS. Sin DOS, 0LOMEM debería ser igual a 1792; con DOS, 7420. Si aumenta o disminuye el número de búferes de disco y sector modificando DOS, este valor cambiará de nuevo. Consulte las ubicaciones 0743, 744 y 01801, 01802.
El tamaño y la ubicación de las tablas de variables, cadenas y matrices dependen del uso y el tamaño de su programa. Cuantas más variables y matrices, mayor será la memoria que utilizan estas tablas.
El tamaño y la dirección de la Lista de Despliegue y la memoria de pantalla dependen del modo gráfico en uso.
Los primeros 256 bytes a los que apunta LOMEM corresponden al búfer de salida del token. El programa BASIC comienza en la dirección a la que apunta VNTP.
APÉNDICE TRES
EQUIVALENCIAS DE TIEMPO EN EL ATARI
Frecuencia de reloj = 1,79 MHz
1 ciclo de máquina = 0,558 µsegundos
1 fotograma = 1/60 de segundo
Líneas de escaneo = 262 / fotograma
Relojes de color = 228 / línea de escaneo
Relojes de color = 2 / ciclo de máquina
Ciclos de máquina = 29.868 / fotograma
Ciclos de máquina = 114 / línea de escaneo
Tiempo del VBLANK = 7.980 ciclos de máquina o menos, dependiendo del modo gráfico. La instrucción del 6502 más corta requiere 2 ciclos; durante ese tiempo, el haz de electrones mueve 4 relojes de color.
Tiempo del blanqueo horizontal:
Campo de juego ancho: 18 ciclos de máquina
Campo de juego normal: 34 ciclos de máquina
Campo de juego estrecho: 50 ciclos de máquina
Para obtener más información sobre el conteo de ciclos, consulte el Manual del hardware.
APÉNDICE CUATRO
LA ROM VIEJA (A) Y LA ROM NUEVA (B)
A lo largo del libro se ha mencionado la ROM nueva del Sistema Operativo. Se corrigieron algunos errores del sistema operativo anterior, pero también se cambiaron algunas ubicaciones de la ROM. El resultado es un sistema operativo mejorado, pero es posible que parte del software anterior que accede a las ubicaciones de la ROM antigua no funcione con la nueva.
Hay 2 maneras de comprobar si tiene la ROM nueva o antigua: una es hacer PEEK en la ubicación 58383, tal como se describe allí. La otra (la solución hardware) es extraer la tarjeta ROM41, desatornillar la tapa metálica y mirar dentro. Si los dos chips que tiene a la izquierda tienen una "A" después de su primer número de código, entonces tiene la ROM antigua. Si tienen una "B", ¡qué suerte! Tiene la ROM más reciente. También existe la prueba empírica: si la unidad se queda sin tiempo durante las operaciones de E/S, entonces tiene la ROM antigua.
Estas son las diferencias entre las ubicaciones de las ROM nueva y antigua. También se han realizado varios cambios en la ROM nueva en los vectores de las ubicaciones 512 a la 534, 546 a la 549 y 550. Para obtener más información, consulte estas ubicaciones y las ubicaciones del sistema operativo. La lista a continuación especifica primero las ubicaciones de la ROM antigua y luego los cambios en la ROM nueva.
55296-57343 (paquete FP) igual
57344-58367 (conjunto de caracteres) igual
58368-58477 (tablas vectoriales) son iguales a 58459 ($E45B), donde hay cambios en la tabla entre las ubicaciones 58460 a la 58466 ($E45C a la $E462).
58467-59092 ($E463-$E6D4) igual
59093 ($E6D5) es el inicio del controlador de IRQ. Los cambios en las ROM nueva comienzan en la ubicación 59126 ($E6F6) y continúan hasta el final del nuevo controlador de IRQ en la ubicación 59280 ($E790).
59316 ($E7B4) corresponde al controlador de interrupciones NMI en la ROM antigua, que ahora comienza en la ubicación 59281 ($E791). Es igual al de la versión anterior, pero se ha reducido en 35 bytes.
59345 ($E7D1) marca el inicio de las rutinas de VBLANK en la ROM antigua; ahora comienzan en la ubicación 59310 ($E7AE) en la ROM nueva. Las rutinas permanecen iguales hasta que se llega a la rutina SETVBL en la ubicación 59666 ($E912) en la ROM antigua, y en la ubicación 59629 ($E8ED) en la ROM nueva. Los cambios en la rutina de VBLANK se deben principalmente a la adaptación al desplazamiento (shift) de las nuevas ubicaciones de memoria.
58457 ($E459) es el punto de entrada SIO para ambas versiones. Se han realizado cambios en las rutinas SIO para adaptarse a las nuevas ubicaciones de memoria, pero el punto de entrada sigue siendo el mismo.
60048 ($EA90) Se ha modificado la rutina de servicio de interrupción de datos de salida necesarios, pero el punto de entrada es el mismo en ambas versiones.
60113 ($EAD1) La rutina de servicio de interrupción de transmisión realizada es la misma, pero tiene un nuevo punto de entrada, en la ubicación 60111 ($EACF).
60130 ($EAE2) La rutina de recepción tiene algunos cambios de dirección y se ha movido a la ubicación 60128 ($EAE0).
60177 ($EB11) La rutina de servicio de interrupción de entrada serie lista es la misma, pero el nuevo punto de entrada está en la ubicación 60175 ($EB0F).
60222 ($EB3E) Las subrutinas SIO tienen algunos cambios y un nuevo punto de entrada está en la ubicación 60220 ($EB3C).
60270 ($EB6E) La subrutina de carga del búfer es la misma, pero se ha movido a la ubicación 60266 ($EB6A).
60292 a la 60905 ($EB84 a la $EDE9): todas las rutinas en esta área son iguales, pero tienen puntos de entrada 4 bytes más abajo en la ROM (es decir, en la ubicación 60288; $EB80).
60906 a la 62014 ($EDEA a la $F23E): estas rutinas son iguales y se encuentran en las mismas ubicaciones en ambas versiones.
62015 ($F23F): la prueba de RAM y de cartucho especial tiene el mismo punto de entrada, pero presenta algunos cambios.
62038 ($F256): la subrutina de verificación de la RAM tiene cambios y un nuevo punto de entrada, ahora en la ubicación 62036 ($F254).
62081 ($F281): las rutinas de inicialización del hardware tienen cambios y un nuevo punto de entrada, en la ubicación 62071 ($F277) en las ROM nueva. Los cambios continúan hasta la ubicación 62159 ($F2CF), donde todo vuelve a ser igual para ambas versiones, hasta el final de la ROM, en la ubicación 65535 ($FFFF).
41 Sólo el modelo 800 funciona con tarjetas extraíbles para la RAM y la ROM del Sistema Operativo. En el modelo 400, es necesario abrir la carcaza del computador para tener acceso a dichas tarjetas. (N. del T.)
APÉNDICE CINCO
EL COLOR
El color es un aspecto muy importante en los computadores Atari; puede que no lo aprecie por completo, a menos que haya pasado mucho tiempo trabajando con computadores o monitores monocromáticos. El Atari cuenta con 16 colores disponibles para mostrar en 8 factores de luminancia (brillo) diferentes. Estos colores se almacenan en las ubicaciones de memoria de la 704 a la 712. Los primeros 4 de estos registros se utilizan para determinar el color de los players y missiles. Los siguientes 5 determinan el color de los campos de juego, el fondo, las líneas dibujadas y las áreas con relleno.
El Atari tiene un valor predeterminado para cada uno de los 5 registros del campo de juego, que se asigna al encender el equipo:
Campo de juego | Ubicación | Color | Valor |
0 | 708 | Naranja | 40 |
1 | 709 | Verde claro | 202 |
2 | 710 | Azul oscuro | 148 |
3 | 711 | Rojo | 70 |
4 (BAK) | 712 | Negro | 0 |
La cifra en la categoría de valor representa el número que se obtiene si se hace PEEK en esa ubicación. Para obtener información sobre las ubicaciones, consulte el Mapa de Memoria.
Para cambiar estos colores, puede usar una instrucción POKE o el comando SETCOLOR (abreviado como SE.) del BASIC. Consulte la descripción en el texto anterior sobre el Mapa de Memoria. SETCOLOR tiene 3 parámetros: el registro a cambiar (que siempre corresponde a una de las ubicaciones de memoria mencionadas), el tono (un número del 0 al 15 que corresponde a los colores disponibles), y la luminancia (un número par entre el 0 y el 14). En cuanto a luminancia, su Atari tratará cualquier número impar como si fuera el siguiente número par más bajo. Su instrucción podría ser similar a esta:
SETCOLOR 0,2,8Esto produce el color naranja en el campo de juego #0. Para cambiarlo a rojo, haga:
SETCOLOR 0,4,6
No verá ningún cambio al usar SETCOLOR, a menos que cambie el fondo o el borde, o un registro que ya se haya usado para dibujar en la pantalla. El efecto se produce al ejecutar el comando COLOR, indicando al Atari qué registro usar para el comando DRAWTO o el comando de relleno. Usando esta fórmula puede aplicar fácilmente el valor de color correcto con POKE:
COLOR = TONO * 16 + LUMINANCIAPor lo tanto, el naranja del ejemplo anterior se obtiene haciendo:
POKE 708,40y el rojo haciendo:
POKE 708,70Estos son los valores que aparecen en la tabla anterior. Es muy sencillo cambiarlos a sus propios colores con cualquiera de los 2 métodos. Por supuesto, tendrá que ajustar los colores cada vez que cambie de modo gráfico o pulse la tecla RESET, ya que ambos restablecen los registros a sus valores predeterminados. Además, los registros de player/missile solo se pueden cambiar con POKEs; no tienen comandos SETCOLOR correspondientes y todos están preestablecidos en 0. La edición del invierno de 1981/82 de The Atari Connection, la publicación de Atari Inc., incluye una pequeña tabla a todo color que muestra todos los colores disponibles. El número SETCOLOR de la siguiente lista es el valor que debe colocar como segundo número en la instrucción, justo después del número de registro.
Color | número de SETCOLOR | número de POKE |
Negro | 0 | 0 |
Óxido | 1 | 16 |
Rojo anaranjado | 2 | 32 |
Naranja oscuro | 3 | 48 |
Rojo | 4 | 64 |
Lavanda oscuro | 5 | 80 |
Azul cobalto | 6 | 96 |
Azul ultramar | 7 | 112 |
Azul medio | 8 | 128 |
Azul oscuro | 9 | 144 |
Gris azulado | 10 | 166 |
Verde oliva | 11 | 176 |
Verde medio | 12 | 192 |
Verde oscuro | 13 | 208 |
Verde anaranjado | 14 | 224 |
Naranja | 15 | 240 |
El siguiente número en la instrucción SETCOLOR es la luminancia. Se suma el valor de luminancia al número del POKE.
Al usar los comandos DRAWTO o XIO 18 (relleno), primero se debe especificar el registro de color a usar con el comando COLOR. Lo que suele resultar confuso para la mayoría de las personas es que el número del comando COLOR no corresponde al mismo número del registro SETCOLOR y, para colmo, ¡no siempre es el mismo número en los diferentes modos gráficos! Los modos 0, 1 y 2 son modos de texto; imprimen caracteres en la pantalla en lugar de gráficos, por lo que no se usa el comando COLOR en estos modos. En GRAPHICS 0, solo se tiene un color, determinado por SETCOLOR 2. La luminancia se ignora en este comando y, en su lugar, se establece con SETCOLOR 1, donde se ignora el color. Puede usar SETCOLOR para cambiar los colores del texto y el fondo, tal como se indica a continuación:
GRAPHICS 0 | SETCOLOR | Registro |
Luminancia del caracter | 1 | 709 |
Fondo | 2 | 710 |
Borde (BAK) | 4 | 712 |
GRAPHICS 1 y 2 | SETCOLOR | Registro |
Mayúsculas y números | 0 | 708 |
Minúsculas | 1 | 709 |
Mayúsculas en video inverso | 2 | 710 |
Minúsculas en video inverso | 3 | 711 |
Fondo, borde | 4 | 712 |
Para dibujar o rellenar un área en los modos del 3 al 8, debe usar la instrucción COLOR adecuada para el registro SETCOLOR:
GRAPHICS 3, 5, 7 Modos de 4 colores | SETCOLOR | COLOR | Registro |
Punto gráfico o área de relleno | 0 | 1 | 708 |
1 | 2 | 709 | |
2 | 3 | 710 | |
Fondo, borde | 4 | 0 | 712 |
GRAPHICS 4, 6 Modos de 2 colores | SETCOLOR | COLOR | Registro |
Punto gráfico | 0 | 1 | 708 |
Fondo, borde | 4 | 0 | 712 |
GRAPHICS 8 1 color, 2 luminancias | SETCOLOR | COLOR | Registro |
Luminancia del gráfico | 1 | 1 | 709 |
Color de fondo | 2 | 0 | 710 |
Borde | 4 | - | 712 |
Es un método complejo, pero no es difícil de usar. Deberá consultar esta tabla o la tabla de la página 53 de su Manual de Referencia BASIC hasta que le agarre el truco. Recuerde preceder cualquier instrucción COLOR con un SETCOLOR en algún lugar de su programa y preceder un DRAW o XIO 18 con una instrucción COLOR; de lo contrario, el computador usará el registro previamente designado.
El chip GTIA presenta cierta confusión: en GRAPHICS 10, el registro 704 almacena el color del fondo, mientras que el 712 se usa como un registro de color normal. Esto significa que debe cambiarlo con un POKE en lugar de una instrucción SETCOLOR. Sin embargo, en los otros 2 modos GTIA (GR.9 y GR.11), aún se usa la ubicación 712, SETCOLOR 4, para el fondo; vea los ejemplos de los modos GTIA en la ubicación 623.
Con GRAPHICS 9, el comando COLOR se usa para establecer el nivel de luminancia en uno de los 16 valores posibles; el valor que se usa con la instrucción COLOR es igual a la luminancia utilizada (por lo que se puede tener COLOR 15, COLOR 10, etc. De hecho, se puede usar cualquier valor hasta 255 con COLOR sin obtener un mensaje de error; consulte el programa de demostración de GR.11 en la ubicación 623). SETCOLOR 4 define el color de fondo y de los gráficos. Solo hay un color en GRAPHICS 9. En GRAPHICS 11, COLOR se usa para definir el color de la misma manera que se usa para la luminancia en GRAPHICS 9, mientras que la luminancia de cada color tiene el mismo valor; se pueden tener 16 colores con la misma luminancia. GRAPHICS 10 permite configurar los 9 registros de color a colores y luminancias individuales, pero se deben usar comandos POKE para los registros de las ubicaciones 704 a la 707.
Para más información sobre los modos GTIA, consulte las revistas COMPUTE! de julio a septiembre de 1982, y el libro De Re Atari. Hay muchos programas buenos para dibujar sus propias imágenes en varios modos gráficos; Micropainter de Datasoft es uno de mis favoritos; también están Drawpic de Artworx, The Graphics Machine de Santa Cruz, Graphic Master de Datasoft, Graphics Composer de Versaware y The Next Step de Online, que es una utilidad para crear personajes y seleccionar paletas de colores. COMPUTE! publicó un programa interesante llamado "Supercube" en varios números de 1980 y 1981.
APÉNDICE SEIS
SONIDO Y MÚSICA
El sonido en el Atari puede ser bastante sofisticado o bastante simple, según sus necesidades y habilidades de programación. Se pueden introducir sonidos simples con el comando SOUND; se introduce la voz (de 0 a 3), el tono (de 0 a 255), la distorsión (números pares del 0 al 14) y el volumen (del 1 al 15) de esta manera:
SOUND 0,121,10,8Esto le dará un Do central puro a un volumen moderado. El comando SOUND es solo una forma de ajustar la música o el sonido en el Atari. También puede hacer POKE directamente en los registros POKEY para realizar cambios. Por ejemplo, puede aumentar el rango normal de 5 octavas a 9 estableciendo en 1 los bits adecuados en la ubicación 53768. Este método reduce el número de voces a 2 o 3, pero le ofrece un rango considerable. Puedes usar todo tipo de trucos con filtros, canales de reloj y contadores de polifonía, como se describe en las ubicaciones de POKEY. Para una mejor descripción de la técnica de control de sonido, consulte el libro De Re Atari. Aquí tiene los valores de tono de las notas mayores cuando se usan con un tono puro en el comando SOUND:
Nota | Octava | 1 | 2 | 3 | 4 | 5 |
C | 14 | 29 | 60 | 121* | 243 | |
B | 15 | 31 | 64 | 128 | 255 | |
A# o Bb | 16 | 33 | 68 | 136 | ||
A | 17 | 35 | 72 | 144 | ||
G# o Ab | 18 | 37 | 76 | 153 | ||
G | 19 | 40 | 81 | 162 | ||
F# o Gb | 21 | 42 | 85 | 173 | ||
F | 22 | 45 | 91 | 182 | ||
E | 23 | 47 | 96 | 193 | ||
D# o Eb | 24 | 50 | 102 | 204 | ||
D | 26 | 53 | 108 | 217 | ||
C# o Db | 27 | 57 | 114 | 230 |
Observe que los intervalos entre notas aumentan a medida que disminuye el tono (cuanto mayor es el número, más grave es el tono). El Do central está marcado con un "*". Aquí tiene una rutina sencilla para probar el tono y la distorsión con una sola voz:
5 PRINT CHR$(125):POKE 752,2 10 A=0:B=0:C=0 20 SOUND 0,A,B,C:POSITION 0,0 30 PRINT "TONO","DISTORCION","VOLUMEN" 35 POSITION 0,2:PRINT A,B;" ",,C;" " 40 IF STICK(0)=14 THEN A=A+1:IF A>255 THEN A=0:GOTO 20 50 IF STICK(0)=13 THEN A=A-1:IF A<0 THEN A=255:GOTO 20 60 IF STICK(0)=7 THEN B=B+2:IF B>14 THEN B=0:GOTO 20 70 IF STICK(0)=11 THEN B=B-2:IF B<0 THEN B=14:GOTO 20 80 IF STRIG(0)=0 THEN C=C+1:IF C>15 THEN C=0:GOTO 20 90 GOTO 20Mueva la palanca hacia arriba o hacia abajo para cambiar el tono, hacia la derecha o hacia la izquierda para cambiar el nivel de distorsión. Presione el botón para cambiar el volumen. Para ver un programa similar que usa las 4 voces, consulte la revista Softside n.° 30, y el Tutorial n.° 6 de Santa Cruz (sonido). También revise el cartucho Music Composer de Atari; no solo es un buen programa, sino que también ofrece excelente documentación sobre música, sonido y composición. Hay dos excelentes programas de APX, Sound Editor e Insomnia, que le permiten crear sonidos para incluir en sus programas (aunque no melodías). Insomnia es particularmente interesante porque crea sonidos que se reproducen durante los intervalos de VBLANK.
APÉNDICE SIETE
MAPA DE MEMORIA DE LOS GRÁFICOS PLAYER/MISSILE
Seguro que ha visto este pequeño mapa en docenas de publicaciones. Muestra la ubicación en la memoria de sus gráficos P/M . La pregunta es: ¿qué significa? Intentaré explicarlo a continuación. Primero, el mapa:
Desplazamiento Un byte de ancho Desplazamiento Resolución Resolución Línea Línea Doble Simple 0 +-----------------+ 0 | | | área | | sin uso | +384 |-----------------| +768 | 0 | 1 | 2 | 3 | | missiles | | | +512 |-----------------| +1024 | | | Player 0 | | | +640 |-----------------| +1280 | | | Player 1 | | | +768 |-----------------| +1536 | | | Player 2 | | | +896 |-----------------| +1792 | | | Player 3 | | | +1024 +-----------------+ +2048Independiente de la ubicación en la memoria donde reserve el área de gráficos de sus P/M, la ubicación del espacio utilizado por los players y missiles tendrá un desplazamiento de la misma cantidad de bytes desde el inicio del área reservada. Esto es lo que representan los números de desplazamiento: la cantidad de bytes desde el inicio del área de P/M donde comienzan los gráficos de ese objeto.
Por lo tanto, si decide reservar 16 páginas (4.096 bytes) desde el inicio de su memoria (ubicación 40960), sus gráficos P/M comenzarán en la ubicación 36864.
Dependiendo de la resolución elegida, el área de gráficos de los missiles comenzará 384 ó 768 bytes a partir de esa ubicación: es decir, en las ubicaciones 37248 y 37632, respectivamente. En la resolución de doble línea, puede definir objetos de hasta 128 bytes de longitud; en la de línea simple, pueden tener 256 bytes.
Incluso si su objeto tiene solo 8 ó 10 bytes de altura, los límites para su ubicación siempre tienen el mismo desplazamiento relativo contando desde la parte superior de la memoria gráfica P/M.
Este mapa tiene solo 8 bits (un byte) de ancho. Puede ver que los cuatro missiles comparten el mismo byte de ancho, cada uno usando 2 bits para la resolución. Si combina los missiles para formar un quinto player, usará esta área exactamente como lo haría con el área de cualquier otro player.
Una forma de mover a sus players verticalmente es moverlos dentro de su área reservada en lugar de hacerlo en la pantalla. En BASIC, esto es considerablemente más rápido que tener que mover al player en la pantalla, pero es un proceso lento. En cuanto a los límites del televisor, todos los players en ambas resoluciones se mapean a la altura completa de la pantalla.
Existen muchos buenos programas para crear y editar gráficos P/M, mencionados anteriormente en el texto del Mapa de Memoria. Los gráficos P/M son una de las funciones más potentes y menos comprendidas del Atari. Le sugiero que se informe e intente dominar su uso; no son tan difíciles como parecen.
APÉNDICE OCHO
LISTAS DE DESPLIEGUE
Una lista de despliegue es un programa corto que le indica al chip ANTIC cómo mostrar los datos en la pantalla. Este programa incluye instrucciones como cuántas líneas en blanco se deben colocar en la pantalla como límites superiores, dónde se almacenan los datos de la pantalla, en qué modo se encuentran las líneas que se mostrarán, si hay interrupciones que ejecutar y dónde encontrar la lista de despliegue.
Existen 9 listas de despliegue pre-programadas (10 con GTIA) que se utilizan en BASIC, una para cada modo GRAPHICS. Puede examinar las listas de despliegue de cada modo ejecutando el programa de la ubicación 560. Puede modificar estas listas para adaptarlas a sus necesidades sin mayor esfuerzo. Es bastante fácil diseñar e implementar su propia lista de despliegue una vez que conoce su ubicación y las instrucciones adecuadas.
Ciertas técnicas, como el desplazamiento fino horizontal y vertical, requieren la modificación de la lista de despliegue para mostrar correctamente los datos de la pantalla. A veces es necesario mostrar datos en más de un modo o combinar gráficos y texto en la misma pantalla. Esto se logra modificando la lista de despliegue.
La lista de despliegue más pequeña es para GRAPHICS 2, así que la usaré como ejemplo. Consta de tan solo unos 20 bytes, pero el formato es el mismo para todas las listas; solo cambian las instrucciones. Utilice el programa indicado en el Mapa de Memoria para examinar la lista o utilice un simple programa de 2 líneas como:
10 GRAPHICS 2:P=PEEK(560)+PEEK(561)*256 20 FOR N=0 TO 23:PRINT PEEK(P+N);" ";:NEXT NCuando ejecute este ejemplo, obtendrá lo siguiente:
112 112 112 71 112 158 7 7 7 7 7 7 7 7 7 66 96 159 2 2 2 65 88 158O algo similar, dependiendo de la memoria disponible. Si cambia GRAPHICS 2 a GRAPHICS 2 + 16, obtendrá esto:
112 112 112 71 112 158 7 7 7 7 7 7 7 7 7 7 7 65 92 158El conjunto de instrucciones de la lista de despliegue se analiza en la ubicación 560, pero aquí tiene un cuadro resumen:
Instrucción | Modo BASIC | Líneas de escaneo | Línea de Pixels | Línea de Bytes | Comentarios | |
Decimal | Hexadecimal | |||||
Instrucciones de líneas en blanco | ||||||
0 | 0 | -- | 1 | -- | -- | 1 línea en blanco |
16 | 10 | -- | 2 | -- | -- | 2 líneas en blanco |
32 | 20 | -- | 3 | -- | -- | 3 líneas en blanco |
48 | 30 | -- | 4 | -- | -- | 4 líneas en blanco |
64 | 40 | -- | 5 | -- | -- | 5 líneas en blanco |
80 | 50 | -- | 6 | -- | -- | 6 líneas en blanco |
96 | 60 | -- | 7 | -- | -- | 7 líneas en blanco |
112 | 70 | -- | 8 | -- | -- | 8 líneas en blanco |
Instrucciones de despliegue | ||||||
2 | 2 | 0 | 8 | 40 | 40 | modo texto 0 |
3 | 3 | -- | 10 | 40 | 40 | modo texto * |
4 | 4 | -- | 8 | 40 | 40 | modo texto * |
5 | 5 | -- | 16 | 40 | 40 | modo texto * |
6 | 6 | 1 | 8 | 20 | 20 | modo texto 1 |
7 | 7 | 2 | 16 | 20 | 20 | modo texto 2 |
8 | 8 | 3 | 8 | 40 | 10 | modo gráfico 3 |
9 | 9 | 4 | 4 | 80 | 10 | modo gráfico 4 |
10 | A | 5 | 4 | 80 | 20 | modo gráfico 5 |
11 | B | 6 | 2 | 160 | 20 | modo gráfico 6 |
12 | C | -- | 1 | 160 | 20 | modo gráfico * |
13 | D | 7 | 2 | 160 | 40 | modo gráfico 7 |
14 | E | -- | 1 | 160 | 40 | modo gráfico * |
15 | F | 8 | 1 | 320 | 40 | modo gráfico 8 |
Instrucciones de salto (3 bytes de largo) | ||||||
1 | 1 | -- | -- | -- | -- | saltar a una ubicación |
65 | 41 | -- | -- | -- | -- | saltar y esperar el VBLANK |
Los modos marcados con un asterisco (*) no tienen equivalente en BASIC.
Estas son las instrucciones de la lista de despliegue. Puede modificar las instrucciones de visualización por medio de la configuración de los bits para el desplazamiento horizontal o vertical, la carga del escaneo de memoria (le indica a ANTIC dónde se encuentran en la memoria las siguientes líneas que se mostrarán y qué modo usar) y la activación de una interrupción de la lista de despliege. Estas instrucciones son:
Función | sumar decimal | hexadecimal | bit |
Desplazamiento Horizontal | 16 | 10 | 4 |
Desplazamiento Vertical | 32 | 20 | 5 |
Cargar escaneo de memoria | 64 | 40 | 6 |
Interrupción de la Lista de Despliegue | 128 | 80 | 7 |
La instrucción LMS (Load Memory Scan - Cargar escaneo de memoria) es una instrucción de 3 bytes: el segundo y el tercer byte corresponden al byte menos significativo y al byte más significativo de la dirección donde se mostrarán los datos de la línea o pantalla. Puede sumar cualquiera o todas estas modificaciones a las instrucciones de modo texto o gráfico. Solo puede añadir la modificación de interrupción a las instrucciones de línea en blanco o de salto. Los 2 bytes que siguen a las instrucciones de salto son el byte menos significativo y el byte más significativo de la dirección a la que ANTIC salta para continuar o repetir la lista. Analicemos la DL para GRAPHICS 2 que imprimimos anteriormente:
112 | Estas tres instrucciones imprimen |
112 | 24 líneas de escaneo en blanco en la parte superior |
112 | de la pantalla |
71 | GR.2 con la instrucción LMS añadida |
112 | Dirección de la primera línea de datos de la pantalla |
158 | 158 * 256 + 112 = 40560 |
7 | Muestra el resto de los datos en |
7 | GR.2, por lo que tenemos un total de |
7 | 10 líneas GR.2, ó 10 * 16 = |
7 | 160 líneas de escaneo utilizadas. |
7 | |
7 | |
7 | |
7 | |
7 | |
7 | |
7 | |
66 | GR.0 con instrucción LMS añadida |
96 | Dirección de la ventana de texto inferior |
159 | 159 * 256 + 96 = 40800 |
2 | GR.0 para la ventana de texto, por lo que tenemos |
2 | un total de 4 líneas |
2 | |
65 | Saltar y esperar el blanqueo vertical |
88 | Dirección de la lista de despliegue |
158 | 158 * 256 + 88 = 40536 |
(volver al principio de esta lista) |
Ahora examine la lista de GR.2 + 16. Puede ver que suma 2 números 7 para reemplazar las líneas GR.0 en la parte inferior de la pantalla. Un poco de cálculo nos muestra que la pantalla, en ambos casos, tiene un total de 192 líneas de escaneo. Este es un número importante; si quiere que su pantalla se vea bien, debes acercarse lo más posible a esta cifra; de lo contrario, terminará con líneas en blanco en la parte inferior de la pantalla, o peor aún, en la propia pantalla.
Encontrará el valor 112 en todas las listas de despliegue de Atari. Los 3 se utilizan para que la pantalla sea legible en su equipo. Intente reemplazar uno o más de ellos con un 0 para ver qué sucede sin ellos. Las instrucciones de salto también se utilizan para saltar un límite de 1K, ya que la propia DL no puede cruzar un límite de 1K sin dicho salto. Además, los datos de la DL no pueden cruzar un límite de 4K, por lo que debe usar una instrucción LMS antes de cruzar uno. El factor crucial al diseñar su propia lista de despliegue es asegurarse de que los datos y las líneas de escaneo coincidan. Esto puede requerir que manipule sus datos para obtener la cantidad adecuada de bytes por línea y que la visualización se muestre correctamente en pantalla. A continuación, se muestra la cantidad de bits por píxel para cada modo ANTIC:
Modo decimal | Hexadecimal | BASIC | Bits por pixel | |
2 | 2 | 0 | 8 | modos texto |
3 | 3 | -- | 8 | |
4 | 4 | -- | 8 | |
5 | 5 | -- | 8 | |
6 | 6 | 1 | 8 | |
7 | 7 | 2 | 8 | |
8 | 8 | 3 | 2 | modos gráficos |
9 | 9 | 4 | 1 | |
10 | A | 5 | 2 | |
11 | B | 6 | 1 | |
12 | C | -- | 1 | |
13 | D | 7 | 2 | |
14 | E | -- | 2 | |
15 | F | 8 | 1 |
Puede tener tantas listas de despliegue como quiera, usando la instrucción de salto/blanqueo vertical al final de cada una para indicarle a ANTIC dónde se encuentra su nueva lista de despliegue. Al colocar su nueva lista de despliegue (la Página Seis, a menos que se use para otras rutinas, es un buen lugar protegido para colocarla), ejecute un POKE 559,0 para deshabilitar las instrucciones de búsqueda de listas de despliegue y, a continuación, haga POKE con el valor adecuado para volver a habilitarla. Sea creativo y construya sus propias pantallas con diversas líneas de texto y gráficos.
Para más información, le recomiendo leer los libros De Re Atari y Your Atari 400/800. Este último ofrece buenos ejemplos de listas de despliegue modificadas y explica cómo crearlas. 2 utilidades para listas de despliegue son The Next Step de Online y Tricky Tutorial #1 de Santa Cruz.
APÉNDICE NUEVE
CONVERSIONES NUMÉRICAS
Si usa este mapa con frecuencia, o usa mucho el Atari para rutinas de lenguaje de máquina, interrupciones, gráficos y similares, sabe que con frecuencia necesita traducir entre decimal y hexadecimal, incluso viceversa. Es posible, aunque tedioso, hacer las traducciones a mano, con lápiz y papel. Las tablas para hacerlo se encuentran a continuación. No es el mejor método ni el más rápido disponible. Le recomiendo la calculadora Texas Instruments TI Programmer. Realiza la mayor parte del trabajo automáticamente, además de la manipulación de bits (desafortunadamente, no ofrece traducción binaria). Es una herramienta indispensable para los programadores.
Hay otras maneras de evitar comprar la calculadora: puede comprar el programa Monkey Wrench de Eastern House Software, que realiza las traducciones hexadecimales a decimales sin problemas. O puede comprar cualquiera de las numerosas utilidades de disco o programación que incluyen dichas rutinas de traducción, como Disk Scan de Micro Media. Sin embargo, quienes deseen realizar el trabajo ellos mismos pueden usar un programa traductor sencillo. Un ejemplo de ello, modificado a partir de rutinas que aparecieron por separado en la revistas COMPUTE! de noviembre de 1981 y marzo de 1982, es el siguiente:
10 DIM HEX$(16),DEC$(23),NUM$(10),W$(4),BIN$(8),BNY$(8),TRANS(8) 15 DATA 128,64,32,16,8,4,2,1 20 FOR N=1 TO 8:READ B:TRANS(N)=B:NEXT N:POKE 201,14 25 PRINT CHR$(125) 30 HEX$="0123456789ABCDEF":DEC$="@ABCDEFGHI!!!!!!!JKLMNO" 40 ? :? "PRESIONE [OPTION] PARA HEXADECIMAL":? "[SELECT] PARA DECIMAL":? "[START] PARA BINARIO" 42 ? "CONVERSIONES":A=1:MAX=4096 50 IF PEEK(53279)=3 THEN GOTO 100 60 IF PEEK(53279)=5 THEN GOTO 200 70 IF PEEK(53279)=6 THEN GOTO 300 80 GOTO 50 100 ? :? "INGRESE NUMERO HEXADECIMAL":? "$0000 TO $FFFF":INPUT NUM$:ACC=0:A=1:TRAP 100 120 FOR NUM=1 TO LEN(NUM$):ACC=ACC*16+ASC(DEC$(ASC(NUM$(NUM))-47))-64:NEXT NUM:T=ACC 125 IF ACC>255 THEN BNY$="........":GOTO 170 130 FOR N=7 TO 0 STEP -1:BIN=2^N 135 IF INT(ACC/BIN)=L THEN BNY$(A,A)="1":ACC=ACC-BIN:GOTO 150 140 BNY$(A,A)="0" 150 A=A+1:NEXT N 170 ? :? "HEXADECIMAL","DECIMAL","BINARIO" 180 ? " ";NUM$,T,BNY$ 190 ? :? :GOTO 40 200 ? :? "INGRESE NUMERO DECIMAL":? "0 AL 65535":INPUT NUM:T=NUM:Z=T:MAX=4096:TRAP 200 205 IF NUM>65535 THEN GOTO 200 208 IF NUM<1 THEN GOTO 200 210 FOR N=1 TO 4:BYTE=INT(NUM/MAX):W$(N,N)=HEX$(BYTE+1,BYTE+1):NUM=NUM-MAX*BYTE:MAX=MAX/16:NEXT N 220 IF T>255 THEN BNY$="........":GOTO 270 230 FOR N=7 TO 0 STEP -1:BIN=2^N 235 IF INT(Z/BIN)=1 THEN BNY$(A,A)="1":Z=Z-BIN:GOTO 250 240 BNY$(A,A)="0" 250 A=A+1:NEXT N 270 ? :? "DECIMAL","HEXADECIMAL","BINARIO" 280 ? " ";T,W$,BNY$ 290 GOTO 40 300 ? :? "INGRESE NUMERO BINARIO":? "00000000 AL 11111111":? :? "76543210 BITS":INPUT BIN$:TRAP 300 305 IF LEN(BIN$)<>8 THEN GOTO 300 308 FOR B=1 TO 8:IF VAL(BIN$(B,B))>1 THEN POP :GOTO 300 310 NEXT B 320 FOR B=1 TO 8:IF BIN$(B,B)="1" THEN TOT=TOT+TRANS(B) 325 NEXT B:Q=TOT 330 FOR L=1 TO 4:BYTE=INT(TOT/MAX):W$(L,L)=HEX$(BYTE+1,BYTE+1):TOT=TOT-MAX*BYTE:MAX=MAX/16:NEXT L 340 ? :? "BINARIO","HEXADECIMAL","DECIMAL" 350 ? " ";BIN$,W$,Q 390 GOTO 40Este programa convierte cualquier número hexadecimal, decimal y binario entre sí. Existen algunas restricciones: no convierte ningún número binario para ningún número hexadecimal mayor que $FF ni ningún número decimal mayor que 255. No convierte ningún número hexadecimal mayor que $FFFF ni ningún número decimal mayor que 65.535. Dado que aproximadamente el 99 % de sus manipulaciones numéricas se realizarán dentro de estos rangos, no debería tener problemas. Puede eliminar fácilmente las rutinas de conversión del programa para usarlas en su propia utilidad.
Para convertir rápidamente cualquier número en el rango de 0 a 65.535 ($FFFF), utilice la tabla a continuación. Es muy sencillo: para convertir de hexadecimal a decimal, tome el número que aparece en la columna correspondiente al valor de la fila correspondiente y sume los valores. El total es su número decimal. Por ejemplo:
$7AC1 = 28672 cuarta columna, 7 2560 tercera columna, A 192 segunda columna, C 1 primera columna, 1 ----- 31425 valor decimalPara convertir de decimal a hexadecimal, se busca el número mayor que sea menor al número que se desea convertir y se lo resta al número original. El valor de la fila es el primer valor hexadecimal. Luego se repite el proceso con el resto hasta que el resultado sea 0. Los valores de la fila se concatenan para obtener un número hexadecimal. Por ejemplo:
31425 = 31425 - 28672 número mayor, columna 4. primer número hexadecimal = 7 ----- 2753 resto, menos la tercera columna 2560 segundo número hexadecimal = A ----- 193 resto, menos la segunda columna 192 tercer número hexadecimal = C ----- 1 resto y cuarto número hexadecimal Valor hexadecimal = $7AC1
Número hexadecimal | Columna | Número hexadecimal | |||
cuarta | tercera | segunda | primera | ||
1 | 4096 | 256 | 16 | 1 | 1 |
2 | 8192 | 512 | 32 | 2 | 2 |
3 | 12288 | 768 | 48 | 3 | 3 |
4 | 16384 | 1024 | 64 | 4 | 4 |
5 | 20480 | 1280 | 80 | 5 | 5 |
6 | 24576 | 1536 | 96 | 6 | 6 |
7 | 28672 | 1792 | 112 | 7 | 7 |
8 | 32768 | 2048 | 128 | 8 | 8 |
9 | 36864 | 2304 | 144 | 9 | 9 |
A | 40960 | 2560 | 160 | 10 | A |
B | 45056 | 2816 | 176 | 11 | B |
C | 49152 | 3072 | 192 | 12 | C |
D | 53248 | 3328 | 208 | 13 | D |
E | 57344 | 3584 | 224 | 14 | E |
F | 61440 | 3840 | 240 | 15 | F |
Las siguientes páginas son simplemente una lista de los valores decimales, hexadecimales y binarios para el rango de números entre 0 y 255. Esta lista me ha resultado extremadamente útil cuando no he podido usar un programa de traducción ni una calculadora. Lea la nota en la introducción sobre las técnicas de traducción para binario y hexadecimal.
Decimal | Hexadecimal | Binario |
0 | 0 | 00000000 |
1 | 1 | 00000001 |
2 | 2 | 00000010 |
3 | 3 | 00000011 |
4 | 4 | 00000100 |
5 | 5 | 00000101 |
6 | 6 | 00000110 |
7 | 7 | 00000111 |
8 | 8 | 00001000 |
9 | 9 | 00001001 |
10 | A | 00001010 |
11 | B | 00001011 |
12 | C | 00001100 |
13 | D | 00001101 |
14 | E | 00001110 |
15 | F | 00001111 |
16 | 10 | 00010000 |
17 | 11 | 00010001 |
18 | 12 | 00010010 |
19 | 13 | 00010011 |
20 | 14 | 00010100 |
21 | 15 | 00010101 |
22 | 16 | 00010110 |
23 | 17 | 00010111 |
24 | 18 | 00011000 |
25 | 19 | 00011001 |
26 | 1A | 00011010 |
27 | 1B | 00011011 |
28 | 1C | 00011100 |
29 | 1D | 00011101 |
30 | 1E | 00011110 |
31 | 1F | 00011111 |
32 | 20 | 00100000 |
33 | 21 | 00100001 |
34 | 22 | 00100010 |
35 | 23 | 00100011 |
36 | 24 | 00100100 |
37 | 25 | 00100101 |
38 | 26 | 00100110 |
39 | 27 | 00100111 |
40 | 28 | 00101000 |
41 | 29 | 00101001 |
42 | 2A | 00101010 |
43 | 2B | 00101011 |
44 | 2C | 00101100 |
45 | 2D | 00101101 |
46 | 2E | 00101110 |
47 | 2F | 00101111 |
48 | 30 | 00110000 |
49 | 31 | 00110001 |
50 | 32 | 00110010 |
51 | 33 | 00110011 |
52 | 34 | 00110100 |
53 | 35 | 00110101 |
54 | 36 | 00110110 |
55 | 37 | 00110111 |
56 | 38 | 00111000 |
57 | 39 | 00111001 |
58 | 3A | 00111010 |
59 | 3B | 00111011 |
60 | 3C | 00111100 |
61 | 3D | 00111101 |
62 | 3E | 00111110 |
63 | 3F | 00111111 |
64 | 40 | 01000000 |
65 | 41 | 01000001 |
66 | 42 | 01000010 |
67 | 43 | 01000011 |
68 | 44 | 01000100 |
69 | 45 | 01000101 |
70 | 46 | 01000110 |
71 | 47 | 01000111 |
72 | 48 | 01001000 |
73 | 49 | 01001001 |
74 | 4A | 01001010 |
75 | 4B | 01001011 |
76 | 4C | 01001100 |
77 | 4D | 01001101 |
78 | 4E | 01001110 |
79 | 4F | 01001111 |
80 | 50 | 01010000 |
81 | 51 | 01010001 |
82 | 52 | 01010010 |
83 | 53 | 01010011 |
84 | 54 | 01010100 |
85 | 55 | 01010101 |
Decimal | Hexadecimal | Binario |
86 | 56 | 01010110 |
87 | 57 | 01010111 |
88 | 58 | 01011000 |
89 | 59 | 01011001 |
90 | 5A | 01011010 |
91 | 5B | 01011011 |
92 | 5C | 01011100 |
93 | 5D | 01011101 |
94 | 5E | 01011110 |
95 | 5F | 01011111 |
96 | 60 | 01100000 |
97 | 61 | 01100001 |
98 | 62 | 01100010 |
99 | 63 | 01100011 |
100 | 64 | 01100100 |
101 | 65 | 01100101 |
102 | 66 | 01100110 |
103 | 67 | 01100111 |
104 | 68 | 01101000 |
105 | 69 | 01101001 |
106 | 6A | 01101010 |
107 | 6B | 01101011 |
108 | 6C | 01101100 |
109 | 6D | 01101101 |
110 | 6E | 01101110 |
111 | 6F | 01101111 |
112 | 70 | 01110000 |
113 | 71 | 01110001 |
114 | 72 | 01110010 |
115 | 73 | 01110011 |
116 | 74 | 01110100 |
117 | 75 | 01110101 |
118 | 76 | 01110110 |
119 | 77 | 01110111 |
120 | 78 | 01111000 |
121 | 79 | 01111001 |
122 | 7A | 01111010 |
123 | 7B | 01111011 |
124 | 7C | 01111100 |
125 | 7D | 01111101 |
126 | 7E | 01111110 |
127 | 7F | 01111111 |
128 | 80 | 10000000 |
129 | 81 | 10000001 |
130 | 82 | 10000010 |
131 | 83 | 10000011 |
132 | 84 | 10000100 |
133 | 85 | 10000101 |
134 | 86 | 10000110 |
135 | 87 | 10000111 |
136 | 88 | 10001000 |
137 | 89 | 10001001 |
138 | 8A | 10001010 |
139 | 8B | 10001011 |
140 | 8C | 10001100 |
141 | 8D | 10001101 |
142 | 8E | 10001110 |
143 | 8F | 10001111 |
144 | 90 | 10010000 |
145 | 91 | 10010001 |
146 | 92 | 10010010 |
147 | 93 | 10010011 |
148 | 94 | 10010100 |
149 | 95 | 10010101 |
150 | 96 | 10010110 |
151 | 97 | 10010111 |
152 | 98 | 10011000 |
153 | 99 | 10011001 |
154 | 9A | 10011010 |
155 | 9B | 10011011 |
156 | 9C | 10011100 |
157 | 9D | 10011101 |
158 | 9E | 10011110 |
159 | 9F | 10011111 |
160 | A0 | 10100000 |
161 | A1 | 10100001 |
162 | A2 | 10100010 |
163 | A3 | 10100011 |
164 | A4 | 10100100 |
165 | A5 | 10100101 |
166 | A6 | 10100110 |
167 | A7 | 10100111 |
168 | A8 | 10101000 |
169 | A9 | 10101001 |
170 | AA | 10101010 |
171 | AB | 10101011 |
Decimal | Hexadecimal | Binario |
172 | AC | 10101100 |
173 | AD | 10101101 |
174 | AE | 10101110 |
175 | AF | 10101111 |
176 | B0 | 10110000 |
177 | B1 | 10110001 |
178 | B2 | 10110010 |
179 | B3 | 10110011 |
180 | B4 | 10110100 |
181 | B5 | 10110101 |
182 | B6 | 10110110 |
183 | B7 | 10110111 |
184 | B8 | 10111000 |
185 | B9 | 10111001 |
186 | BA | 10111010 |
187 | BB | 10111011 |
188 | BC | 10111100 |
189 | BD | 10111101 |
190 | BE | 10111110 |
191 | BF | 10111111 |
192 | C0 | 11000000 |
193 | C1 | 11000001 |
194 | C2 | 11000010 |
195 | C3 | 11000011 |
196 | C4 | 11000100 |
197 | C5 | 11000101 |
198 | C6 | 11000110 |
199 | C7 | 11000111 |
200 | C8 | 11001000 |
201 | C9 | 11001001 |
202 | CA | 11001010 |
203 | CB | 11001011 |
204 | CC | 11001100 |
205 | CD | 11001101 |
206 | CE | 11001110 |
207 | CF | 11001111 |
208 | D0 | 11010000 |
209 | D1 | 11010001 |
210 | D2 | 11010010 |
211 | D3 | 11010011 |
212 | D4 | 11010100 |
213 | D5 | 11010101 |
214 | D6 | 11010110 |
215 | D7 | 11010111 |
216 | D8 | 11011000 |
217 | D9 | 11011001 |
218 | DA | 11011010 |
219 | DB | 11011011 |
220 | DC | 11011100 |
221 | DD | 11011101 |
222 | DE | 11011110 |
223 | DF | 11011111 |
224 | E0 | 11100000 |
225 | E1 | 11100001 |
226 | E2 | 11100010 |
227 | E3 | 11100011 |
228 | E4 | 11100100 |
229 | E5 | 11100101 |
230 | E6 | 11100110 |
231 | E7 | 11100111 |
232 | E8 | 11101000 |
233 | E9 | 11101001 |
234 | EA | 11101010 |
235 | EB | 11101011 |
236 | EC | 11101100 |
237 | ED | 11101101 |
238 | EE | 11101110 |
239 | EF | 11101111 |
240 | F0 | 11110000 |
241 | F1 | 11110001 |
242 | F2 | 11110010 |
243 | F3 | 11110011 |
244 | F4 | 11110100 |
245 | F5 | 11110101 |
246 | F6 | 11110110 |
247 | F7 | 11110111 |
248 | F8 | 11111000 |
249 | F9 | 11111001 |
250 | FA | 11111010 |
251 | FB | 11111011 |
252 | FC | 11111100 |
253 | FD | 11111101 |
254 | FE | 11111110 |
255 | FF | 11111111 |
APÉNDICE DIEZ
CÓDIGOS ATASCII E INTERNO DE LOS CARACTERES
Carácter | Código ATASCII | Código Interno |
espacio | 32 | 0 |
! | 33 | 1 |
" | 34 | 2 |
# | 35 | 3 |
$ | 36 | 4 |
% | 37 | 5 |
& | 38 | 6 |
' | 39 | 7 |
( | 40 | 8 |
) | 41 | 9 |
* | 42 | 10 |
+ | 43 | 11 |
, | 44 | 12 |
- | 45 | 13 |
. | 46 | 14 |
/ | 47 | 15 |
0 | 48 | 16 |
1 | 49 | 17 |
2 | 50 | 18 |
3 | 51 | 19 |
4 | 52 | 20 |
5 | 53 | 21 |
6 | 54 | 22 |
7 | 55 | 23 |
8 | 56 | 24 |
9 | 57 | 25 |
: | 58 | 26 |
; | 59 | 27 |
< | 60 | 28 |
= | 61 | 29 |
> | 62 | 30 |
? | 63 | 31 |
@ | 64 | 32 |
A | 65 | 33 |
B | 66 | 34 |
C | 67 | 35 |
D | 68 | 36 |
E | 69 | 37 |
F | 70 | 38 |
G | 71 | 39 |
H | 72 | 40 |
I | 73 | 41 |
J | 74 | 42 |
K | 75 | 43 |
L | 76 | 44 |
M | 77 | 45 |
N | 78 | 46 |
O | 79 | 47 |
P | 80 | 48 |
Q | 81 | 49 |
R | 82 | 50 |
S | 83 | 51 |
T | 84 | 52 |
U | 85 | 53 |
V | 86 | 54 |
W | 87 | 55 |
X | 88 | 56 |
Y | 89 | 57 |
Z | 90 | 58 |
[ | 91 | 59 |
\ | 92 | 60 |
] | 93 | 61 |
^ | 94 | 62 |
_ | 95 | 63 |
Carácter | Código ATASCII | Código Interno |
CTRL-, | 0 | 64 |
CTRL-A | 1 | 65 |
CTRL-B | 2 | 66 |
CTRL-C | 3 | 67 |
CTRL-D | 4 | 68 |
CTRL-E | 5 | 69 |
CTRL-F | 6 | 70 |
CTRL-G | 7 | 71 |
CTRL-H | 8 | 72 |
CTRL-I | 9 | 73 |
CTRL-J | 10 | 74 |
CTRL-K | 11 | 75 |
CTRL-L | 12 | 76 |
CTRL-M | 13 | 77 |
CTRL-N | 14 | 78 |
CTRL-O | 15 | 79 |
CTRL-P | 16 | 80 |
CTRL-Q | 17 | 81 |
CTRL-R | 18 | 82 |
CTRL-S | 19 | 83 |
CTRL-T | 20 | 84 |
CTRL-U | 21 | 85 |
CTRL-V | 22 | 86 |
CTRL-W | 23 | 87 |
CTRL-X | 24 | 88 |
CTRL-Y | 25 | 89 |
CTRL-Z | 26 | 90 |
ESCAPE | 27 | 91 |
FLECHA ARRIBA | 28 | 92 |
FLECHA ABAJO | 29 | 93 |
FLECHA IZQUIERDA | 30 | 94 |
FLECHA DERECHA | 31 | 95 |
CTRL-. | 96 | 96 |
a | 97 | 97 |
b | 98 | 98 |
c | 99 | 99 |
d | 100 | 100 |
e | 101 | 101 |
f | 102 | 102 |
g | 103 | 103 |
h | 104 | 104 |
i | 105 | 105 |
j | 106 | 106 |
k | 107 | 107 |
l | 108 | 108 |
m | 109 | 109 |
n | 110 | 110 |
o | 111 | 111 |
p | 112 | 112 |
q | 113 | 113 |
r | 114 | 114 |
s | 115 | 115 |
t | 116 | 116 |
u | 117 | 117 |
v | 118 | 118 |
w | 119 | 119 |
x | 120 | 120 |
y | 121 | 121 |
z | 122 | 122 |
CTRL-; | 123 | 123 |
| | 124 | 124 |
CLEAR | 125 | 125 |
DELETE | 126 | 126 |
TAB | 127 | 127 |
Los caracteres en video inverso son iguales a los anteriores, pero se les suma 128 a los valores indicados. Esto se logra estableciendo en 1 el séptimo bit (sumando 128). Se utilizan otros códigos que no se encuentran en este rango:
ATASCII Función 155 Fin de Línea (Return) 156 Borar línea 157 Insertar línea 158 CTRL-Tab 159 Shift-Tab 253 CTRL-2 (timbre) 254 Borrar caracter 255 Insertar caracter
Consulte las páginas páginas C1 a la C3 y F1 del Manual de Referencia de Atari. Para imprimir en pantalla las teclas de flecha, borrar, insertar, borrar, el timbre, la tecla de escape o cualquiera de los códigos mencionados anteriormente, debe presionar la tecla ESC antes de introducir los caracteres del teclado.
No todos estos códigos se pueden enviar a la impresora. Los códigos ATASCII del 0 al 31 imprimen en blanco o pueden enviar códigos de control a la impresora, según la marca. 96 imprime un apóstrofo en video inverso en lugar de un rombo, 123 imprime un corchete izquierdo en lugar de una pica, 125 imprime un corchete derecho en lugar de borrar, 126 imprime una tilde en lugar de un retroceso y 127 imprime un espacio en blanco en lugar de una tabulación.
Existe un tercer conjunto de códigos utilizados por el controlador de teclado de Atari. Estos valores se encuentran en el Manual del Usuario del Sistema Operativo.