El Hardware del Atari
Ahora aprenderemos un poco sobre el caballo de batalla de nuestro ATARI, es decir, la familia de microprocesadores 6502. Toda la computación real en nuestro ATARI se realiza dentro del chip conocido como CPU (Central Process Unit - Unidad Central de Procesamiento), a veces llamado MPU (Micro Processing Unit - Unidad de microprocesamiento). Diferentes computadoras usan diferentes microprocesadores, entre ellas la Z-80, la 8080 y la 6502. Las computadoras ATARI y muchas otras máquinas populares utilizan como CPU el 6502, o una variante como el 6502A o el 6502B. Cuando hablamos de programación en Lenguaje de Máquina o lenguaje Ensamblador, en realidad estamos hablando de programar directa o indirectamente el 6502. Además del microprocesador 6502, nuestro ATARI tiene adicionalmente tres chips especializados, que no se encuentran en ningún otro microcomputador. Se llaman ANTIC, POKEY y GTIA (O CTIA en algunos de los primeros ATARI). Trabajan en conjunto con el 6502 para producir los espectaculares gráficos y sonidos que todos hemos llegado a asociar con las computadoras ATARI. Su presencia explica por qué frecuentemente un programa escrito para otro microcomputador se ve y suena mucho mejor en el ATARI. Los usos de cada uno de estos chips y las formas de acceder a ellos desde nuestros programas se analizarán más adelante en este libro.
Hagamos un breve recorrido exploratorio por el 6502 y aprendamos un poco sobre su funcionamiento. Lo primero que nos sorprenderá saber es que nuestra poderosa computadora en realidad sólo sabe o comparar dos números, o sumarlos o restarlos. ¿Qué pasó con las raíces cuadradas? ¿La división y la multiplicación? ¿Todas esas matemáticas complejas que podemos hacer tan fácilmente en BASIC? Dado que estas funciones en realidad son solo combinaciones de comparaciones, sumas y restas, podemos enseñarle fácilmente a nuestro ATARI cómo realizar matemáticas complejas, como veremos más adelante. Mientras tanto, veamos cómo funciona nuestra computadora. Hay seis partes para cada miembro de la familia 6502 (Fig. 3-1), analizaremos cada una de ellas individualmente y luego hablaremos sobre cómo funcionan en conjunto.
EL ACUMULADOR
La primera parte de este complejo chip es el Acumulador, normalmente llamado "A" en lenguaje Ensamblador. Esta es la parte que realmente hace el cálculo: las comparaciones, las sumas y las restas. Una forma de pensar en el Acumulador es imaginarlo como si se pareciera a la letra Y mayúscula. Puede introducir números en cada uno de los brazos superiores y operar con ellos (sumar o restar) para producir un resultado que se pueda extraer desde la parte inferior. El Acumulador es el único lugar del computador que puede operar con dos datos al mismo tiempo. Pensemos por un momento en una analogía simple en BASIC. Si
POKE 752,1
y luego inmediatamente seguimos esta instrucción con
POKE 752,0
sabemos que la ubicación 752 ahora tendrá el valor cero. Es decir, no puede tener ambos valores simultáneamente. También sabemos que no podemos sumar 12 directamente al valor almacenado en la ubicación de memoria 752. Para hacer esto en BASIC, se necesitaría el siguiente programa:
10 I=PEEK(752) 20 I=I+12 30 POKE 752,I
Lo que hicimos fue sacar el valor almacenado en la ubicación de memoria 752, sumarle 12 y colocar el nuevo valor nuevamente en la ubicación de memoria 752. ¿Cómo aumentamos el valor en 12?
Usamos el Acumulador para aumentar el valor de I en 12 en la línea 20. Más adelante se explicará cómo hicimos esto y las instrucciones necesarias para esta manipulación. Por ahora basta con darse cuenta de que la única parte de nuestro ATARI que realmente puede realizar operaciones matemáticas es el Acumulador. Siempre que necesitemos realizar algún cálculo, debemos seguir el patrón que se muestra arriba en el ejemplo BASIC: Es decir, debemos cargar el valor a cambiar en el Acumulador, cambiarlo y almacenarlo nuevamente donde lo necesitemos. Como veremos en breve, esta es una operación fundamental en la programación en lenguaje Ensamblador.
LOS REGISTROS X E Y
Nuestro recorrido por el 6502 continúa con las siguientes dos partes del chip, los registros X e Y. Estas dos ubicaciones de almacenamiento están alojadas directamente en la CPU 6502, a diferencia de muchas otras ubicaciones de memoria en nuestro ATARI. No se puede acceder a ellos directamente desde BASIC, pero se abordan con frecuencia desde lenguaje Ensamblador. Los registros se pueden utilizar de dos maneras: La primera es bastante simple y es exactamente análoga al comando POKE del BASIC. Es decir, podemos utilizar estos dos registros como simples ubicaciones de almacenamiento para albergar información que sabemos que necesitaremos en breve. Este es un uso bastante simple de estos dos poderosos registros. Su segundo uso es como contadores de desplazamiento o registros índice. Por ejemplo, supongamos que queremos acceder primero a la ubicación 752, luego a la 753 y luego a la 754. En BASIC, podemos hacer esto de dos maneras:
10 A(1)=PEEK(752) 20 A(2)=PEEK(753) 30 A(3)=PEEK(754)
o
10 FOR X=0 TO 2 20 A(X)=PEEK(752+X) 30 NEXT X
La primera forma generalmente se conoce como el enfoque de "fuerza bruta". Funciona bien siempre que el número de elementos a los que se puede acceder sea bajo, pero si simplemente cambiamos el problema para requerir el acceso a 30 ubicaciones en lugar de 3, nuestro programa crecerá hasta tener 30 líneas de largo en lugar de 3. En el segundo ejemplo, lo único que cambia es el 2 en la línea 10. Esta es una solución más general y mucho más versátil al problema planteado. Como puede ver, estamos usando X como índice de desplazamiento desde la ubicación 752. Es decir, la primera vez que realizamos el ciclo, accedemos a la ubicación 752 + 0, o 752. La segunda vez que realizamos el ciclo, accedemos a la ubicación 752+1, o ubicación 753. Estamos usando el valor de X como un desplazamiento de la dirección base 752.
Los registros X e Y del 6502 se pueden usar exactamente de la misma manera, brindándonos una manera rápida y fácil de acceder a la información almacenada en ubicaciones de memoria consecutivas. Dado que se puede almacenar tanta información de esta manera (matrices, cadenas, tablas, pantallas y similares), tenemos una forma muy sencilla de generar información y descubrir lo que hemos creado.
EL CONTADOR DE PROGRAMA
Continuando con nuestro recorrido, nos encontramos con el Contador de Programa (PC - Program Counter). Lo primero que notamos sobre el Contador de Programa es que es el doble de grande que los otros registros en el 6502: 2 bytes de ancho (PCL, PCH), en lugar de solo 1; este es el único lugar en toda la computadora que puede actuar como un único registro de 16 bits (2 bytes). El Contador de Programa es responsable de recordar lo que viene A continuación, en su programa. Por ejemplo, todos hemos aprendido que en un programa BASIC, la línea 10 se ejecuta antes de la línea 20, que a su vez viene antes de la línea 30, y así sucesivamente, y que cada línea de BASIC se convierte a Lenguaje de Máquina antes de la ejecución. ¿Cómo recuerda la computadora dónde está y qué instrucción en Lenguaje de Máquina viene a continuación? El Contador de Programa lo dice. El Contador de Programa es un registro de 16 bits porque debe poder apuntar a cada ubicación de memoria de la computadora. Como aprendimos en el Capítulo 2, se requieren 16 bits para direccionar 65.536 ubicaciones de memoria, por lo que el Contador de Programa debe tener 16 bits de ancho. Recuerde, el Contador de Programa siempre apunta a la siguiente instrucción a ejecutar.
EL PUNTERO DE LA PILA
Antes de continuar nuestro recorrido por el 6502, ¿Qué tal si hacemos una parada para almorzar? Aquí hay una cafetería. Paremos aquí para tomar un bocado rápido. Primero consigamos una bandeja y cubiertos. A ver... ¿Algo más que necesitemos antes de pasar por la fila? Ah, sí, un plato. Tomaremos uno de esta pila, aquí. Observe cómo cuando agarramos un plato de la parte superior de la pila, toda la pila sube un plato, por lo que el siguiente plato ahora está en la posición en la que estaba el nuestro antes de que lo agarráramos. Es una pila de platos con un resorte en la base. Podríamos seguir quitando platos de la parte superior y todavía quedaría un plato en la misma posición superior. La pila sería un plato más corto y todos los platos de la pila estarían una posición más arriba, pero el plato superior siempre estaría en la misma posición, hasta que, por supuesto, nos quedáramos sin platos.
Ahora que ya hemos comido, volvamos a nuestro recorrido. El siguiente registro en el horizonte se llama Puntero de la Pila (SP - Stack Pointer)3. ¿Le suena familiar? Sí, funciona igual que la Pila de platos que acabamos de ver en la cafetería. Usemos un ejemplo BASIC nuevamente. Fíjese en el siguiente programa:
3 En otros textos al Puntero de la Pila también se le denomina Registro S. (N. del T.)
10 GOSUB 40 20 PRINT "GOODBYE" 30 END 40 PRINT "HELLO" 50 RETURN
Si trazamos el flujo de este programa, vemos que primero imprimimos en pantalla la palabra HELLO, y luego imprimimos la palabra GOODBYE justo debajo. Luego el programa finaliza. ¿Como sucedió esto?
Primero, vamos a la subrutina en la línea 40, donde imprimimos la primera palabra. Luego llegamos al RETURN en la línea 50, lo que hace que se ejecute la línea 20. ¿Cómo sabe la computadora que la línea 20 debería haber sido la siguiente línea ejecutada después de regresar de la subrutina? ¡Ajá! Ahí es donde entra en juego el concepto de Pila. BASIC utiliza una Pila de tiempo de ejecución, al igual que las Pilas que hemos estado analizando. Cuando se ejecutó la instrucción GOSUB en la línea 10, lo primero que hizo BASIC fue insertar el número de línea, y el desplazamiento dentro de esa línea, en su Pila de tiempo de ejecución. Esta Pila es distinta de la Pila 6502, ya que, en todas las computadoras basadas en 6502, la Página 1, es decir las ubicaciones de memoria de la 256 a la 511 inclusive, se usan como Pila. Ambas Pilas funcionan igual que la de la cafetería. Si luego insertamos direcciones adicionales en la Pila, la primera dirección simplemente se moverá hacia abajo en la Pila a medida que se agreguen números adicionales (Fig. 3-2).
El Puntero de la Pila, entonces, es la parte del 6502 que realiza un seguimiento de lo que se encuentra actualmente en la parte inferior de la Pila de la Página 1. No tenemos que preocuparnos de cuántos valores hay en la Pila ni de cómo agregar un valor a ella. El 6502 maneja toda esa sobrecarga por nosotros, al igual que BASIC se encarga de su propia Pila sin que nos preocupemos por ello. Lo único de lo que tenemos que preocuparnos es de no intentar meter más de 256 números en la Pila. Como el tamaño máximo de la Pila es de 256 números, si ponemos más números en ella, los primeros números que presionemos se caerán del fondo y los perderemos. Luego, cuando intentemos retirarlos para usarlos de alguna manera, no serán accesibles y probablemente tengamos un bloqueo.
Ahora que sabemos cómo colocar números en la Pila, ¿qué tal si los sacamos nuevamente? En nuestro ejemplo BASIC, terminamos la subrutina con la declaración RETURN en la línea 50. Esta declaración le dice a BASIC que extraiga el número de la línea superior, lo desplace fuera de la Pila, y regrese a esa ubicación. Así es como volvemos a la línea 20, que es donde se supone que debemos estar después de la subrutina. Observe que no necesitamos saber nada sobre Pilas para poder usar una subrutina en BASIC. Funciona prácticamente de la misma manera en lenguaje Ensamblador, aunque, como veremos, saber cómo funciona la Pila es importante para sus otros usos.
EL REGISTRO DE ESTADO DEL PROCESADOR
Completaremos nuestro recorrido por el 6502 visitando el registro de Estado del Procesador (Processor Status Register)4,que en realidad es solo una colección de varios indicadores que se almacenan en un byte y que el 6502 utiliza para identificar ciertas condiciones. Para aquellos que no han visto antes el término Bandera, ésta es una variable cuyo valor indica una determinada condición. Usemos un ejemplo en BASIC:
4 En otros textos al registro Estado del Procesador también se le denomina Registro P. (N. del T.)
10 I=0 20 IF FILE=33 THEN I=1 30 ...
En este ejemplo, podemos verificar en la línea 30 si FILE = 33 verificando el valor de I. Si I = 0 , entonces sabemos que FILE no es igual a 33, pero si I = 1, entonces sabemos que FILE = 33. En este ejemplo, I es una bandera que nos da información sobre el valor de FILE. De la misma manera, los siete indicadores en el registro de estado del procesador del 6502 nos brindan información considerable sobre lo que sucede durante nuestro programa. Cada bandera es un bit en el byte de este registro (Fig. 3-3). Las banderas suelen conocerse por sus abreviaturas de una sola letra, de la siguiente manera:
Letra | Bandera | Significado |
---|---|---|
C | Acarreo | 1 = verdadero |
Z | Cero | 1 = resultado cero |
I | Desactivar IRQ | 1 = desactivar |
D | Modo Decimal | 1 = verdadero |
B | Comando BREAK | |
V | Desbordamiento | 1 = verdadero |
N | Negativo | 1 = negativo |
LA BANDERA DE ACARREO
La Bandera de Acarreo o Bit "C" nos dice si la operación anterior estableció5 o no el bit de Acarreo; es decir, si una suma es o no mayor que 255. Como ejemplo simple, sumemos 250 + 250. Todos podemos calcular fácilmente (Quizás con un poco de ayuda de nuestros ATARI) que la respuesta es 500. Sin embargo, esto presenta un pequeño problema en la programación en lenguaje Ensamblador. Como sabemos que 255 es el número de 1 byte más grande que podemos tener, ¿Cómo podemos representar la respuesta a este simple problema? Bueno, podemos ver la respuesta como 500 – 255 con un acarreo. Es decir, dado que la respuesta es mayor que 255, llevamos 1 y la respuesta es 245 con un acarreo de 1. Pero, ¿cómo podemos diferenciar entre una respuesta de 245 y una respuesta de 245 con un acarreo? Dado que primero configuramos el bit de Acarreo en el Registro de Estado del procesador en cero y luego sumamos 250 más 250 en el Acumulador, terminamos con 245 restantes en el Acumulador. El bit de Acarreo ahora es 1, en lugar de cero, lo que nos permite calcular la suma verdadera. Si sumamos 240 + 5, encontraríamos nuevamente 245 como respuesta en el Acumulador, pero el bit de Acarreo sigue siendo cero, lo que nos permite distinguir entre las dos situaciones. Tenga en cuenta que, dado que cada uno de los dos números que sumamos debe ser menor que 256, nunca nos encontraremos con la situación en la que el acarreo tendrá que ser 2, por lo que un indicador de Acarreo de 1 bit es suficiente para nuestras necesidades. Como veremos, el bit de Acarreo se utiliza prácticamente en todas las operaciones matemáticas en lenguaje Ensamblador.
5 En lo sucesivo entenderemos por establecer o activar, a asignar el valor 1. Y a restablecer, desactivar, limpiar o borrar, a asignar el valor 0. (N. del T.)
LA BANDERA CERO
La Bandera Cero o Bit "Z" nos dice si la operación anterior arrojó o no un resultado igual a cero. Si este es el caso, la bandera Z es igual a 1. Por lo tanto, si la bandera Z comienza siendo igual a cero y restamos 2 menos 2, el Acumulador contendrá el valor 0 y la bandera Z será 1. Para determinar si algo es igual a cero, solo tenemos que operarlo de varias maneras posibles y luego mirar la bandera Z. Veremos cuán útil es esto en Capítulos posteriores.
LA BANDERA IRQ
IRQ significa Interrupt ReQuest (Solicitud de Interrupción). Si ha leído artículos sobre cualquiera de las técnicas más avanzadas posibles en las computadoras ATARI, probablemente esté familiarizado con el término Interrupción como interrupción de la Lista de Despliegue (Display List) o la interrupción del Blanqueo Vertical (Vertical Blank). Antes de terminar este libro, le resultará fácil agregar estas técnicas a sus propios programas. El 6502 puede interrumpir sus operaciones normales sólo si el indicador I es igual a 0. Si I es igual a 1, entonces las interrupciones normales no son posibles. Este hecho será importante en discusiones posteriores sobre varias interrupciones utilizadas en ATARI. Por ahora, recuerde que para que las interrupciones ocurran normalmente, el indicador I en el registro de Estado del Procesador debe ser igual a 0. Si configuramos el indicador I en 1, no se permitirán interrupciones. A esto lo llamamos enmascarar (masking) las interrupciones.
LA BANDERA DECIMAL
El 6502 tiene dos modos en los que puede operar: Binario y Decimal. El valor de la bandera Decimal "D" en el registro de Estado del Procesador determina en qué modo se encuentra el procesador. Si este valor es 1, todas las operaciones se realizarán en modo Decimal, y si es 0, serán binarias. En general, la mayoría de las operaciones en lenguaje Ensamblador utilizan matemáticas binarias, pero usted tiene la posibilidad de cambiar esto alternando esta bandera.
LA BANDERA BREAK
La bandera del comando BREAK, o Bit "B", sólo puede ser establecida y borrada por el propio 6502. El programador no puede modificar la bandera B. Se utiliza para determinar si una interrupción fue causada o no por la instrucción BRK (BReaK) del 6502. Dado que el programador no puede establecerlo ni borrarlo, el indicador B tiene poca utilidad en un programa normal y, en general, se usa solo para determinar el flujo del programa.
LA BANDERA DE DESBORDAMIENTO
Aunque cada byte consta de 8 bits, tal como lo analizamos en el Capítulo 2, en matemáticas binarias con signo el bit más significativo se utiliza para indicar el signo del número: Por lo tanto, el número con signo más grande que podemos representar en 1 byte es 128. Aquí hay una situación análoga a la de la bandera de Acarreo discutido anteriormente. ¿Qué pasa si intentamos sumar +120 y +120 juntos? La respuesta debería ser +240, pero expresar este número requiere el uso del bit más significativo, que, en matemáticas con signos, representa el signo, y no es parte del número. Por lo tanto, si estamos haciendo cálculos con signos, de alguna manera necesitamos una forma de determinar si los cálculos se han desbordado hacia el bit de signo. La bandera de Desbordamiento "V" se utiliza para determinar esto. Si la bandera V es 1, se ha producido un desbordamiento en el bit de signo, y si es 0, no se ha producido ningún desbordamiento. Por lo tanto, podemos comprobar este indicador para asegurarnos de que el número que hemos producido pueda interpretarse con seguridad como un número binario con signo. Es importante tener en cuenta este bit al realizar cálculos con signos y permitir que el programa maneje correctamente dicho desbordamiento, de modo que aún pueda interpretar correctamente los números con signo, independientemente del desbordamiento.
LA BANDERA NEGATIVO
La última bandera en el registro de estado del procesador es la bandera Negativo "N". Si esta bandera es igual a 1, la operación anterior arrojó un resultado negativo, y si la bandera N es igual a 0, el resultado fue positivo o igual a cero. Tenga en cuenta que luego podemos determinar si un número es cero o positivo comprobando la bandera Z. Las pruebas de los indicadores N, C y Z representan los métodos principales para permitir la bifurcación en un programa en lenguaje Ensamblador, similar a la lógica IF...THEN en los programas BASIC.
Con esto concluye nuestro breve recorrido por el chip 6502, el corazón de nuestra computadora ATARI. Ahora que conocemos el diseño del hardware, podemos comenzar a aprender las instrucciones necesarias para programarlo.
SISTEMA DE ASIGNACIÓN DE MEMORIA
Ya hemos discutido un aspecto de la asignación de memoria en computadoras que utilizan el 6502; es decir, el que la Pila ocupe un lugar específico en la memoria. La memoria en una computadora basada en el microprocesador 6502 se divide en Páginas, cada una de las cuales tiene 256 bytes de longitud. Probablemente ya haya encontrado el término Página, especialmente en relación con el área de memoria reservada para usted, el programador, por ATARI: la Página 6. Esta página es el área de memoria de la ubicación $600 a la $6FF, o en nomenclatura decimal, de la 1536 a la 1791, y ATARI afirma que ninguno de sus programas requerirá ese espacio, por lo que su uso es libre. En realidad, esto no es del todo cierto, así que tenga mucho cuidado al utilizar este espacio. La Página 6 está ubicada, de manera bastante inteligente, directamente encima de la Página 5; y la mitad superior de la Página 5 es utilizada por las computadoras ATARI para varios propósitos. Hay ciertas condiciones en las que puede desbordar esta área, y el desbordamiento se almacenará al principio de la Página 6, justo encima de su información cuidadosamente protegida. La moraleja: utilice la Página 6 con cuidado y sea consciente de los posibles peligros.
Otras páginas de memoria también tienen usos específicos en computadoras basadas en el microprocesador 6502. La más importante de ellas es la Página 0, o los primeros 256 bytes de memoria de la computadora. La Página 0 tiene un significado particular para el programador en lenguaje Ensamblador, ya que todo acceso a esta página es más rápido que el acceso a cualquier otro lugar de la computadora, dado que ciertas operaciones solo se pueden realizar utilizando las ubicaciones de la Página 0. Sin embargo, aquí nos topamos con un problema importante. Dado que esta área es tan importante, es posible que espere tenerla toda para su propio uso. ¡Se equivoca! Como es tan importante, ATARI utilizó casi toda la Página 0 para su propio uso. De hecho, si tiene instalado el cartucho BASIC o Assembler/Editor, ¡sólo 6 bytes de la Página 0 estarán disponibles para su uso! Así es, sólo seis. Así que vamos a aprender algunos trucos para que la Página 0 esté más disponible y haremos un uso sensato de las ubicaciones a nuestra disposición.
Aprenderemos mucho sobre las Páginas 2 a la 5 ($200 a $5FF, o decimal 512 a 1535), que contienen información que necesita el Sistema Operativo. Las páginas anteriores a la Página 6 generalmente están reservadas para el DOS. La memoria que el programador en lenguaje Ensamblador puede usar con seguridad sin correr el riesgo de que DUP.SYS sobrescriba programas generalmente comienza en $3200, o 12800 decimal. Cualquier cartucho que pueda estar presente generalmente comienza en $A000 y continúa hasta $BFFF; después de esto, la memoria para el Sistema Operativo llega hasta la parte superior de la memoria, $FFFF. Muchas de estas ubicaciones también se analizarán en detalle en Capítulos posteriores, pero este resumen sirve como una introducción al sistema de asignación de memoria en su ATARI. y, a grandes rasgos, nos da una idea general de qué cosa va en qué parte. Los detalles se completarán a medida que avancemos.
Índice de Contenido | Capítulo anterior | Siguiente capítulo