Capítulo 3 - Dentro del 6502

En este capítulo vamos a mirar dentro de su computador Atari para ver cómo funciona. Entonces será capaz de encontrar el camino de entrada a su computador y finalmente empezar a programar en lenguaje ensamblador. Como explicamos en el capítulo 1, cada computador tiene tres partes principales: Una Unidad Central de Proceso (CPU – Central Processing Unit), memoria (dividida en RAM y ROM), y dispositivos de entrada y salida (tales como teclado, monitor de video, grabadoras de casette, y unidades de disco). En un micro-computador, todas las funciones de una CPU están contenidas en la Unidad de Microprocesador (a veces abreviado MPU – Micro Processor Unit). La MPU de su Atari es un microprocesador 6502.


https://www.atariware.cl/archivos/atariroots/ar11.jpg
El microprocesador 6502 de Atari

El microprocesador 6502 contiene siete partes principales: una Unidad Aritmética Lógica (ALU – Arithmetic Logical Unit) y seis registros direccionables. Los datos se mueven dentro del chip 6502, y entre el 6502 y los otros componentes de su computador a través de líneas de transmisión llamadas buses. Hay dos tipos de buses en un computador Atari: un bus de datos de 8-bits y un bus de direcciones de 16-bits. El bus de datos es utilizado para pasar datos de 8 bits y bytes de instrucción desde un registro del 6502 a otro, y también para pasar datos e instrucciones entre el 6502 y la memoria de su computador. El bus de direcciones se utiliza para estar al tanto de las direcciones de memoria de 16 bits de su computador: las direcciones de las que vienen instrucciones y datos, y las direcciones a las que van instrucciones y datos.


La Unidad Aritmética Lógica


El componente más importante de su equipo es el chip 6502. Y la parte más importante de chip 6502 es su Unidad Aritmética Lógica (ALU – Arithmetic Logical Unit). Cada vez que su equipo realiza un cálculo o una operación lógica, la ALU es la que realiza todo el trabajo. La ALU puede realizar sólo dos tipos de cálculos: sumas y restas. Problemas de división y multiplicación también pueden ser resueltos por la ALU, pero sólo en forma de secuencias de sumas y restas. La ALU también puede comparar valores, restando un valor de otro, y luego observando los resultados de la resta. La ALU del chip 6502 tiene dos entradas y una salida. Cuando dos números se van a sumar, restar o comparar, uno de los números es alimentado a la ALU a través de una de sus entradas, y el otro número es alimentado a través de la otra entrada. La ALU se encarga de efectuar el cálculo solicitado, y pone el resultado en un bus de datos para que pueda ser transportado a donde sea necesario en el programa.
En los diagramas del chip 6502, la ALU es a menudo representada por un contenedor en forma de V. Los brazos de la V son las entradas de la ALU, y la parte inferior de la V es la salida de la ALU. Cuando se necesita realizar un cálculo o una operación lógica en la ALU, uno de los datos y el operando (adición o sustracción) son depositados en una de las entradas de la ALU (un brazo de la V). El otro dato se deposita en la otra entrada (el otro brazo la V). Cuando el cálculo se realice, el resultado es expulsado a través de la salida de la ALU (la parte inferior de la V).


El acumulador


La ALU no trabaja sola, sino que lleva a cabo todas sus operaciones con la ayuda de un registro del 6502 llamado el Acumulador (abreviado "A" – Accumulator). Cuando la ALU es llamada para sumar o restar dos números, uno de los números es puesto en un bus de datos y luego enviado a una de las entradas de la ALU, junto con un operando. El otro número se encuentra en el acumulador. Cuando el bus que transporta al número y su operando vuelca su contenido en la ALU, se pone el número que contiene el acumulador en el bus de datos y se envía ese número a la ALU. Cuando la ALU ha llevado a cabo el cálculo solicitado, deposita el resultado del cálculo en el acumulador.


Un ejemplo


