Mapa de Memoria

A continuación una breve explicación de las posiciones de memoria más comunes de nuestros ATARI :


NombreDecimal HexadecimalDescripción
POKMSK1 $10Tecla BREAR, Para desactivar esta tecla debemos usar los siguientes comandos : POKE 16,112:POKE 53774,112
RTCLOK18,19,20$12, $13, $14Reloj del computador, Para cálculo de tiempo debemos usar la siguiente fórmula: TIEMPO = INTPEEK(18)*65536+PEEK(19)*256+PEEK(20/60). Para mostrar la hora en modo "hora:minuto:segundo" se requiere un programa específico.
FEOF63$3FFin de archivo de casete: Si contiene un cero, significa que aún quedan datos, cualquier otro número indica que se ha encontrado el fin de archivo.
SOUNDR65$41Sonido de entrada/salida (I/O): Pokee esta dirección con un cero y el traspaso de información a los periféricos será silenciosa. Con otro número regresará el sonido.
ATRACT77$4DCambio de color automático: Si su programa no utiliza el teclado por más de 7 minutos, pokee esta dirección con cero periódicamente para evitar la rotación de colores. Para comenzar inmediatamente la rotación pokee 77 con 128.
LMARGN82$52Margen izquierdo: El Sistema Operativo pone aquí un 2. Si desea cambiar este margen, ponga aquí el número correspondiente al margen deseado. Ej: POKE 82,20 (20=número de columnas a la izquierda del margen.)
RMARGN83$53Igual que 82 pero refleja la posición del margen derecho, inicializada en 39. Estas posiciones sólo son válidas para gráfico 0 y ventana de texto. Dicha ventana consiste en 4 líneas de gráfico cero en la parte inferior de otro modo gráfico, por ejemplo: gráfico 8.
ROWCRS84$54Posición de fila actual del cursor: Cero corresponde a la parte superior de la pantalla.
COLCRS85, 86$55, $56Posición de columna actual del cursor: Cero corresponde a la posición izquierda de la pantalla. Debe usarse el siguiente cálculo:
COL = PEEK(85) + PEEK(86)*256
SAVMSC88, 89$58, $59Inicio de la pantalla en RAM: Estas posiciones determinan en que parte de la RAM se encuentra el primer byte (parte superior izquierda) de la pantalla. Para imprimir el carácter A con poke usar la siguiente instrucción: POKE PEEK(88)+PEEK(89)*256,ASC("A")-32.
RAMTOP106$6ACantidad de RAM en páginas (una página=256 bytes). Para ubicar el fin de la memoria RAM use la siguiente instrucción: RAM=PEEK(106)*256. Para reservar Memoria debe usar la siguiente instrucción: POKE 106,PEEK(106)-número de páginas a reservar.
LOMEM128, 129$80, $81Puntero al comienzo de la RAM disponible. Trabaja conjuntamente con 743 y 744. Es una buena idea modificar este puntero para reservar memoria para datos o rutinas en Assembler.
VNTP130, 131$82, $83Puntero al comienzo de la tabla de nombres de variables del Basic.
VNTD132, 133$84, $85Puntero al fin de la tabla anterior.
VVTP134, 135$86, $87Puntero de la tabla de valores de las variables.
STMTAB136, 137$88, $89Puntero al comienzo del programa de Basic codificado.
STMCUR138, 139$8A, $8BPuntero a la línea codificada que está siendo utilizada actualmente por el Basic.
STARP140, 141$8C, $8DDirección de las matrices y variables alfanuméricas. Fin del programa codificado.
MEMTOP144, 145$90, $91Fin de la memoria utilizada por el Basic.
160, 161$A0, $A1Número de línea en la cual se encuentra trabajando el Basic.
STOPLN186, 187$BA, $BBLínea en la cual se detuvo la ejecución del programa Basic.
ERRSAVE195$C3Número de error que causo la detención del programa o la utilización de la instrucción "TRAP".
FR0212, 217$D4, $D9Usados por el paquete de coma flotante.
VDSLST512, 513$200, $201Estas dos posiciones de memoria son utilizadas por el Sistema Operativo como un puntero hacia la zona de memoria en la cual se encuentra el programa de atención a la interrupción del Display List (DLI). Para habilitar las interrupciones de Display List, es necesario primero pokear en la posición 54286 o $D40E un 192 o bien un $C0, pues si no el Antic ignora la solicitud de interrupción. Para que una interrupción de display se ejecute, en el Display List es necesario colocar el bit 7 en 1 en la instrucción que representa a la línea de la pantalla en la cual deseamos generar la interrupción DLI.
VPRCED514, 515$202, $203Estas dos posiciones de memoria, representan al vector del Sistema Operativo mediante el cual se atiende una Interrupción ocasionada por la línea PROCED de la entrada/salida serial del computador. Esta línea computador. Esta línea generalmente es utilizada para conectar periféricos por la entrada serial, que se comuniquen con el 6502 a través de la interrupción VPRCED. Cuando encendemos el ATARI, estas dos posiciones de memoria, apuntan a una zona de memoria que contiene las instrucciones PLA y RTI, las cuales anulan el llamado de la interrupción. Es decir que el computador, a menos que el programador lo desee, no utiliza esta interrupción en su configuración estándar.
VINTER516, 517$204, $205Estas dos posiciones funcionan de igual manera que las anteriores, pero en vez de trabajar con el Proced, lo hacen con la línea de Interrup que también se encuentra en el conector serial del Atari.
VBREAK518, 519$206, $207Cuando en Assembler se ejecuta una instrucción BRK, en realidad en el computador se genera una interrupción por software que es atendida por la rutina en lenguaje de máquina apuntada por este vector.
VKEYBD520, 521$208, $209Al presionar una tecla en nuestro computador, el chip POKEY, genera una interrupción para que el Sistema Operativo determine cuál fue la tecla seleccionada. Para esto, el computador tiene una rutina de atención a esta interrupción que se encuentra apuntada por estas dos posiciones de memoria.
VSERIN522, 523$20A, $20BSi algún periférico transmite un byte por la entrada/salida Serial del ATARI, el Pokey genera una interrupción al 6502 para que éste lea el contenido de la posición SD20D llamada SERIN, la cual posee el byte que el periférico transfirió en serie. De esta manera, la comunicación con los periféricos la realiza el Pokey que se preocupa de leer los 8 bits del byte y sólo le avisa al 6S02 cuando tiene totalmente configurado el byte completo, para que éste distraiga sus operaciones y lea el contenido del SERIN. Así, el procesador cuenta con un sistema de lectura muy rápido, pues no tiene que hacer el trabajo de leer los 8 bits del byte transmitido. Esta interrupción de entrada serial es apuntada por este vector representado por estas dos posiciones de memoria.
VSEROR524, 525$20C, $20DEstas dos posiciones de memoria son similares a las anteriores pero trabajan en la salida de bytes del computador a los periféricos. Cuando el Pokey está listo para transmitir un byte por la salida serial, interrumpe al procesador para que éste le defina a través de SEROUT que también es la posición $D20D, el byte a transmitir. Este trabajo se realiza en una rutina que en el Sistema Operativo se encuentra apuntada por estas dos posiciones.
SDLSTL560, 561$230, $231Estas dos posiciones de memoria, definen el comienzo de la dirección del Display List.
LPENH564$234En esta posición de memoria, el Sistema Operativo del ATARI almacena la posición horizontal de la lectura del Lápiz de Luz.
LPENV565$235Posición vertical del Lápiz de Luz sobre la pantalla.
COLDST580$244Esta dirección del mapa de memoria contiene un flag que define la acción que va a tomar el computador en caso de ser presionada la tecla Reset. Si esta posición contiene un cero, al presionar Reset no se genera un reboot del sistema. Si en cambio su contenido es 1, al presionar Reset el equipo realiza las mismas tareas que hace cuando se enciende el computador.
PADDLO624$270En esta posición de memoria, el sistema operativo almacena el valor de la lectura del paddle Nro. 0. Este valor puede oscilar entre 0 y 228.
PADDL1625$271Valor del paddle 1.
PADDL2626$272Valor del paddle 2.
STICK0632$278Esta posición registra la posición en la que se encuentra el bastón del joystick 1.
STICK1633$279Esta posición similar a la anterior, registra el contenido de la lectura del joystick 2.
INVFLG694$2B6Esta posición de memoria refleja a un flag que indica si el teclado está o no en video inverso. Un valor cero en esta posición indica que el teclado está en video común, pero si pokeamos un 128 el teclado se convierte en video inverso.
SHFLOK702$2BEEsta posición contiene un flag que indica si el teclado está trabajando en mayúsculas o minúsculas o bien si está siendo ocupada la tecla Control. Pokeando un cero, el teclado trabaja con minúsculas, con un 64 lo hace con mayúsculas y cuando posee un 128 la tecla Control está siendo accionada.
PCOLR0704$2C0Color del player/missile número 0.
PCOLR1705$2C1Color del player/missile número 1.
PCOLR2706$2C2Color del player/missile número 2.
PCOLR3707$2C3Color del player/missile número 3.
COLOR0708$2C4Este byte representa al registro de color cero y es la copia del registro de Hardware ubicado en la posición de memoria $D016 o 53270.
COLOR1709$2C5Representa al registro de color 1 cuyo registro de Hardware se encuentra en la posición $D017 ó 53271.
COLOR2710$2C6Al igual que el byte anterior, representa al registro de color número 2 cuyo registro de Hardware se encuentra en $D018 o 53272.
COLOR3711$2C7Representa al registro de color 3 y su posición en el Hardware es $D019 o 53273.
COLOR4712$2C8Representa al registro de color número 4 y como lo indicamos anteriormente es el background de la pantalla. Es un shadow del registro de Hardware ubicado en $D01A ó 53274.
KRPDEL729$2D9Cuando mantenemos presionada una misma tecla del teclado durante unos instantes, ésta comienza a repetirse en la pantalla. Esta posición de memoria maneja el tiempo que debe ser presionada antes de comenzar a repetirse. Pero este valor puede modificarse pokeando cualquier valor que va a indicar la cantidad de 1/60 segundos que el computador va a esperar antes de comenzar la repetición.
KEYREP730$2DAEsta posición contiene la velocidad de repetición de las teclas al mantenerse oprimidas. Si en esta posición almacenamos un 0 le estamos indicando al S.O. que no repita teclas, es decir, que al presionar una tecla sólo se imprime un carácter, pero cualquier valor puede ser almacenado en esta posición de memoria.
NOCLIK731$2DBSi en esta posición almacenamos cualquier valor distinto de cero, el teclado deja de hacer su ruido característico cada vez que presionamos una tecla.
HELPFG732$2DCEsta posición de la memoria indica si la tecla HELP.
736, 737$2E0, $2E1RUNAD: En nuestro artículo de Files Binarios, hemos explicado el funcionamiento de la carga de estos archivos. En nuestra Revista Nro. 9 hicimos una completa descripción de este tipo de carga y hemos visto cómo se utilizan las posiciones de memoria $2E0 y $2E1. Cuando un archivo tipo File es terminado de cargar en la memoria del computador, estas dos posiciones de memoria son consultadas por el DOS. Si estas posiciones apuntan a una determinada zona de la memoria, el S.O. interpreta que es en esta zona donde comienza la ejecución del File.
INITAD738, 739$2E2, $2E3También en este artículo hemos estudiado el funcionamiento de estas direcciones de la memoria del computador. Pero para refrescar estos conceptos podemos decir que cuando se carga un File con sus respectivos Stage, si las direcciones que definen el INITAD, es decir, 738 y 739, son distintas de $00 $00, se ejecuta un llamado a la subrutina que es apuntada por estas dos direcciones para luego seguir la carga del File.
RAMSIZ740$2E4Esta posición de memoria contiene la cantidad de páginas de memoria, es decir, grupos de 256 bytes que contiene nuestro computador disponible en RAM.
MEMTOP741, 742$2E5, $2E6Estas dos posiciones de memoria vienen a apuntar a la última posición disponible en RAM para programas o dato: del usuario. Este valor es definido por el Sistema Operativo cuando el computador es encendido y se redefine cada vez que se presiona la teda Reset o se modifican los modos gráficos de la pantalla. Esto es así, porque el Display List del Antic se posiciona en los siguientes bytes apuntados por MEMTDP.
MEMLO743, 744$2E7, $2E8Estas dos posiciones de memoria definen la primera posición disponible de la Ram para el usuario.
CRS1NH752$2F0Esta posición de la memoria es utilizada para hacer aparecer o desaparecer al cursor de la pantalla. Si queremos hacer desaparecer al cursor, es necesario pokear a esta posición con un 1 y ejecutar un movimiento del cursor en cualquier sentido. Esto lo podemos realizar de la siguiente manera:
10 POKE 752,1
20 PRINT " "
CHBAS756$2F4Set de Caracteres en nuestro ATARI, Básicamente CHBAS viene a definirse al Sistema Operativo del Computador de dónde debe sacar la definición de los caracteres para mostrarlos en la pantalla.
CH764$2FC

