Ver el código de Mapa de Memoria

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

{{toc numerate=1}}

===Página uno===

#|
*|Nombre|Decimal |Hexadecimal|Descripción|*
||POKMSK|10|$10|Tecla BREAR, Para desactivar esta tecla debemos usar los siguientes comandos : POKE 16,112:POKE 53774,112||
||APPMHI|14, 15|$D, $E|Ubicación más alta usada por BASIC (LSB, MSB)||
||RTCLOK|18,19,20|$12, $13, $14|Reloj del computador, Para cálculo de tiempo debemos usar la siguiente fórmula: TIEMPO = INT((PEEK(18)*65536+PEEK(19)*256+PEEK(20))/60). Para mostrar la hora en modo "hora:minuto:segundo" se requiere un programa específico.||
||FEOF|63|$3F|Fin 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.||
||SOUNDR|65|$41|Sonido 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.||
||ATRACT|77|$4D|Cambio 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.||
||LMARGN|82|$52|Margen 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.)||
||RMARGN|83|$53|Igual 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.||
||ROWCRS|84|$54|Posición de fila actual del cursor: Cero corresponde a la parte superior de la pantalla.||
||COLCRS|85, 86|$55, $56|Posició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||
||SAVMSC|88, 89|$58, $59|Inicio 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.||
||RAMTOP|106|$6A|Cantidad 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.||
||LOMEM|128, 129|$80, $81|Puntero 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.||
||VNTP|130, 131|$82, $83|Puntero al comienzo de la tabla de nombres de variables del Basic.||
||VNTD|132, 133|$84, $85|Puntero al fin de la tabla anterior.||
||VVTP|134, 135|$86, $87|Puntero de la tabla de valores de las variables.||
||STMTAB|136, 137|$88, $89|Puntero al comienzo del programa de Basic codificado.||
||STMCUR|138, 139|$8A, $8B|Puntero a la línea codificada que está siendo utilizada actualmente por el Basic.||
||STARP|140, 141|$8C, $8D|Dirección de las matrices y variables alfanuméricas. Fin del programa codificado.||
||MEMTOP|144, 145|$90, $91|Fin de la memoria utilizada por el Basic.||
|||160, 161|$A0, $A1|Número de línea en la cual se encuentra trabajando el Basic.||
||STOPLN|186, 187|$BA, $BB|Línea en la cual se detuvo la ejecución del programa Basic.||
||ERRSAVE|195|$C3|Número de error que causo la detención del programa o la utilización de la instrucción "TRAP".||
||FR0|212, 217|$D4, $D9|Usados por el paquete de coma flotante.||
|#

===Página dos===

#|
*|Nombre|Decimal |Hexadecimal|Descripción|*
||VDSLST|512, 513|$200, $201|Estas 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.||
||VPRCED|514, 515|$202, $203|Estas 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.||
||VINTER|516, 517|$204, $205|Estas 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. ||
||VBREAK|518, 519|$206, $207|Cuando 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.||
||VKEYBD|520, 521|$208, $209|Al 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.||
||VSERIN|522, 523|$20A, $20B|Si 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.||
||VSEROR|524, 525|$20C, $20D|Estas 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.||
||SDLSTL|560, 561|$230, $231|Estas dos posiciones de memoria, definen el comienzo de la dirección del Display List.||
||LPENH|564|$234|En esta posición de memoria, el Sistema Operativo del ATARI almacena la posición horizontal de la lectura del Lápiz de Luz.||
||LPENV|565|$235|Posición vertical del Lápiz de Luz sobre la pantalla.||
||COLDST|580|$244|Esta 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.||
||PADDLO|624|$270|En 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.||
||PADDL1|625|$271|Valor del paddle 1.||
||PADDL2|626|$272|Valor del paddle 2.||
||PADDL3|627|$273|Valor del paddle 3.||
||PADDL4|628|$274|Valor del paddle 4, Solo para 400/800.||
||PADDL5|629|$275|Valor del paddle 5, Solo para 400/800.||
||PADDL6|630|$276|Valor del paddle 6, Solo para 400/800.||
||PADDL7|631|$277|Valor del paddle 7, Solo para 400/800.||
||STICK0|632|$278|Esta posición registra la posición en la que se encuentra el bastón del joystick 1.||
||STICK1|633|$279|Esta posición similar a la anterior, registra el contenido de la lectura del joystick 2.||
||INVFLG|694|$2B6|Esta 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.||
||SHFLOK|702|$2BE|Esta 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.||
||PCOLR0|704|$2C0|Color del player/missile número 0.||
||PCOLR1|705|$2C1|Color del player/missile número 1.||
||PCOLR2|706|$2C2|Color del player/missile número 2.||
||PCOLR3|707|$2C3|Color del player/missile número 3.||
||COLOR0|708|$2C4|Este 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.||
||COLOR1|709|$2C5|Representa al registro de color 1 cuyo registro de Hardware se encuentra en la posición $D017 ó 53271.||
||COLOR2|710|$2C6|Al igual que el byte anterior, representa al registro de color número 2 cuyo registro de Hardware se encuentra en $D018 o 53272.||
||COLOR3|711|$2C7|Representa al registro de color 3 y su posición en el Hardware es $D019 o 53273.||
||COLOR4|712|$2C8|Representa 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.||
||KRPDEL|729|$2D9|Cuando 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.||
||KEYREP|730|$2DA|Esta 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.||
||NOCLIK|731|$2DB|Si 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.||
||HELPFG|732|$2DC|Esta posición de la memoria indica si la tecla HELP.
  * Ninguno = 7
  * HELP = 17
  * SHIFT + HELP = 81
  * CONTROL + HELP = 145||