Supongamos, por ejemplo, que necesita que su computador sume 2 más 2, y luego coloque el resultado del cálculo en una posición de memoria determinada. Se podría utilizar una rutina de lenguaje ensamblador como ésta:


LDA #02
ADC #02
STA $CB

La primera instrucción en esta rutina, "LDA", significa "cargue el acumulador – LoaD the Accumulator" (con el valor que viene a continuación). En este caso, ese valor es 2. El símbolo "#" delante del 2 significa que el 2 debe ser interpretado como un número literal, no como la dirección de una posición de memoria en su computador.


La segunda instrucción de la rutina, ADC, significa "Suma con acarreo – ADd with Carry". En esta suma no hay ningún número que deba ser acarreado, por lo tanto la parte "acarreo" de la instrucción no tiene ningún efecto en este caso, y todo lo que hace la instrucción ADC es sumar 2 más 2.


La tercera y última instrucción en nuestra rutina, STA, significa "almacenar el contenido del acumulador – STore the contents of the Accumulator" (en la dirección de memoria que viene a continuación).


Como puede ver, la dirección de memoria a continuación de la instrucción STA es $CB, el hexadecimal correspondiente al número decimal 203. Dado que no hay signo "#" delante del número hexadecimal $CB, el ensamblador no interpretará $CB como un número literal. En cambio, $CB será interpretado como una dirección de memoria, que es como debe ser interpretado un número en lenguaje ensamblador cuando éste no es un número literal. (Por cierto, si quiere que su ensamblador interprete $CB como un número literal, usted tendría que escribir "#$CB". Cuando un símbolo "#" y un signo de dólar "$" aparecen antes de un número éste se interpreta como un número hexadecimal literal.) Sin embargo, si la tercera línea de nuestra rutina fuera STA #$CB, tendríamos un error de sintaxis. Esto porque STA (almacenar el contenido del acumulador en...) es una instrucción que tiene que ser seguida por un valor que pueda ser interpretado como una dirección de memoria, y no por un número literal.


Otros Cinco Registros


Además del acumulador, el procesador 6502 tiene otros cinco registros. Estos son el registro X, el registro Y, el Contador del Programa ("Program Counter"), el Puntero de la Pila ("Stack Pointer"), y el Registro de Estado del Procesador ("Processor Status Register"). He aquí un breve resumen de las funciones de cada uno de estos registros.


Los Otros Registros del 6502


  • El Registro X (abreviado "X") es un registro de 8 bits que se utiliza a menudo para el almacenamiento temporal de datos durante la ejecución de un programa. Sin embargo, el registro X tiene una característica especial: también puede ser incrementado y disminuido en su valor con el par de instrucciones de un byte INX y DEX en lenguaje ensamblador, y es por lo tanto usado a menudo como un registro índice, o contador, en los bucles y durante la ejecución de instrucciones de programas de lectura de información.
  • El Registro Y (abreviado "Y") es un registro de 8 bits, y también puede ser incrementado y disminuido en su valor con el par de instrucciones de un byte INY y DEY. Así que el registro Y, tal como el registro X, se utiliza para el almacenamiento de datos y como contador.
  • El Contador del Programa (abreviado "PC – Program Counter") es un par de registros de 8 bits que se utilizan juntos como si fueran un solo registro de 16 bits. A veces a los dos registros de 8 bits que se combinan para formar el Contador de Programa se les denomina "Contador del Programa-Bajo (PCL – Program Counter-Low)" y "Contador del Programa-Alto (PCH – Program Counter-High)". El Contador del Programa siempre contiene la dirección de memoria de 16 bits de la siguiente instrucción a ser ejecutada por el procesador 6502. Cuando la instrucción se ha ejecutado, la dirección de la siguiente instrucción se cargará en el contador de Programa.
  • El Puntero de la Pila (abreviado "S" o "SP") ("Stack Pointer") es un registro de 8 bits que siempre contiene la dirección del elemento superior de un bloque de memoria RAM llamado la Pila de Hardware ("Hardware Stack"). Por lo general, a la Pila de Hardware se le conoce simplemente como "La Pila". Es un segmento especial de memoria en la que los datos se almacenan temporalmente durante la ejecución de un programa. Más adelante vamos a entrar en más detalles acerca de cómo funciona la Pila.
  • El Registro de Estado del Procesador ("Processor Status Register", por lo general llamado simplemente el "Registro de Estado," pero abreviado "P"), es un registro de 8 bits que está al tanto de los resultados de las operaciones que han sido realizadas por el procesador 6502.