Esta posición de la memoria permanentemente contiene el código interno de la última tecla presionada. Si queremos investigar esta posición de la memoria podemos ingresar en nuestro computador el siguiente programa en BASIC:


10 DATA=PEEK(764)
20 PRINT "TECLA PRESIONADA=";DATA
30 POKE 764,255
40 FOR I=1 TO 250
50 NEXT I
60 GOTO 10


De esta manera, presionando cada tecla, podemos obtener una tabla de los valores internos de las teclas que puede ser muy útil en nuestra programación. Es muy importante que para volver a leer esta posición la pokees con un 255 o un $FF para limpiar su contenido.

PRNBUF960, 999$3CO, $3E7Estas posiciones de la memoria del computador definen una zona especial para la comunicación con la impresora. Cada byte que se desee imprimir debe pokearse en estas posiciones, pero si utilizamos el comando del BASIC LPRINT esta operatoria es automática.
CASBUF1021, 1151$3FD, $47FEstas posiciones de la memoria son utilizadas por el S.O. como un Buffer para la grabación o lectura de bloques con la casetera.
Page 61536, 1791$600, $6FFEsta zona de memoria está totalmente disponible para el usuario debido a que el Sistema Operativo no la ocupa. En ella se pueden ubicar rutinas en lenguaje de Máquina con la plena seguridad que no afecten al Basic o a cualquier sistema implementado en el Atari.
Luego de la dirección $700 generalmente se ocupa por el Sistema Operativo para la Unidad de Discos o DOS. Como las versiones del DOS son muchas y cada una de ellas posee un mapa de memoria diferenciado, describiremos estas posiciones cuando trabajemos sobre cada DOS en artículos especializados para ellos, por lo tanto saltaremos a las próximas direcciones importantes de la memoria que comienzan en $8000 con la zona para cartuchos.
A nuestro computador Atari, es posible conectarle cartuchos de 8K o 16K o bien cartuchos más grandes pero siendo estos especiales pues trabajan paginándose de a 8K.
La zona de memoria que el S.O. le asigna a los cartuchos es la comprendida entre $8000 y SBFFF. Si el cartucho es de 16K esta zona es totalmente ocupada pero si el cartucho es de 8K sólo se ocupa desde SA000 a $BFFF.
En esta sección del mapa de memoria describiremos los cartuchos de 8 y 16K, pero en siguientes ediciones de la Revista explicaremos el funcionamiento de los cartuchos de 64K bytes. En el caso de los cartuchos de 8K de memoria, las direcciones que debemos tomar en cuenta son las comprendidas entre $A000 y $BFFF. Desde A000 hasta BFF9 el programador puede escribir su programa pero entre BFFA y BFFF debe definir el vector de carga de los cartuchos, para que al encenderse el computador el S.O. sepa en dónde se encuentran las direcciones de ejecución del cartucho.