||RUNAD|736, 737|$2E0, $2E1|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.||
||INITAD|738, 739|$2E2, $2E3|Tambié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.||
||RAMSIZ|740|$2E4|Esta 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.||
||MEMTOP|741, 742|$2E5, $2E6|Estas 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.||
||MEMLO|743, 744|$2E7, $2E8|Estas dos posiciones de memoria definen la primera posición disponible de la Ram para el usuario.||
||CRS1NH|752|$2F0|Esta 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 " "||
||CHBAS|756|$2F4|Set 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.||
||CH|764|$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. Si quiere saber el valor de cada letra o combinaciones revisa por ((Códigodeteclado acá))  ||
|#

===Página tres ===

#|
*|Nombre|Decimal |Hexadecimal|Descripción|*
||PRNBUF|960, 999|$3CO, $3E7|Estas 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.||
||CASBUF|1021, 1151|$3FD, $47F|Estas 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 6|1536 ,1791|$600, $6FF|Esta 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.||
||BASIC ROM|43234|$A8E2|Entrega la versión de la revisión del Basic que contiene el chip.
  * 162 es revisión A 
  * 96 es revisión B 
  * 234 es revisión C||
|#

===Chip Gtia===

#|
*|Nombre|Decimal |Hexadecimal|Descripción|*
||HPOSP0
----
M0PF
|53248|$D000|Escritura, Posición horizontal del player 0.
----
Lectura, Colisión del misil 0 con PLAYFIELD.||
||HPOSP1
----
M1PF
|53249|$D001|Escritura, Posición horizontal del player 1.
----
Lectura, Colisión del misil 1 con PLAYFIELD.||
||HPOSP2
----
M2PF
|53250|$D002|Escritura, Posición horizontal del player 2.
----
Lectura, Colisión del misil 2 con PLAYFIELD.||
||HPOSP3
----
M3PF
|53251|$D003|Escritura, Posición horizontal del player 3.
----
Lectura, Colisión del misil 3 con PLAYFIELD.||
||SIZEP0
----
M0PL|53256|$D008|Escritura, Tamaño del player 0.
----
Lectura, Detección de colisión del misil 0 con algún player. ||
||SIZEP1
----
M1PL|53257|$D009|Escritura, Tamaño del player 1.
----
Lectura, Detección de colisión del misil 1 con algún player. ||
||SIZEP2
----
M2PL|53258|$D00A|Escritura, Tamaño del player 2.
----
Lectura, Detección de colisión del misil 2 con algún player. ||
||SIZEP3
----
M3PL|53259|$D00B|Escritura, Tamaño del player 3.
----
Lectura, Detección de colisión del misil 3 con algún player. ||
||GRACTL|53277|$D01D|1 = DMA para missiles, 2 = DMA para player. ||
||HITCLR|53278|$D01E|Cualquier número borra registro de colisiones.||
||CONSOL|53279|$D01F|Posición usada para leer las teclas de la consola (START, SELECT y OPTION) según que teclas presiones entregara un valor que puede ser:
  * Ninguna = 7
  * START = 6
  * SELECT = 5
  * START + SELECT = 4
  * OPTION = 3
  * START + OPTION = 2
  * SELECT + OPTION = 1
  * START + SELECT + OPTION = 0||
|#

===Chip Pia===

#|
*|Nombre|Decimal |Hexadecimal|Descripción|*
||PORTA|54016|$D300|Puerta controlador E/S A.||
||PORTB|54017|$D301|Puerta controlador E/S B.||
||PACTL|54018|$D302|Entre otras cosas controla el motor de la casetera, en Basic usando  POKE 54018,52 enciende el motor y con POKE 54018,60 apagar el motor.||
||PBCTL|54019|$D303|Registro control puerta B.||
|#

===Chip Antic===

#|
*|Nombre|Decimal |Hexadecimal|Descripción|*
||PMBASE|53277|$D407|Dirección base para área de Player y misil.||
||WSYNC|54282|$D40A|Espera para sincronismo horizontal.||
||VCOUNT|54283|$D40B|Contador de líneas de barrido vertical.||
||NMIEN|54286|$D40E|Habilita interrupción no enmascarable. (192 para DLI: Display List Interrupt)||
|#


----
original está ubicado en: ((/Apuntes/MapadeMemoria))