El Registro de Estado del Procesador


El Registro de Estado del Procesador § es un poco diferente de los otros registros en el microprocesador 6502. No se utiliza para almacenar números de 8 bits ordinarios, como los otros registros del 6502. En su lugar, los bits de este registro son banderas ("flags") que están al tanto de información importante. Cuatro de los bits del Registro de Estado se llaman Banderas de Estado. Estos son la Bandera de Acarreo ("Carry Flag – C"), la Bandera de Desbordamiento ("Overflow Flag – V"), la Bandera de Negativo ("Negative Flag – N"), y la Bandera de Cero ("Zero Flag – Z"). Estos cuatro indicadores se utilizan para hacer un seguimiento de los resultados de las operaciones que se llevan a cabo en los otros registros del procesador 6502.


Tres de los otros bits del registro P, llamados Banderas de Condición, se utilizan para determinar ciertas condiciones existentes en un programa. Estos tres bits son la Bandera de Deshabilitación de Interrupción ("Interrupt Disable Flag – I"), la Bandera de Ruptura ("Break Flag – B"), y la Bandera de Modo decimal ("Decimal Mode Flag – D"). El octavo bit del registro de estado no se utiliza.


https://www.atariware.cl/archivos/atariroots/ar12.jpg

Diagrama del Registro de Estado del Procesador


El Registro de Estado puede ser imaginado como una caja rectangular que contiene seis compartimentos cuadrados. Cada "compartimiento" de la caja es en realidad un bit, y cada bit es utilizado como una bandera.


Si un bit es un "1" en vez de un "0", entonces se dice que es una bandera que ha sido activada ("set").


Si un bit es un "0" en vez de un "1", entonces se dice que es una bandera que ha sido desactivada ("cleared").


Los bits en el Registro de Estado de 6502, al igual que los bits en todos los registros de 8 bits, habitualmente son numerados del 0 al 7. El bit más a la derecha es el bit 0. El bit más a la izquierda es el bit 7.


Una ilustración del Registro de Estado del procesador


https://www.atariware.cl/archivos/atariroots/ar13.jpg
Las siete banderas del Atari

He aquí una lista completa de las banderas en el Registro de Estado del Procesador 6502, y una explicación de lo que significa cada una de ellas.


Bit 0 (El bit de más a la derecha)
La Bandera de Acarreo ( C )


Como vimos en el capítulo 2, no es fácil hacer aritmética de 16 bits en un chip de 8 bits como el 6502. Cuando el chip 6502 requiere realizar una operación de suma con un número superior a 255, o si el resultado de un cálculo es mayor que 255, se tiene que escribir un programa que divida cada número en segmentos de 8 bits para poder ser procesados, y posteriormente juntar los números nuevamente. Esta clase de matemática de cortar y pegar, como usted podrá imaginar, implica una gran cantidad de acarreos (si se están realizando sumas) y préstamos (cuando el 6502 realiza una resta). La bandera de Acarreo del registro P del 6502 está al tanto de todos estos acarreos y préstamos.


Si una suma implica un acarreo, la bandera de Acarreo se activa automáticamente. Y si una resta implica un préstamo, la bandera de acarreo estará al tanto de eso también. Dado que la bandera de acarreo se activa y desactiva casi constantemente como consecuencia de los acarreos y préstamos de sumas y restas, es siempre una buena idea desactivarlo antes de realizar una suma, y activarlo antes de realizar una resta. De lo contrario, existe la posibilidad de que su cálculo se corrompa debido a los resultados de las sumas y restas realizadas anteriormente.


Además de estar al tanto de las sumas y restas, la bandera de Acarreo del registro P también es utilizada en operaciones de comparación de valores, y en operaciones de desplazamiento ("shift") y rotación de bits para comprobar, comparar y manipular bits específicos de un número binario. Hablaremos de las comparaciones de números y las operaciones sobre bits en capítulos posteriores. Por ahora, es más importante recordar que la instrucción en lenguaje ensamblador para desactivar el bit de Acarreo del registro P es CLC, que significa Limpiar Acarreo ("CLear Carry"), y que la instrucción para activar el bit es SEC, que significa Activar Acarreo ("SEt Carry").


Bit 1 (El segundo bit de la derecha)
La Bandera Cero ( Z )


Cuando el resultado de una operación aritmética o lógica es cero, la bandera Cero del Registro de Estado se activa automáticamente. Sumas, restas y operaciones lógicas pueden resultar en cambios en el estado de la bandera Cero. Si una posición de memoria o un registro de índice son decrementados hasta llegar a cero, se desactivará la bandera Cero. Una convención irónica del 6502 es que cuando el resultado de una operación es cero, la bandera Cero tendrá el valor 1 (activado), y cuando el resultado de una operación es distinto de cero, la bandera Cero tendrá el valor 0 (desactivado). Es importante entender este concepto, ya que sería fácil suponer que la bandera Cero opera de manera contraria. No hay instrucciones en lenguaje ensamblador para activar o desactivar la bandera Cero. Es estrictamente un bit "de solo lectura", por lo que no hay instrucciones para modificarlo.


Bit 2 (El tercer bit de la derecha)
La Bandera de Deshabilitación de Interrupción ( I )


Los programas Atari pueden contener interrupciones, es decir, instrucciones que detienen temporalmente las operaciones para que se puedan realizar otras. Unas se llaman Interrupciones Enmascarables ("Maskable Interrupt") porque se puede prevenir que se ejecuten por medio de la utilización de instrucciones de ocultación ("masking") dentro de un programa. Las otras se llaman No-Enmascarables ("nonmaskable") porque no se puede evitar que se ejecuten, sin importar lo que se pueda hacer al respecto. Cuando desee desactivar una interrupción enmascarable, puede hacerlo usando la bandera de Deshabilitación de Interrupción del registro P. Cuando se activa esta bandera, no se permitirá la ejecución de interrupciones enmascarables. Cuando está desactivada, se permite la ejecución. La instrucción en lenguaje ensamblador para desactivar la bandera de interrupciones es CLI ("CLear Interrupt"). La instrucción para activar la bandera de interrupciones es SEI ("SEt Interrupt").


Bit 3 (El cuarto bit de la derecha)
La Bandera de Modo Decimal ( D )


El procesador 6502 normalmente funciona en modo binario, es decir, usando números binarios estándar del tipo que se discutieron en el capítulo 2. Pero el 6502 también puede operar en lo que se conoce como “modo decimal codificado en binario”, o modo BCD ("Binary-Coded Decimal"). Para poner al 6502 en modo BCD, se tiene que activar la bandera Modo Decimal del Registro de Estado del 6502. La aritmética BCD es más lenta que la aritmética binaria simple, y además consume más memoria. Sin embargo, sus resultados, a diferencia de las de la aritmética binaria simple, siempre son 100 por ciento exactos. Por lo tanto, es de uso frecuente en los programas y rutinas en la que la precisión es más importante que la velocidad o la eficiencia de la memoria.


Un ejemplo de un programa que utiliza aritmética BCD es el intérprete Atari BASIC. En el BASIC de Atari los números se almacenan como números BCD de 6 bytes, y toda la aritmética se realiza con la aritmética BCD. Debido a esta característica, Atari BASIC es un poco lento. Sin embargo, sus cálculos dan resultados precisos. Otra ventaja de los números BCD es que son más fáciles de convertir a números decimales en comparación a los números binarios. Así los números BCD a veces son usados en programas que requieren la visualización instantánea de números en un monitor de video.


Vamos a discutir el modo BCD en el capítulo 10, Matemáticas del Lenguaje Ensamblador. Por el momento, es suficiente decir que cuando se activa la bandera Modo Decimal del Registro de Estado, el chip 6502 llevará a cabo todas sus operaciones matemáticas usando números BCD. La Aritmética BCD es algo que usted rara vez deseará usar en un computador Atari, por lo que normalmente querrá asegurarse de que la bandera Decimal esté desactivada cuando el equipo esté realizando operaciones matemáticas. La instrucción en lenguaje ensamblador que desactiva la bandera decimal es CLD ("CLear Decimal"), y la instrucción que activa la bandera es SED ("SEt Decimal").


Bit 4 (El quinto bit de la derecha)
La Bandera de Detención ("Break") ( B )


La bandera de detención se activa mediante la instrucción especial BRK ("BReaK"). Diseñadores de programas a menudo usan la instrucción de detención en la fase de depuración (“debug”) de programas en lenguaje ensamblador. Cuando se utiliza esta instrucción y la bandera de detención ha sido activada, se llevan a cabo unas operaciones de marcado de errores (“Error Flagging”) y el control del equipo vuelve al programador. La instrucción de detención es una herramienta de depuración muy compleja, y no vamos a entrar en muchos detalles al respecto en este libro. Pero puede aprender más sobre esta instrucción en algunos de los textos avanzados de programación del 6502 que se nombran en la bibliografía.


Bit 5 (El sexto bit de la derecha)
[Bit sin uso]


Por alguna razón, los microprogramadores que diseñaron el Registro de Estado del 6502 dejaron un bit sin usar. Este es el único.


Bit 6 (El segundo bit de la izquierda)
La Bandera de Desbordamiento ( V )


La Bandera de Desbordamiento se utiliza para detectar un desbordamiento del bit 6 de un número binario. Si no sabe lo que esto significa, no se preocupe. La bandera de desbordamiento se usa principalmente en aritmética avanzada del 6502, en particular cuando se está realizando aritmética binaria para estar al tanto de los cambios en los signos más y menos de números con signo ("signed numbers"). Como programador de lenguaje ensamblador de Atari, raramente, si es que alguna vez, tendrá la oportunidad de utilizar la Bandera de Desbordamiento. Sin embargo, vamos a discutirlo en mayor detenimiento en el capítulo 10, Matemáticas del Lenguaje Ensamblador. Por ahora, vamos a agregar que la instrucción en lenguaje ensamblador para desactivar la Bandera de Desbordamiento es CLV ("CLear oVerflow"). No hay ninguna instrucción para activar esta bandera.


Bit 7 (El bit de la izquierda)
La Bandera Negativo


La Bandera Negativo se activa cuando el resultado de una operación es negativo, y se desactiva cuando el resultado de una operación es cero. Se utiliza a menudo en operaciones de números con signo, y también tiene otros usos que se discutirán en capítulos posteriores. No hay instrucciones para activar o desactivar la Bandera Negativo. No hay necesidad para ello, ya que la bandera se utiliza solamente para propósitos de comprobación.


Su Gran Oportunidad


Ahora que sabe lo que sucede dentro del procesador 6502 de su computador, ya está preparado para escribir y ejecutar su primer programa en lenguaje ensamblador. Tendrá la oportunidad de hacerlo precisamente en el próximo capítulo. Pero antes, aquí está la oportunidad de ejecutar otro programa extra que contiene algunos valores en lenguaje de máquina que pueden ser ingresados por medio de POKEs dentro de un programa en BASIC. Esta rutina, Programa Extra N º 3, convertirá el teclado de su computador en un teclado musical. Digítelo y ejecútelo, y luego veremos cómo funciona.


PROGRAMA EXTRA N° 3
"D:SOUNDOFF.BAS"


10 REM "D:SOUNDOFF.BAS"
20 INKEY=35:FREQ=53760
30 SOUND 0,0,0,0:GRAPHICS 0:OPEN #1,4,0,"K:"
35 GET #1,K:IF K=32 THEN SOUND 0,0,0,0:PRINT CHR$(K):GOTO INKEY:REM 32 ES UN ESPACIO
40 IF K<64 OR K>122 THEN GOTO INKEY:REM NO ES LETRA
50 IF K>90 AND K<97 THEN GOTO INKEY:REM NO ES LETRA
60 IF K>90 THEN K=K-32:REM CAMBIO DE MINUSCULAS A MAYUSCULAS
70 TONE=K-64:IF TONE<1 OR TONE>7 THEN GOTO INKEY:REM NO A,B, C,D,E,F o G
80 PRINT CHR$(K);:GOSUB 1000
90 ON TONE GOTO 100,200,300,400,500,600,700
100 POKE FREQ,145:GOTO INKEY:REM A
200 POKE FREQ,134:GOTO INKEY:REM B
300 POKE FREQ,121:GOTO INKEY:REM C
400 POKE FREQ,108:GOTO INKEY:REM D
500 POKE FREQ,96:GOTO INKEY:REM E
600 POKE FREQ,91:GOTO INKEY:REM F
700 POKE FREQ,81:GOTO INKEY:REM G
1000 SOUND 0,255,10,8:RETURN :REM CONFIGURA REGISTRO DE AUDIO PARA LAS NOTAS A TOCAR

Cómo funciona


En las líneas 30 y 35 de este programa los registros de audio de su computador se inicializa en cero y se configura un bucle o ciclo para imprimir los caracteres en la pantalla. En las líneas 40 y 70 se llevan a cabo algunas verificaciones para ver si los caracteres que se han digitado son notas válidas: A, B, C, D, E, F o G. Para hacer que el programa funcione sin problemas, en la línea 60 automáticamente se convierte a mayúsculas cualquier carácter que haya sido escrito en minúsculas. En la subrutina en la línea 1000 los registros de audio de su computador se preestablecen para reproducir las notas de la A a la G, cuando las teclas correspondientes son presionadas, a menos que dicha tecla sea un espacio. Si la tecla es un espacio, todos los registros de audio se apagan, se imprime un espacio en la pantalla, y se le ordena al computador que espere la siguiente tecla presionada (lo que ocurre en la línea 35).


Las instrucciones de lenguaje de máquina en el programa están en líneas de la 100 a la 700. En estas líneas, un registro de memoria en su computador (llamado FREQ en este programa) es asignado con un valor que equivale a una nota musical. Cada vez que cambia el valor, la nota que se está reproduciendo cambia. Este es un programa muy simple que ni siquiera comienza a explorar las elaboradas capacidades de sonido de los computadores Atari.


Las formas en que este programa pueda ampliarse sólo están limitadas por la imaginación del usuario. Puede hacer el programa un poco más complicado, agregándole la capacidad de reproducción de sostenidos y bemoles (con la tecla de control, por ejemplo), y también se puede añadir más octavas (por ejemplo, con la tecla de mayúsculas, las teclas de números, o combinaciones de las teclas Shift y Control). ¡Podría cambiar los colores de la pantalla a medida que las notas cambian o podría almacenar las melodías en la memoria de su computador y guardarlas en un disco, y podría incluso ser capaz de encontrar una manera de tocar acordes! Puede hacer todas estas cosas en BASIC, si lo desea o, si fuera más ambicioso, podría ir más allá del BASIC y seguir aprendiendo más acerca de lenguaje ensamblador de su Atari. Lo que nos lleva al Capítulo 4. Siga leyendo.