Idioma

El conjunto de instrucciones del 6502

Una observación con respecto al uso del conjunto de instrucciones del 6502. Cada lenguaje informático tiene su propia sintaxis, es decir, la forma en que se debe escribir cada comando para que la computadora lo entienda. Los diferentes ensambladores para ATARI requieren una sintaxis ligeramente diferente, que se describe en detalle en el Capítulo 6.


En este Apéndice, conoceremos los comandos que el 6502 puede ejecutar. El conjunto completo de comandos del 6502 generalmente se denomina conjunto de instrucciones del 6502. Aquí las instrucciones se describen en orden alfabético para facilitar su consulta. Junto a cada instrucción encontrará:


1. Ejemplos de su uso.
2. Descripciones de los distintos modos de direccionamiento disponibles para esa instrucción (Consulte el Capítulo 5).
3. El efecto de cada instrucción sobre las diversas banderas en el registro de Estado del Procesador (Consulte el Capítulo 3).

ADC (Add with Carry) - Sumar el Acumulador y la Memoria, con Acarreo


LA INSTRUCCIÓN


Como se analizó en el Capítulo 4, cada instrucción para el 6502 se abrevia en un código de tres letras llamado mnemónico. La primera instrucción, ADC, es la única disponible para realizar la suma de dos números. A continuación, se muestra un ejemplo de su uso:


...; esto representa
...; algunas instrucciones
...; anteriores
ADC #2; sume 2 al contenido del Acumulador
...	

Examinemos qué sucede cuando ejecutamos esta instrucción. El 6502 toma lo que está contenido en el Acumulador y le suma el número decimal 2. La suma resultante permanece en el Acumulador, a la espera de más instrucciones. Sin embargo, hay una complicación. Recuerde, el nombre de esta instrucción es "Add with Carry" (Sumar con Acarreo). ¿Qué pasa con el Acarreo? Recuerde que el bit de Acarreo es una de las banderas en el registro de Estado del Procesador. Siempre que se encuentra la instrucción ADC, el bit de Acarreo se agrega a la suma en el Acumulador. Supongamos que justo antes de encontrar esta instrucción, almacenamos un cero en el Acumulador y el bit de Acarreo también era cero. La suma almacenada en el Acumulador tras la ejecución de esta instrucción seguiría siendo 2, como se describe. Sin embargo, si el bit de Acarreo hubiera sido 1, entonces la suma habría sido 3. Esquemáticamente, esta suma es la siguiente:


AcumuladorBit de AcarreoInstrucción= >SumaBit de Acarreo
00ADC #2= >20
01ADC #2= >30

Tenga en cuenta que, si el bit de Acarreo es inicialmente 1, se restablece a 0 después de ejecutar la instrucción ADC. Esto tiene sentido, ya que hemos usado el Acarreo. Si el 6502 no lo restableciera a 0, podríamos usar el bit de Acarreo dos veces sin darnos cuenta.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


El 6502 también establece el bit de Acarreo apropiadamente, como en los siguientes ejemplos:


AcumuladorBit de AcarreoInstrucción= >SumaBit de Acarreo
2530ADC #6= >31
2531ADC #6= >41

En el primer ejemplo, 253 + 6 = 259, pero sabemos que el número más grande que puede contener el Acumulador es 255. El número 256 representa cero, con un Acarreo de uno, por lo que 259 es 3 con un Acarreo de 1. El número 3 se almacena en el Acumulador y se establece el bit de Acarreo en 1.


En el segundo ejemplo, el bit de Acarreo comienza en 1, por lo que cuando se agrega a la suma, esta da 4. Recuerde, después de usar el bit de Acarreo, el 6502 lo restablece a cero. Entonces, ¿Por qué el ejemplo 2 termina con el bit de Acarreo activado? La suma era mayor que 255, por lo que el bit de Acarreo se estableció antes de que se completara la ejecución de la instrucción.


Ya hemos discutido la capacidad del 6502 para operar en modo Decimal. Tenga en cuenta aquí que el número más grande que el Acumulador puede almacenar en modo decimal es 99. El bit de Acarreo se establece después de que en una instrucción ADC en modo decimal, la suma es mayor a 99.


Varias otras banderas en el registro de Estado del Procesador también están condicionadas por la instrucción ADC. El bit de Desbordamiento "V" se establece en 1 cuando el bit 7, el bit más significativo, cambia debido a la suma. La bandera Negativo "N" se establece en 1 si la suma produce un número mayor que 127; es decir, cuando el bit más significativo, el bit 7, es un 1. Recuerde que para el 6502, cualquier número entre 128 y 255 es un número negativo, porque su bit más significativo es un 1. Finalmente, la bandera Cero, Z, se establece en 1 si el resultado de la suma es cero. Algunos ejemplos de estas condiciones se muestran a continuación:


ANZCVInstrucción= >ANZCVComentarios
20000ADC #3= >50000Suma directa
20010ADC #3= >60000Recuerde: ¡Sume el Acarreo!
20000ADC #254= >00110Se establecen en 1 las banderas C y Z
20000ADC #253= >2551000Se establecen en 1 las banderas N y V
2531000ADC #6= >30011Se establecen en 1 las banderas C y V; la bandera N se restablece en 0
1250010ADC #2= >1281001Se establecen en 1 las banderas N y V; la bandera C se restablece en 0

Ahora debería ser evidente que, al consultar las distintas banderas, podemos obtener fácilmente una gran cantidad de información sobre los resultados de una suma. Se proporcionan instrucciones para comprobar estas banderas y se utilizan con frecuencia en la mayoría de los programas en lenguaje Ensamblador.


MODOS DE DIRECCIONAMIENTO


La instrucción ADC permite cualquiera de los mismos 8 modos de direccionamiento analizados en el Capítulo 5 para la instrucción LDA. Se ilustran a continuación, con el número de ciclos y bytes utilizados para cada instrucción:


ModoInstrucciónCiclosBytesSignificado
InmediatoADC #222A + #2
AbsolutoADC $342043A + contenido de la memoria $3420
Página CeroADC $F632A + contenido de la memoria $F6
Página Cero, XADC $F6,X42A + contenido de la memoria $F6 + X
Absoluto, XADC $3420,X43A + contenido de la memoria $3420 + X
Absoluta,YADC $3420,Y43A + contenido de la memoria $3420 + Y
Indirecto indexadoADC ($F6,X)62A + contenido de la dirección en $F6 + X
Indexado indirectoADC ($F6),Y52A + contenido de (dirección en $F6)+ desplazamiento Y

Para obtener explicaciones más completas de estos modos de direccionamiento, consulte el Capítulo 5.


AND - Realizar la operación lógica "Y" entre el Acumulador y la Memoria


LA INSTRUCCIÓN


La instrucción AND realiza la operación lógica "Y" entre el Acumulador y el operando. Un AND lógico toma dos números y los compara bit por bit. Para cada bit, si ambos números comparados contienen un 1, el resultado también contiene un 1; si alguno de los números contiene un cero, el resultado contiene un cero en ese bit. Veamos un ejemplo en el que el Acumulador contiene el número 5:


AND #$0E	

La forma más sencilla de visualizar la operación AND es convertir cada uno de los dos números que se comparan a nomenclatura binaria, de la siguiente manera:


Hex. Binario
#5 = #%00000101
#$0E = #%00001110

resultado= #%00000100 = #4

Podemos ver fácilmente que los únicos bits en el resultado que han sido establecidos en 1 son aquellos en los que ambos números que se comparan tienen un 1. En este ejemplo, el bit 2. Probemos con otro ejemplo. El Acumulador contiene 147, y esta es la instrucción:


AND #$1D	

Tal como hicimos arriba, convertimos a binario:


#147 = #%10010011
#$1D = #%00011101

resultado= #%00010001 = #17

Esta instrucción, bastante sencilla, se utiliza con frecuencia, por lo que ahora debería probar un ejercicio por su cuenta. Supondremos que el Acumulador contiene el número #$BC y esta es la instrucción:


AND #234	

Vea si puede encontrar la respuesta usted mismo.


La instrucción AND se utiliza para enmascarar un byte de una forma específica. Por ejemplo, supongamos que desea saber el valor del nibble bajo de un número. Para averiguarlo, simplemente haga un AND del número con #$0F. Dado que el nibble alto de este número es cero y el nibble bajo es todo unos, el resultado será igual al nibble bajo del número inicial. Del mismo modo, para obtener el nibble alto sólo tiene que hacer AND con #$F0. Ahora presentemos la respuesta al problema anterior:


#$BC = #%10111100
#234 = #%11101010

resultado= #%10101000 = #168

EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción AND establece en 1 la bandera Cero si el resultado es igual a cero, o lo restablece en 0 si el resultado es distinto de cero. Esta instrucción también establece la bandera Negativo si el resultado es mayor que 127, o la restablece en 0 si el resultado es menor que 128. A continuación, se muestran varios ejemplos de esto:


AZNInstrucción=>AZNSignificado
#5 00AND #8= >010Z establecido en 1 por resultado = 0
#$FE 01AND #$5F= > #$5E 00N restablecido en 0 por resultado < 127

MODOS DE DIRECCIONAMIENTO


La instrucción AND también se puede escribir en cualquiera de los mismos 8 modos de direccionamiento analizados en el Capítulo 5 para la instrucción LDA.


ModoInstrucciónCiclosBytesSignificado
Inmediato AND #222Hacer la operación lógica "Y" entre el Acumulador y el #2
Absoluto AND $342043Hacer la operación lógica "Y" entre el Acumulador y el contenido de la memoria $3420
Página CeroAND $F632Hacer la operación lógica "Y" entre el Acumulador y el contenido de la memoria $F6
Página Cero, XAND $F6,X42Hacer la operación lógica "Y" entre el Acumulador y el contenido de la memoria $F6 + X
Absoluto, X AND $3420,X43Hacer la operación lógica "Y" entre el Acumulador y el contenido de la memoria $3420 + X
Absoluto,Y AND $3420,Y43Hacer la operación lógica "Y" entre el Acumulador y el contenido de la memoria $3420 + Y
Indirecto indexadoAND ($F6,X)62Hacer la operación lógica "Y" entre el Acumulador y el contenido de la dirección en $F6 + X
Indexado indirectoAND ($F6),Y52Hacer la operación lógica "Y" entre el Acumulador y el contenido de (dirección en $F6) + desplazamiento Y

ASL (Arithmetic Shift Left) - Desplazar a la izquierda un bit (del Acumulador o de la Memoria)


LA INSTRUCCIÓN


La instrucción ASL utiliza el bit de Acarreo en el registro de Estado del Procesador como un noveno bit para un número, y mueve cada bit de ese número un lugar hacia la izquierda; de ahí el nombre de desplazamiento aritmético a la izquierda. Se introduce un cero en el bit menos significativo y el bit más significativo del número original termina en el bit de Acarreo "C". Una imagen vale más que mil palabras aquí:


C 76543210

0<=10110101<= 0
1 01101010

Veamos otro ejemplo:


C 76543210

0<=01101101<= 0
0 11011010

"¿Cuál es el propósito de esta instrucción?" se puede preguntar. Bueno, veamos más de cerca el último ejemplo. El número original, #%01101101, es #109 en notación decimal; luego del ASL, el número resultante es #%11011010, que es #218 en notación decimal. ¡Hemos duplicado el número con una sola instrucción! Dado que cada posición en un número binario es exactamente el doble del valor de la posición inmediatamente a la derecha, un desplazamiento hacia la izquierda duplica el valor de cada bit. Esta es una forma extremadamente sencilla de multiplicar números por potencias de 2: basta con hacer un ASL por cada potencia de 2 requerida.


PRECAUCIÓN: Aunque parece bastante fácil multiplicar un número por 2 usando la instrucción ASL, debe tener mucho cuidado y corregir el desbordamiento en el bit de Acarreo. Un ejemplo de esto es el primer conjunto de números anteriores. Comenzamos con #%10110101, que es el número decimal 181, y luego de nuestro ASL tenemos #%01101010, que es el número decimal 106. Ahora sabemos que 106 no es 2 por 181. De hecho, 2 por 181 es 362. Tenga en cuenta que esto es exactamente 106, el resultado que obtuvimos, más 256. Recuerde, en ese ejemplo, concluimos con un Acarreo de 1, que representa 256 cuando usamos la instrucción ASL para la multiplicación. Debe tener en cuenta este acarreo cada vez que utilice la instrucción ASL.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Como ya hemos visto, el bit de Acarreo contendrá el bit más significativo del número original. La bandera Negativo se establecerá igual al bit más significativo del resultado (bit 6 del número original). La bandera Cero se establecerá en 1 si el resultado es igual a cero y se restablecerá en 0 para cualquier otro resultado. En los ejemplos que se muestran a continuación, usaremos el modo de direccionamiento del Acumulador.


ANCZInstrucción= >ANCZ
#128100ASL A= >#0011
#64000ASL A= >#128100
#192100ASL A= >#128110
#8000ASL A= >#16000

MODOS DE DIRECCIONAMIENTO


A continuación, se enumeran ejemplos que utilizan los cinco modos de direccionamiento para la instrucción ASL:


ModoInstrucciónCiclosBytesSignificado
AcumuladorASL A21Hacer ASL al valor en el Acumulador
AbsolutoASL $342063Hacer ASL al contenido de la memoria $3420
Página CeroASL $F652Hacer ASL al contenido de la memoria $F6
Página Cero, XASL $F6,X62Hacer ASL al contenido de la memoria $F6 + X
Absoluto, XASL $3420,X73Hacer ASL al contenido de la memoria $3420 + X

Tenga en cuenta que esta instrucción tarda bastante en ejecutarse. De hecho, el modo de direccionamiento "Absoluto, X" de la instrucción ASL requiere 7 ciclos de máquina para ejecutarse: el más largo de todas las instrucciones de todo el conjunto del 6502. Sin embargo, debemos pensar en la velocidad en términos absolutos. El uso de esta instrucción nos permite realizar una multiplicación por 2 en 3,92 microsegundos, incluso en este modo más lento. Sigue siendo bastante rápido, ¡especialmente en comparación con el BASIC!


BCC (Branch on Carry Clear) - Bifurcar si se borra la bandera de Acarreo "C"


LA INSTRUCCIÓN


En BASIC, podemos distinguir entre dos tipos diferentes de comandos que transfieren el control de un programa a un nuevo número de línea. El primero es el comando GOTO directo: sabemos que el número de la siguiente línea a ejecutar siempre seguirá al comando GOTO.


45 GOTO 90
50 .
60 .
90 ? "Esta linea siempre sigue a la 45."	

Después de ejecutar la línea 45, la línea 90 es la siguiente línea en todas las condiciones. A esto se le llama transferencia de control Incondicional.


Un segundo tipo de transferencia en BASIC utiliza las capacidades de comparación y bifurcación de la computadora:


45 IF X<32 THEN 90
50 .
   .
   .
90 ? "Esta línea a veces sigue a la 45"	

En este ejemplo, si en la línea 45 el valor de la variable X es menor que 32, entonces se toma una bifurcación en el flujo del programa y la línea 90 se ejecuta a continuación. Si X es igual o mayor que 32, entonces no se toma la bifurcación y la línea 50 se ejecuta a continuación. Así, el flujo del programa depende de ciertas condiciones establecidas dentro del programa, y por esta razón, este tipo de transferencia se denomina transferencia de control Condicional. En este ejemplo, la condición es el valor de la variable X.


La instrucción BCC significa que si el bit de Acarreo está limpio (igual a cero), entonces el control del programa debe bifurcarse a una ubicación específica. Como en BASIC, si no se cumple la condición (en este ejemplo, si el bit de Acarreo es igual a 1), la siguiente línea ejecutada no es la línea especificada en la instrucción, sino la siguiente línea del programa.


Prácticamente en todos los casos, las bifurcaciones en lenguaje Ensamblador se especifican mediante etiquetas. Una etiqueta puede ser casi cualquier nombre que desee darle a una línea específica en un programa. Veamos un breve ejemplo:


BCC SKIP
     LDA $0345
     .
     . ; otras lineas
     . ; del programa
SKIP LDA $4582	

Vamos por partes. Primero, vemos la instrucción BCC SKIP. El bit de Acarreo puede ser uno o cero en el momento en que se ejecuta esta instrucción. Primero supongamos que el bit de Acarreo fue establecido en 1. Cuando se ejecuta esta línea, la prueba BCC falla: es decir, como la bandera de Acarreo no ha sido borrada (restablecida en 0), no se toma el salto a SKIP. La siguiente línea ejecutada carga el Acumulador desde la dirección $0345. Entonces el programa continúa con la siguiente línea y luego con la siguiente, y así sucesivamente.


Ahora supongamos que cuando se ejecuta BCC, el bit de Acarreo es cero. En este caso, se toma la bifurcación, ya que el de Acarreo ha sido borrado y la siguiente línea ejecutada carga el Acumulador desde la ubicación de memoria $4582. Luego se ejecutará la línea que sigue inmediatamente a la línea SKIP.


A estas alturas debería ser obvio que, además de las líneas reales de instrucciones en un programa en lenguaje Ensamblador, los valores de cada una de las banderas en el registro de Estado del Procesador son un factor importante para comprender un programa. Las instrucciones proporcionadas en el conjunto de instrucciones nos permiten controlar estos bits directamente.


Otra similitud más entre la instrucción BCC y una bifurcación condicional en BASIC es que la bifurcación puede ser hacia adelante o hacia atrás en el programa. El ejemplo anterior es una bifurcación directa. Para ver cómo se ve una bifurcación hacia atrás, veamos el siguiente ejemplo:


SKIP LDA $0254
.
.
     BCC SKIP	

En este caso, si el bit de Acarreo es igual a cero, retrocedemos desde BCC a SKIP. Si es igual a 1, la línea que sigue al BCC se ejecutará a continuación.


Existe una limitación importante para este tipo de bifurcaciones en lenguaje Ensamblador. La instrucción BCC puede transferir el control no más de 127 bytes hacia adelante o hacia atrás en el programa. Sólo se utiliza 1 byte para contener el valor de la bifurcación y cualquier número de 1 byte mayor que 127 se reconoce como un número negativo por lo que, si intentamos realizar una bifurcación de 130 bytes, el 6502 lo reconoce como una bifurcación negativa de 255-130 = 125 bytes. En lugar de avanzar en nuestro programa, retrocederemos una distancia considerable sobre el terreno que ya habíamos recorrido. La mayoría de los ensambladores detectarán el error si intentamos realizar una bifurcación demasiado grande y lo informarán como tal en el momento del ensamblaje, pero esto puede llevar mucho tiempo. Es mucho más fácil intentar evitar este problema mientras escribimos nuestros programas.


Una advertencia sobre las bifurcaciones relativas: la mayoría de los ensambladores permitirán una bifurcación de la forma


BCC +7	

lo que le indica al Contador de Programa que avance 7 bytes si el Acarreo ha sido borrado cuando se ejecuta esta línea.


PRECAUCIÓN: ¡¡¡ESTA ES UNA PRÁCTICA DE PROGRAMACIÓN MUY MALA!!!


El problema surge cuando intente leer su programa o, Dios no lo quiera, cambiarlo. Si inserta una línea poco después, la bifurcación tomada por este BCC probablemente será incorrecta. El uso de etiquetas para los puntos de destino de las bifurcaciones hace que su programa sea mucho más fácil de leer y reduce la posibilidad de errores. ¡No escriba bifurcaciones como las anteriores, bajo pena de largas, largas horas de depuración!


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento para la instrucción BCC es el modo Relativo, y ya hemos visto cómo funciona. Las bifurcaciones se toman o no, dependiendo del valor del bit de Acarreo. Las bifurcaciones son hacia adelante o hacia atrás en relación con la posición actual del Contador de Programa, que normalmente apunta al inicio de la línea inmediatamente después de la instrucción BCC. La instrucción BCC utiliza 2 bytes y requiere 2 ciclos de máquina para ejecutarse.


BCS (Branch on Carry Set) - Bifurcar si se establece en 1 la bandera de Acarreo "C"


LA INSTRUCCIÓN


BCS es exactamente lo opuesto a la instrucción BCC. La bifurcación se toma cuando el bit de Acarreo es igual a 1 y no se toma cuando el bit de Acarreo es igual a cero. En todos los demás aspectos, BCS y BCC son idénticos. Consulte las instrucciones BCC para obtener más detalles.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento disponible para la instrucción BCS es el modo Relativo. Su uso se describió anteriormente para la instrucción BCC. La instrucción BCS utiliza 2 bytes y requiere 2 ciclos de máquina para ejecutarse.


BEQ (Branch on Equal to Zero) - Bifurcar si el Resultado es igual a cero


LA INSTRUCCIÓN


La instrucción BEQ es similar a las instrucciones BCC y BCS, pero difiere en un aspecto importante. En lugar de utilizar el bit de Acarreo, la instrucción BEQ utiliza el bit Cero "Z" como factor determinante para evaluar si se debe tomar o no una bifurcación. Si el bit Cero es igual a 1, se toma la bifurcación. Recuerde, el bit Cero será igual a 1 sólo si alguna operación dio como resultado una respuesta igual a cero: de ahí el nombre Bifurcar en Igual a Cero. Si el bit Cero es igual a cero, el resultado anterior no fue igual a cero y no se tomará la bifurcación. Esto puede resultar un poco confuso al principio. La mejor manera de recordarlo es comprender que el bit Cero es una bandera y que la bandera se establece en 1 cuando se cumple una determinada condición. En el caso de la bandera Cero, la condición es el resultado igual a cero, lo que establece en 1 la bandera Cero. Recuerde, estamos comprobando que la bandera esté establecida en 1, no que la bandera sea igual a cero.


LDA #0
BEQ SKIP
.
.
SKIP LDA $2F	

En este ejemplo, cuando cargamos el Acumulador con cero, el bit Cero se establece en el registro de Estado del Procesador. Por lo tanto, la línea ejecutada después de BCC es SKIP, y no la siguiente línea del programa. Si en cambio cargamos el Acumulador con 1, no se tomará la bifurcación y el flujo del programa estará en orden.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


El único modo disponible para la instrucción BEQ es el modo Relativo, que se analiza en detalle en la sección sobre la instrucción BCC. La instrucción BEQ necesita 2 bytes de almacenamiento y requiere 2 ciclos de máquina para ejecutarse.


BIT (Test Bits in Memory with Accumulator) - Compara los bits del Acumulador con los de la Memoria


LA INSTRUCCIÓN


La instrucción BIT realiza un AND entre el número almacenado en el Acumulador y el número almacenado en la ubicación de memoria direccionada en la instrucción, pero es diferente de la instrucción AND habitual en una manera muy importante: la instrucción AND realiza la operación AND entre el número en el Acumulador y un número en una ubicación de memoria y almacena el resultado en el Acumulador. La instrucción BIT realiza el AND, pero no almacena el resultado en el Acumulador. "Entonces, ¿De qué sirve?", se puede preguntar.


Recuerde que la instrucción AND hace dos cosas. Primero realiza el AND y almacena el resultado en el Acumulador. En segundo lugar, establece y restablece varias banderas en el registro de Estado del Procesador. La instrucción BIT realiza la primera función sin almacenar el número, pero también realiza la segunda, que se analiza a continuación.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción BIT condiciona tres banderas en el registro de Estado del Procesador. La bandera Negativo se establece en el valor del bit 7, el bit más significativo, del byte almacenado en la ubicación de memoria que se está probando, y la bandera V (Desbordamiento) se establece en el valor del bit 6 del mismo byte. La bandera Cero "Z" se establece en 1 si el resultado de la operación AND es igual a cero; se reinicia en 0 si el resultado no es igual a cero. A continuación, se dan algunos ejemplos de la instrucción BIT, junto con sus efectos en las banderas del registro de Estado del Procesador. Para estos ejemplos, supongamos que la ubicación de memoria $0345 contiene el valor #$F3.


ANVZInstrucción= >ANVZ
#128100BIT $0345= >#128110
#5 000BIT $0345= >#1110
#4 000BIT $0345= >#0111
#3 001BIT $0345= >#3110

Esta instrucción se utiliza principalmente cuando desea saber algo sobre un valor almacenado en algún lugar de la memoria sin alterar el valor almacenado en el Acumulador. Por ejemplo, puede saber fácilmente si el número en la memoria es negativo, porque después de la operación BIT, se activará la bandera N si el número era negativo. De manera similar, puede saber si el bit 6 del número es uno o cero mirando la bandera V después de la operación BIT. Finalmente, puede determinar si un AND entre el Acumulador y el número en la memoria da como resultado un valor igual a cero probando la bandera Z. Tenga en cuenta que una operación AND entre cualquier número y cero producirá un resultado cero; por lo tanto, cada vez que el número direccionado en la memoria sea igual a cero, el resultado de la operación BIT será igual a cero y se activará la bandera Z. ¡Esto es mucha información para una instrucción que a primera vista parecía no hacer nada!


MODOS DE DIRECCIONAMIENTO


Sólo hay dos modos de direccionamiento disponibles para la instrucción BIT: Absoluto y Página Cero.


ModoInstrucciónCiclosBytesSignificado
AbsolutoBIT $342043Hacer la operación lógica "Y" entre el Acumulador y la memoria $3420
Página CeroBIT $F6 32Hacer la operación lógica "Y" entre el Acumulador y la memoria $F6

Dado que la instrucción BIT simplemente compara los valores almacenados en el Acumulador y en una ubicación de memoria específica, estos dos modos son suficientes para cualquier uso de BIT que pueda necesitar. Entre ellos abordan todo el espacio de memoria del computador.


BMI (Branch on Minus) - Bifurcar si el Resultado es menor a cero


LA INSTRUCCIÓN


BMI es otra de las instrucciones de bifurcación condicional en el conjunto de instrucciones del 6502. Utiliza la bandera Negativo en el registro de Estado del Procesador: la bifurcación se toma si la bandera Negativo está establecida en 1 y no se toma si este indicador es igual a cero. En todos los demás aspectos, BMI es similar a la instrucción BCC ya comentada. Lea esa discusión para obtener detalles sobre las instrucciones de bifurcación condicional y lea en la discusión a continuación de la instrucción BPL la advertencia sobre estas dos instrucciones.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento para la instrucción BMI es el modo Relativo, discutido para la instrucción BCC. La instrucción BMI necesita 2 bytes de memoria y requiere 2 ciclos de máquina para ejecutarse.


BNE (Branch on Not Equal to Zero) - Bifurcar si el Resultado no es igual a cero


LA INSTRUCCIÓN


BNE es exactamente lo opuesto a la instrucción BEQ. Con la instrucción BNE, se toma la bifurcación si la bandera Cero "Z" es igual a cero; es decir, cuando el resultado anterior fue distinto de cero. La bifurcación no se toma cuando la bandera Cero es igual a 1. Consulte la discusión de la instrucción BCC para obtener más detalles.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


Sólo el modo de direccionamiento Relativo, analizado en la instrucción BCC, está disponible para la instrucción BNE. La instrucción BNE necesita 2 bytes de memoria y requiere 2 ciclos de máquina para ejecutarse.


BPL (Branch on Plus) - Bifurcar si el Resultado es mayor a cero


LA INSTRUCCIÓN


Esta instrucción es exactamente lo opuesto a BMI. La bifurcación se toma a continuación de la instrucción BPL si la bandera Negativo es igual a cero y no se toma si esta bandera es igual a 1. Se debe mencionar una precaución para este par de instrucciones: para que la bifurcación se determine correctamente, por supuesto, la bandera Negativo debe haber sido asignada correctamente antes de ejecutar la instrucción BMI o BPL. Dado que no todas las demás instrucciones cambian la bandera Negativo, asegúrese de utilizar una que asigne correctamente este indicador antes de utilizar la instrucción BMI o BPL.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


Sólo el modo de direccionamiento Relativo está disponible para la instrucción BPL. Consulte la discusión sobre la instrucción BCC para obtener más detalles. La instrucción BPL necesita 2 bytes de memoria y requiere 2 ciclos de máquina para ejecutarse.


BRK Break (Forzar quiebre)


LA INSTRUCCIÓN


La instrucción BRK es algo análoga al comando STOP del BASIC. Sabemos que el comando STOP hace que el programa que se está ejecutando se detenga. En ese punto, el control regresa al cartucho BASIC, que indica que vuelve a estar al mando diciéndole lo que sucedió e imprimiendo READY en la pantalla.


El uso principal de la instrucción BRK es depurar su programa después de haberlo escrito, pero antes de que funcione de la forma prevista. En BASIC, frecuentemente realizamos este proceso de depuración insertando instrucciones STOP en varios lugares del programa y luego ejecutándolo para ver si llegamos a las distintas paradas. En la programación en lenguaje Ensamblador, los BRK se pueden utilizar exactamente de la misma manera. Puede insertar varias instrucciones BRK en todo su programa y luego intentar ejecutarlo. Si no llega a las instrucciones BRK, sabrá que su programa está "colgándose" en algún lugar antes de esa instrucción. La mayoría de los depuradores disponibles imprimirán los valores de los registros del 6502 cada vez que se encuentre una instrucción BRK en un programa; esto facilita un poco el trabajo de depuración. Incluso con tales ayudas, la depuración de un programa largo en lenguaje Ensamblador no debería ser algo que los débiles de corazón deberían intentar, al menos no a menos que haya una gran porción de tiempo disponible sin nada más que hacer.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


Sólo hay un modo de direccionamiento disponible para la instrucción BRK: el modo Implícito. Este es un modo de un solo byte y para la instrucción BRK se requieren 7 ciclos de máquina para ejecutarse.


BVC (Branch on Overflow Clear) - Bifurcar si se borra la bandera de Desbordamiento


LA INSTRUCCIÓN


BVC es otra de las instrucciones de bifurcación condicional en el conjunto de instrucciones del 6502; utiliza la bandera de Desbordamiento "V" del registro de Estado del Procesador. Si la bandera V está activada, no se toma la bifurcación, pero si la bandera V está limpia (es igual a cero), se toma la bifurcación. Consulte la discusión sobre la instrucción BCC para obtener más detalles sobre las instrucciones de bifurcación condicional.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


La instrucción BVC utiliza sólo un modo de direccionamiento común a todas las instrucciones de bifurcación condicional: el modo Relativo. La instrucción necesita 2 bytes y requiere 2 ciclos de máquina para ejecutarse.


BVS (Branch on Overflow Set) - Bifurcar si se activa la bandera de Desbordamiento


LA INSTRUCCIÓN


La instrucción BVS es exactamente lo opuesto a la instrucción BVC. Si la bandera de Desbordamiento "V" en el registro de Estado del Procesador está establecida (igual a 1), se toma la bifurcación, y si la bandera V está limpia (igual a cero), no se toma la bifurcación. Puede encontrar los detalles de la bifurcación relativa en la discusión de la instrucción BCC.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


La instrucción BVS utiliza sólo el modo de direccionamiento Relativo.


CLC (Clear the Carry Bit) - Borrar la bandera de Acarreo "C"


LA INSTRUCCIÓN


La instrucción CLC tiene un efecto directo y constante sobre una bandera en el registro de Estado del Procesador. Borra el bit de Acarreo, es decir, lo establece en cero, ya sea que inicialmente fuera cero o 1. Se usa más comúnmente antes de la suma con la instrucción ADC. Dado que la instrucción ADC siempre agrega el bit de Acarreo a la suma, generalmente debemos asegurarnos de que este bit sea igual a cero antes de la suma. Ésta es la única manera de estar seguros de que 2 más 1 será igual a 3, y no a 4 en ocasiones. Casi universalmente, el conjunto típico de instrucciones para sumar dos números será:


LDA #2
CLC
ADC #1	

Cargamos el Acumulador con el primer número, en este caso, 2. Luego borramos el bit de Acarreo, porque no tenemos forma de saber con certeza el valor de este bit en ningún momento sin contar con mucho más código. Al restablecer el bit de Acarreo en cero, sabemos que obtendremos una suma precisa. Completamos la operación sumando con acarreo el número 1. Recuerde que la suma, 3 en este caso, quedará almacenada en el Acumulador al finalizar la operación; otras líneas probablemente harán algo con esta suma, como almacenarla en la memoria o utilizarla en alguna operación posterior.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


El único efecto que CLC tiene en el registro de Estado del Procesador es restablecer siempre el bit de Acarreo en cero.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento disponible para la instrucción CLC es el modo Implícito. La instrucción tiene solo 1 byte de longitud y requiere solo 2 ciclos de máquina para ejecutarse.


CLD (Clear the Decimal Flag) - Borrar la bandera de modo Decimal "D"


LA INSTRUCCIÓN


Como ya hemos comentado, el 6502 puede funcionar en modo Decimal o Binario. La instrucción CLD borra la bandera Decimal en el registro de Estado del Procesador y restablece el 6502 para que funcione en modo Binario en lugar del modo Decimal. En este libro, usaremos el modo Binario para la mayoría de los ejemplos, pero aquí cubriremos brevemente el modo Decimal. En este modo, cada nibble de un byte representa un único dígito decimal. El esquema de codificación se conoce como Decimal Codificado en Binario (BCD - Binary Coded Decimal) y se detalla a continuación:


BitsRepresentan a
00000
00011
00102
00113
01004
01015
01106
01117
10008
10019

La diferencia entre la codificación binaria y la decimal aparece cuando se realiza la suma o la resta. Por ejemplo, probemos el siguiente código:


LDA $0345  ; Contiene #$59
CLC        ; Poner antes de una instrucción de suma
ADC $0302 ; Contiene #$13	

¿Qué número queda en el Acumulador después de ejecutar estas líneas? Normalmente pensaríamos que este número debería ser #$6C, y si la suma se hiciera en modo binario estaríamos en lo correcto. Pero supongamos que primero hubiéramos puesto al 6502 en modo Decimal. En ese caso, el número almacenado en el Acumulador sería 72 ($48), porque el 6502 interpretaría los bytes en las ubicaciones $0345 y $0302 como números decimales codificados en binario y los sumaría en modo Decimal: 59 + 13 = 72.


Como se mencionó anteriormente, todos los ejemplos de este libro están en forma binaria. Sin embargo, se puede utilizar el modo Decimal cuando es necesario mostrar rápidamente un resultado en la pantalla. Dado que cada nibble del número representa un dígito decimal, al enmascarar el dígito apropiado usando la instrucción AND y luego enviándolo a la pantalla, podemos mostrar un número rápidamente, sin la necesidad de convertir entre nomenclatura binaria y decimal.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción CLD restablece directamente la bandera Decimal del registro de Estado del Procesador en cero, borrándola. No se producen otros efectos.


MODOS DE DIRECCIONAMIENTO


Como ocurre con todas las instrucciones que operan directamente sobre banderas en el registro de Estado del Procesador, el único modo de direccionamiento disponible para la instrucción CLD es el modo Implícito. La instrucción necesita solo 1 byte de memoria y requiere 2 ciclos de máquina para ejecutarse.


CLI (Clear the Interrupt Flag) - Borrar la bandera de Deshabilitación de la Interrupción "I"


LA INSTRUCCIÓN


La instrucción CLI opera directamente en el registro de Estado del Procesador para borrar la bandera de Interrupción; es decir, hace que esta bandera sea igual a cero. Es de suponer que esto sigue a alguna instrucción que había establecido esta bandera. Recuerde que cuando se establece la bandera de Interrupción, las interrupciones enmascarables se desactivan. Esto es importante para la programación del ATARI porque en muchos programas se utilizan de forma rutinaria varios tipos diferentes de interrupciones y, si la bandera I está activada, no pueden ocurrir. La Interrupción del Blanqueo Vertical y la Interrupción de la Lista de Despliegue se incluyen en esta categoría. La instrucción CLI permite que se produzcan estas interrupciones.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción CLI borra directamente la bandera I y no tiene ningún efecto sobre ninguna de las otras banderas en el registro de Estado del Procesador.


MODOS DE DIRECCIONAMIENTO


La instrucción CLI utiliza solo un modo de direccionamiento, el modo Implícito, y necesita 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


CLV (Clear the Overflow Flag) - Borrar la bandera de Desbordamiento "V"


LA INSTRUCCIÓN


CLV es como las dos instrucciones anteriores, CLD y CLI, que borran una bandera en el registro de Estado del Procesador. En el caso de la instrucción CLV, se borra la bandera de Desbordamiento.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL ENCARGADO


La instrucción CLV borra la bandera de Desbordamiento, pero no tiene ningún efecto sobre ninguna de las otras banderas en el registro de Estado del Procesador.


MODOS DE DIRECCIONAMIENTO


Como las otras instrucciones que operan directamente en el registro de Estado del Procesador, CLV tiene sólo un modo de direccionamiento: el modo Implícito.


CMP (Compare Memory and the Accumulator) - Comparar el Acumulador con la Memoria


LA INSTRUCCIÓN


En BASIC podemos comparar dos valores y determinar si son iguales, si A es mayor que B; o si A es menor que B. Generalmente, esto se hace en una declaración IF de este tipo:


35 IF A<B THEN ...	

Usando el conjunto de instrucciones del 6502, también podemos comparar dos números, aunque de una manera ligeramente diferente. Uno de los números a comparar debe estar en el Acumulador y el otro puede estar en cualquier lugar de la memoria de la computadora. La instrucción CMP resta el contenido de la ubicación de memoria especificada del valor almacenado al Acumulador y establece las distintas banderas del registro de Estado del Procesador de manera apropiada después de esta resta. Tenga en cuenta que el valor almacenado en el Acumulador no cambia después de la instrucción CMP. La resta sólo establece las banderas: no cambia el valor originalmente almacenado en el Acumulador. Conociendo los valores de las banderas en el registro de Estado del Procesador, podemos deducir los resultados de la comparación. Primero analicemos los cambios en el registro de Estado del Procesador y luego trabajaremos en algunos ejemplos de CMP.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción CMP establece en 1 la bandera Cero "C" si el número en la memoria y el número almacenado en el Acumulador son iguales. Si no son iguales, la bandera Cero se restablece a cero. La bandera Negativo "N" se establece en 1 a continuación de la instrucción CMP si el resultado de la resta es mayor que 127 (es decir, el número tiene su bit más significativo igual a uno). De lo contrario, la bandera Negativo se restablece a cero. La bandera de Acarreo "C" se establece en 1 cuando el valor almacenado en la memoria es menor o igual al número almacenado en el Acumulador. C se restablece en 0 cuando el número almacenado en la memoria es menor que el almacenado en el Acumulador. Veamos algunos ejemplos de la instrucción CMP, asumiendo que la ubicación de memoria $0345 contiene el número 26:


AZNCInstrucción= >AZNCComentario
#26000CMP $0345= >#26101Z, C establecido en 1 si A = $0345
#48000CMP $0345= >#48001Z, C establecido en 1 si A > $0345
#130010CMP $0345= >#192001N reestablecido en 0 si A - $0345 < 128
#8000CMP $0345= >#8010N establecido en 1 si A - $0345 > 127

En el primer ejemplo, los dos números que se comparaban eran iguales, lo que provocó que la resta produjera un resultado igual a cero. Este resultado estableció la bandera Cero. Dado que el número en la memoria era igual al número en el Acumulador, también se estableció la bandera de Acarreo "C".


En el segundo ejemplo, no se estableció la bandera Cero, ya que el resultado no fue igual a cero; no se estableció la bandera Negativo, ya que el resultado fue positivo (+22); y se estableció en 1 el bit de Acarreo, ya que el número en la memoria era menor que el número en el Acumulador.


En el tercer ejemplo, el número comenzaba como negativo, con la bandera Negativo activado. Como el resultado no era igual a cero, se restableció el bit Cero. El resultado de la resta, 130 menos 26, fue el número positivo 104, por lo que se restableció la bandera Negativa. Finalmente, dado que el valor almacenado en $0345 era menor que el valor de #130 almacenado en el Acumulador, se estableció el bit de Acarreo.


Este tercer ejemplo demuestra un punto importante sobre la instrucción CMP: Un número negativo es claramente menor que un número positivo, pero el resultado de esta comparación hizo que pareciera que el número negativo era mayor. La instrucción CMP no utiliza aritmética con signos; simplemente compara dos números entre cero y 255, tratando ambos números como enteros positivos. Si usa aritmética con signos, deberá corregir esto al comparar dos números.


En el cuarto ejemplo, el bit Cero no se estableció porque el resultado no era igual a cero. Se estableció en 1 el bit Negativo, ya que #8 - #26 = #238, que es un número negativo. Finalmente, dado que el número en el Acumulador era menor que el número en la memoria, el bit de Acarreo se restableció en cero.


También podemos observar estos efectos para determinar cómo probar los distintos resultados. La siguiente tabla describe varios valores del Acumulador y la memoria, junto con instrucciones de bifurcación que se tomarán después de una instrucción CMP. El código se ve así:


LDA #...
CMP $....
B.. destino	

Ahora veremos qué bifurcaciones se tomarán usando varios valores para los dos números.


AMemoriaBCS, BPL, BNE
88BEQ, BCS, BPL
98BCS, BPL, BNE
89BMI, BCC, BNE

Ahora podemos ver cómo estructurar un código que compare dos números y tome las medidas adecuadas, según los resultados obtenidos. Supongamos que queremos duplicar el siguiente código BASIC en lenguaje Ensamblador:


25 IF R<B THEN GOTO Q	

En ATARI BASIC, esto significa que el salto a la línea Q se tomará si el valor de la variable R es menor que el valor de la variable B en el momento en que se ejecuta la línea 25. En lenguaje Ensamblador, el mismo código se ve así:


LDA R; Cargar A a partir de la ubicación de memoria R
CMP B; Comparar con la ubicación de memoria B
BCC Q; Tomar la bifurcación si se borra el Acarreo	

MODOS DE DIRECCIONAMIENTO


CMP utiliza los mismos ocho modos de direccionamiento analizados en el Capítulo 5 para la instrucción LDA.


ModoInstrucciónCiclosBytesSignificado
InmediatoCMP #222A - #2
AbsolutoCMP $342043A - contenido de la memoria $3420
Página CeroCMP $F632A - contenido de la memoria $F6
Página Cero, XCMP $F6,X 42A - contenido de la memoria $F6 + X
Absoluto, XCMP $3420,X43A - contenido de la memoria $3420 + X
Absoluto, YCMP $3420,Y43A - contenido de la memoria $3420 + Y
Indirecto indexadoCMP ($F6,X)62A - contenido de la dirección en $F6 + X
Indexado indirectoCMP ($F6),Y52A - contenido de (dirección en $F6) + desplazamiento Y

CPX (Compare Index Register X with Memory) - Comparar el registro Índice X con la Memoria


LA INSTRUCCIÓN


Esta instrucción compara el valor en el registro X con el contenido de una ubicación de memoria específica, a diferencia de la instrucción CMP, que compara los valores en el Acumulador y una ubicación de memoria. Por lo demás, las instrucciones CPX y CMP son idénticas. CPX se utiliza principalmente para probar el valor en el registro X, especialmente cuando se utiliza como índice, para determinar si ha alcanzado el valor final deseado. Por ejemplo, cuando el registro X se utiliza como contador de un ciclo y desea determinar cuándo salir de éste, la instrucción CPX, seguida de una instrucción de bifurcación adecuada, le dará la respuesta.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si los dos números que se comparan son iguales, se establecerá la bandera Cero "Z" (se igualará a 1); de lo contrario, se restablecerá (se igualará a cero). Si el resultado de la resta es mayor que 127, se establecerá la bandera Negativo "N"; de lo contrario, se restablecerá a cero. Finalmente, si el número en la memoria es menor o igual que el número almacenado en el registro X, se establecerá la bandera de Acarreo "C" en 1; de lo contrario, se restablecerá a cero. Consulte las instrucciones de CMP para obtener más detalles.


MODOS DE DIRECCIONAMIENTO


La instrucción CPX utiliza los tres modos de direccionamiento que se describen a continuación.


ModoInstrucciónCiclosBytesSignificado
InmediatoCPX #222X - #2
AbsolutoCPX $342043X - contenido de la memoria $3420
Página CeroCPX $F632X - contenido de la memoria $F6

CPY (Compare Index Register Y with Memory) - Comparar el registro Índice Y con la Memoria


LA INSTRUCCIÓN


CPY es idéntico a CPX o a CMP en todos los aspectos, excepto que utiliza el registro Y en lugar del registro X o el Acumulador. Al igual que con la instrucción CPX para el registro X, cuando necesite determinar si el registro Índice Y ha alcanzado un valor determinado, utilice la instrucción CPY. Consulte las secciones CMP y CPX de este Apéndice para obtener más detalles.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


Consulte la instrucción CMP para obtener una descripción detallada de los efectos de CPY en el registro de Estado del Procesador.


MODOS DE DIRECCIONAMIENTO


Las instrucciones CPX y CPY son idénticas en sus modos de direccionamiento, de los cuales se muestran ejemplos a continuación:


ModoInstrucciónCiclosBytesSignificado
InmediatoCPY #2 22Y - #2
AbsolutoCPY $342043Y - contenido de la memoria $3420
Página CeroCPY $F6 32Y - contenido de la memoria $F6

Consulte el Capítulo 5 para obtener detalles sobre estos modos de direccionamiento.


DEC (Decrement Memory) - Decrementar la Memoria en uno


LA INSTRUCCIÓN


Para disminuir en 1 cualquier ubicación de memoria, se puede utilizar la instrucción DEC. En realidad, hay dos formas de disminuir una ubicación de memoria: La primera, y con diferencia la más sencilla, es utilizar DEC directamente. La segunda, y con diferencia la más engorrosa, es cargar el Acumulador desde esa ubicación de memoria, restar 1 y luego almacenar el número resultante nuevamente en la ubicación de memoria original. Puede ver por qué se incluyó una instrucción DEC en el conjunto de instrucciones del 6502.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


Si el proceso de disminución da como resultado un número igual a cero en la ubicación de memoria direccionada, se establecerá en 1 la bandera Cero "Z" en el registro de Estado del Procesador. Si el resultado es cualquier número excepto cero, se restablecerá en 0 la bandera Cero. Si el número resultante de la instrucción DEC es negativo (mayor que 127), se establecerá en 1 la bandera Negativo "N"; de lo contrario, se restablecerá. Por lo tanto, es posible determinar cuándo una instrucción de decremento ha producido un resultado cero o negativo sin tener que cargar el número en cuestión en el Acumulador: simplemente verifique el estado de la bandera Z o N en el registro de Estado del Procesador.


MODOS DE DIRECCIONAMIENTO


Hay cuatro modos de direccionamiento disponibles para la instrucción DEC, como se detalla a continuación:


ModoInstrucciónCiclosBytesSignificado
AbsolutoDEC $342043Hacer DEC al contenido de la memoria $3420
Página CeroDEC $F632Hacer DEC al contenido de la memoria $F6
Página Cero, XDEC $F6,X42Hacer DEC al contenido de la memoria $F6 + X
Absoluto, XDEC $3420, X43Hacer DEC al contenido de la memoria $3420 + X

DEX (Decrement the X Register) - Decrementar el registro Índice X en uno


LA INSTRUCCIÓN


DEX disminuye en 1 específicamente el registro X y se utiliza principalmente cuando éste se usa como índice de un ciclos. Cada vez que recorre el ciclo, disminuye el registro una vez. Cuando se establece la bandera Z después de esta disminución, puede salir del ciclo, sabiendo que ha completado el número predeterminado de bucles.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


Al igual que la instrucción DEC, la instrucción DEX establecerá o restablecerá tanto la bandera Negativo "N" como la bandera Cero "Z" en el registro de Estado del Procesador. Al comprobar estas banderas, un programador puede determinar el estado del registro X.


MODOS DE DIRECCIONAMIENTO


Sólo hay un modo de direccionamiento disponible para la instrucción DEX y, como es de esperar, es el modo Implícito, ya que el direccionamiento puede inferirse por la naturaleza de la instrucción. La instrucción necesita solo 1 byte y requiere 2 ciclos de máquina para ejecutarse.


DEY (Decrement the Y Register) - Decrementar el registro Índice Y en uno


LA INSTRUCCIÓN


DEY es la contraparte con el registro Y de la instrucción DEX. Disminuye el registro Y en 1.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Los efectos de la instrucción DEY son los mismos que los de las instrucciones DEC y DEX ya comentadas.


MODOS DE DIRECCIONAMIENTO


Al igual que la instrucción DEX, la instrucción DEY utiliza sólo el modo Implícito, necesita 1 byte de memoria y requiere 2 ciclos de máquina para ejecutarse.


EOR (Exclusive OR) - Realizar la operación lógica "O Exclusivo" entre la Memoria y el Acumulador


LA INSTRUCCIÓN


La instrucción EOR es la más parecida a la instrucción AND. Recuerde que AND realiza la operación lógica "Y" bit a bit: si un bit ha sido establecido en 1 en ambos números que se comparan, ese bit se establecerá en 1 en la respuesta resultante. La instrucción EOR realiza la operación lógica "O exclusivo" bit a bit. Si se establece un bit en uno, y sólo uno, de los números direccionados, se establece en la respuesta. Si el bit está establecido en 1 en ambos o en ninguno, hay un cero en esa posición de la respuesta. El número resultante se almacena en el Acumulador. Un ejemplo de esto se muestra a continuación:


LDA #133
EOR #185	

Nuevamente, la forma más sencilla de determinar la respuesta correcta para la operación EOR es visualizar los números en su forma binaria:



Dec. Binario
#133 = #%10000101
#186 = #%10111010

Resultado = #%00111111 = #63

El bit 7, que se estableció en 1 en ambos números, es igual a cero en la respuesta. De manera similar, el bit 6, que es igual a cero en ambos números, también es igual a cero en la respuesta. Sólo los bits que se establecieron en 1 en solo uno de los números se establecen en 1 en la respuesta: es decir, los bits del 0 al 5.


El uso más común de la instrucción EOR es complementar un número. Para hacer esto, aplicamos EOR al número con #$FF, un número en el que se establece cada bit. Por ejemplo, para complementar el número 143, le aplicamos EOR con #$FF:



Dec. Binario
#143 = #%10001111
#$FF = #%11111111

Resultado = #%01110000 = #112

EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número resultante, que reside en el Acumulador, es negativo (mayor que 127), se activa la bandera Negativo "N"; de lo contrario, se borra. Si el resultado de la instrucción EOR es igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


La instrucción EOR utiliza los mismos 8 modos de direccionamiento que la instrucción LDA; estos se detallan en el Capítulo 5. A continuación, se dan breves ejemplos:


ModoInstrucciónCiclosBytesSignificado
InmediatoEOR #222Hacer la operación lógica "O Exclusivo" entre el Acumulador y el #2
AbsolutoEOR $342043Hacer la operación lógica "O Exclusivo" entre el Acumulador y el contenido de la memoria $3420
Página CeroEOR $F632Hacer la operación lógica "O Exclusivo" entre el Acumulador y el contenido de la memoria $F6
Página Cero, XEOR $F6,X42Hacer la operación lógica "O Exclusivo" entre el Acumulador y el contenido de la memoria $F6 + X
Absoluto, XEOR $3420,X43Hacer la operación lógica "O Exclusivo" entre el Acumulador y el contenido de la memoria $3420 + X
Absoluto, YEOR $3420,Y43Hacer la operación lógica "O Exclusivo" entre el Acumulador y el contenido de la memoria $3420 + Y
Indirecto indexadoEOR ($F6,X)62Hacer la operación lógica "O Exclusivo" entre el Acumulador y el contenido de la dirección en $F6 + X
Indexado indirectoEOR ($F6),Y52Hacer la operación lógica "O Exclusivo" entre el Acumulador y el contenido de (dirección en $F6)+ desplazamiento Y

INC (Increment Memory) - Incrementar la Memoria en uno


LA INSTRUCCIÓN


La instrucción INC es exactamente lo opuesto a la instrucción DEC, lo que hace que el valor almacenado en cualquier ubicación de memoria direccionada se incremente en 1.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción INC establece en 1 la bandera Negativo "N" si el número resultante es mayor que 127; de lo contrario, restablece a 0 la bandera Negativo. También establece en 1 la bandera Cero "Z" si el número resultante es igual a cero; de lo contrario, restablece a 0 la bandera Cero.


MODOS DE DIRECCIONAMIENTO


INC utiliza los mismos cuatro modos de direccionamiento utilizados por la instrucción DEC. Consulte los ejemplos a continuación:


ModoInstrucciónCiclosBytesSignificado
AbsolutoINC $342063Hacer INC al contenido de la memoria $3420
Página CeroINC $F652Hacer INC al contenido de la memoria $F6
Página Cero, XINC $F6,X62Hacer INC al contenido de la memoria $F6 + X
Absoluto, XINC $3420,X73Hacer INC al contenido de la memoria $3420 + X

INX (Increment the X Register) - Incrementar el registro Índice X en uno


LA INSTRUCCIÓN


La instrucción INX es exactamente lo opuesto a la instrucción DEX. Incrementa el valor almacenado en el registro X en 1 y se utiliza para aumentar el valor del registro índice en ciclos, tal como se muestra en los Capítulos 7 a 10.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el incremento hace que el registro X sea igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra. Si el número resultante es negativo, se activa la bandera Negativo "N"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


Al igual que con las otras instrucciones de este tipo, el único modo de direccionamiento disponible es el modo Implícito, que requiere 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


INY (Increment the Y Register) - Incrementar el registro Índice Y en uno


LA INSTRUCCIÓN


Similar a la instrucción INX que acabamos de comentar, y exactamente opuesta a la instrucción DEY, INY hace que el registro Y aumente en 1.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el resultado del incremento causa que el número almacenado en el registro Y sea negativo, se establece en 1 la bandera Negativo "N"; de lo contrario, se borra. Si el registro Y es igual a cero después del incremento, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento disponible para la instrucción INY es el modo Implícito, que requiere 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


JMP (Jump to Address) - Saltar a nueva ubicación


LA INSTRUCCIÓN


Hemos analizado varios ejemplos de transferencia Condicional del control mediante instrucciones de bifurcación. Estas es la contrapartida de la declaración IF de BASIC. Sin embargo, sabemos que BASIC también tiene una instrucción de transferencia Incondicional del control, la declaración GOTO:


30 GOTO Q
40 .	

Sabemos que la línea ejecutada después de la línea 30 será la línea Q, no la línea 40. Esto no depende de nada dentro del programa; es decir, es totalmente incondicional. Cada vez que se ejecuta la línea 30, la línea Q será la siguiente línea ejecutada.


El lenguaje Ensamblador tiene su contraparte de la declaración GOTO: la instrucción JMP. Esta es su forma:


JMP Q	

Funciona exactamente como el ejemplo BASIC anterior. Cada vez que se ejecuta JMP, la línea Q será la siguiente línea ejecutada, independientemente de las condiciones establecidas durante la ejecución del programa. Se trata de una transferencia de control totalmente incondicional.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


La instrucción JMP tiene sólo dos modos de direccionamiento. El primero es el modo Absoluto, en el que el salto se realiza a una ubicación de memoria específica, tal como se describe en el ejemplo anterior. Este modo utiliza 3 bytes de memoria y requiere 3 ciclos de máquina para ejecutarse.


El segundo modo de direccionamiento es el modo Indirecto, que se utiliza sólo para la instrucción JMP. Para usar este modo, primero debemos configurar una ubicación de memoria indirecta en algún lugar. Supongamos que nos gustaría enviar JMP indirectamente a la ubicación de memoria $0620. Primero debemos decidir en qué memoria almacenaremos la dirección indirecta; aquí usaremos las ubicaciones $0423 y $0424. Primero almacenamos el byte #$20 en la ubicación de memoria $0423 y el byte #$06 en la ubicación de memoria $0424. Recuerde, para el 6502, el byte bajo viene primero, seguido por el byte alto de la dirección. El salto indirecto es entonces de esta forma:


JMP($0423)	

Los paréntesis indican que se trata de un salto indirecto; y la dirección baja de la dirección indirecta se proporciona en la instrucción. También es posible configurar una etiqueta de dirección para $0423, en cuyo caso la instrucción podría escribirse así:


JMP (Q)	

La Figura A-1 ilustra gráficamente el salto indirecto. La instrucción JMP indirecta necesita 3 bytes y requiere 5 ciclos de máquina para ejecutarse.


UbicaciónContenido
0421A9
0422B3
042320
042406=$0620
042595
0426DE

Fig A-1 Salto indirecto JMP($0423)


JSR (Jump to Subroutine) - Bifurcar a una nueva ubicación, guardando la dirección de retorno


LA INSTRUCCIÓN


En BASIC, podemos usar subrutinas para realizar tareas repetitivas y podemos hacer lo mismo en lenguaje Ensamblador. El comando GOSUB del BASIC tiene una contraparte exacta en lenguaje Ensamblador: JSR. Esta instrucción empuja el valor del Contador de Programa a la Pila, donde permanece hasta que se completa la subrutina. Luego, el valor se extrae de la Pila para que el programa pueda continuar ejecutándose en el lugar apropiado. En el programa siguiente, primero se ejecuta LDA, luego la subrutina en Q y luego STA.


LDA #124
JSR Q
STA $4657	

Aquí es apropiada una nota sobre el uso de subrutinas en lenguaje Ensamblador. En BASIC, los programas se ejecutan más rápidamente si las subrutinas utilizadas con frecuencia están ubicadas lo más cerca posible del comienzo del programa. Debido a que el intérprete BASIC comienza a escanear el programa en busca de la línea de destino desde el principio, esta práctica evita la necesidad de buscar en todo el programa para poder encontrar la subrutina. En lenguaje Ensamblador, este no es el caso. En el momento del ensamblaje, la dirección real de la subrutina se coloca después del código de la instrucción JSR, por lo que la subrutina se puede ubicar en cualquier lugar. En la práctica, es una buena idea agrupar todas las subrutinas, generalmente al final de su programa en lenguaje Ensamblador, tanto para facilitar la lectura como para facilitar el acceso a los cambios, pero depende de usted. El programa se ejecutará exactamente de la misma manera sin importar dónde ubique las subrutinas.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


La instrucción JSR utiliza sólo el modo de direccionamiento Absoluto. Utiliza 3 bytes de memoria y 6 ciclos de máquina para ejecutarse.


LDA (Load the Accumulator) - Cargar el Acumulador desde la Memoria


LA INSTRUCCIÓN


La instrucción LDA carga el Acumulador con un número, ya sea directamente o copiando algún valor almacenado en una de las ubicaciones de memoria de la computadora. Junto con la instrucción STA, es probablemente la instrucción más utilizada de todo el conjunto de instrucciones del 6502. Sus usos principales son colocar valores específicos en la memoria. Por ejemplo:


LDA #2
STA $0344	

y para transferir el contenido de una ubicación de memoria a otra. Por ejemplo:


LDA $0620
STA $0344	

Esta instrucción se describió detalladamente en el Capítulo 4.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número cargado en el Acumulador es mayor que 127, se establece en 1 la bandera Negativo "N"; de lo contrario, se borra. Si el número cargado en el Acumulador es igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


Los ocho modos de direccionamiento disponibles para la instrucción LDA se describieron detalladamente en el Capítulo 5. Los ocho modos se enumeran brevemente a continuación:


ModoInstrucciónCiclosBytesSignificado
InmediatoLDA #222#2 → A
AbsolutoLDA $342043Contenido de la memoria $3420 → A
Página CeroLDA $F632Contenido de la memoria $F6 → A
Página Cero, XLDA $F6,X42Contenido de la memoria $F6 + X → A
Absoluto, XLDA $3420,X43Contenido de la memoria $3420 + X → A
Absoluto, YLDA $3420,Y43Contenido de la memoria $3420 + Y → A
Indirecto indexadoLDA ($F6,X)62Contenido de la dirección en $F6 + X → A
Indexado indirectoLDA ($F6),Y52Contenido de (dirección en $F6)+ desplazamiento Y → A

LDX (Load the X Register) - Cargar el registro Índice X desde la Memoria


LA INSTRUCCIÓN


La instrucción LDX carga directamente el registro X y es exactamente análoga a la instrucción LDA para el Acumulador. Permite la carga directa del registro índice y se utiliza frecuentemente en programas en lenguaje Ensamblador.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número cargado en el registro X es mayor que 127, se establece en 1 la bandera Negativo "N"; de lo contrario, se borra. Si el número cargado en el registro X es igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


LDX utiliza cinco modos de direccionamiento. A continuación, se ofrece un resumen:


ModoInstrucciónCiclosBytesSignificado
InmediatoLDX #222X ← #2
AbsolutoLDX $342043X ← contenido de la memoria $3420
Página CeroLDX $F632X ← contenido de la memoria $F6
Página Cero, YLDX $F6,Y42X ← contenido de la memoria $F6 + Y
Absoluto, YLDX $3420,Y43X ← contenido de la memoria $3420 + Y

LDY (Load the Y Register) - Cargar el registro Índice Y desde la Memoria


LA INSTRUCCIÓN


La instrucción LDY, al igual que las instrucciones LDA y LDX, permite la carga directa del 6502. En este caso, la carga se realiza en el registro Y, pero en todos los demás aspectos LDY es idéntico tanto a LDX como a la instrucción LDA.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Al igual que con la instrucción LDX, si el número cargado en el registro Y por LDY es mayor que 127, se establece en 1 la bandera Negativo "N"; de lo contrario, se borra. Si el número cargado es igual a cero, se establece la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


Hay cinco modos de direccionamiento disponibles para la instrucción LDY, tal como se describe aquí:


ModoInstrucciónCiclosBytesSignificado
InmediatoLDY #222Y ← #2
AbsolutoLDY $342043Y ← contenido de la memoria $3420
Página CeroLDY $F632Y ← contenido de la memoria $F6
Página Cero, XLDY $F6,X42Y ← contenido de la memoria $F6 + X
Absoluto, XLDY $3420,X43Y ← contenido de la memoria $3420 + Y

LSR (Logical Shift Right) - Desplazar la Memoria o el Acumulador un bit a la derecha


LA INSTRUCCIÓN


Esta instrucción es exactamente lo opuesto a ASL. La instrucción LSR fuerza el bit más significativo de un número (bit 7) a cero y rota cada bit 1 posición hacia abajo, con el bit menos significativo (bit 0) terminando en el bit de Acarreo.


76543210 Acarreo
antes: 0=>10110101 =>0
después: 01011010 1

Podemos ver el desplazamiento de los bits dentro del número y la transferencia del cero al bit alto, así como la transferencia del bit bajo al de Acarreo.


Recuerde que una instrucción ASL hace que un número duplique su valor. Dado que cada bit en un número binario es exactamente la mitad del valor de su vecino de la izquierda, la instrucción LSR divide un número por 2 y el bit de Acarreo representa el resto de la división. En el ejemplo anterior, estos son los 2 bytes antes y después del LSR:


#%10110101 = #181
#%01011010 = #90 con C =1

Podemos ver que la división funcionó tal como esperábamos.


PRECAUCIÓN: Si utilizamos aritmética con signos, entonces el primer byte del ejemplo no es 181, sino -(255 - 181) = -74, y todos sabemos que 90 no es la mitad de -74. Para dividir un número negativo entre 2, debemos recordar que es negativo, luego convertirlo a su contraparte positiva, dividirlo entre 2 y luego convertirlo nuevamente a un número negativo. ¡Uf! Veamos cómo hacer esto:


LDA #$FE ; -2
EOR #$FF ; Complementarlo
CLC      ; antes de sumar
ADC #1   ; Ahora es +2
LSR A    ; Dividir por dos
EOR #$FF ; Complementar nuevamente
CLC      ; antes de sumar
ADC #1   ; Como arriba
STA ...  ; la respuesta, -1 ($FF)	

En este ejemplo, podemos ver que para interconvertir números positivos y negativos, solo necesitamos hacer EOR entre el número y #$FF, y luego sumar 1 al resultado.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Dado que el bit alto del número que se está direccionando siempre se fuerza a cero, esta operación siempre restablece en 0 la bandera Negativo "N". Si el resultado de la instrucción LSR es igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra. Finalmente, la bandera de Acarreo "C" se establece en 1 si el bit menos significativo del número original era un 1, y se borra si este bit era un cero.


MODOS DE DIRECCIONAMIENTO


Hay cinco modos de direccionamiento disponibles para la instrucción LSR:


ModoInstrucciónCiclosBytesSignificado
AbsolutoLSR $342063Hacer LSR al contenido de la memoria $3420
Página CeroLSR $F652Hacer LSR al contenido de la memoria $F6
Página Cero, XLSR $F6,X62Hacer LSR al contenido de la memoria $F6 + X
Absoluto, XLSR $3420,X73Hacer LSR al contenido de la memoria $3420 + X
AcumuladorLSR A21Hacer LSR al contenido del Acumulador

NOP (No Operation) - Sin operación


LA INSTRUCCIÓN


La instrucción NOP actúa tal como se podría esperar de su nombre: ¡No hace nada! Entonces, ¿Para qué tenerla? La instrucción NOP se puede utilizar para mantener espacio para permitir la modificación de las instrucciones en un programa, o al depurar un programa, para eliminar una instrucción sin tener que cambiar la ubicación en la memoria de todas las instrucciones posteriores.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


Como se puede deducir de su funcionamiento, el único modo de direccionamiento disponible para la instrucción NOP es el modo Implícito. Se necesita 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


ORA (OR Memory with the Accumulator) - Realizar la operación lógica "O" entre la Memoria y el Acumulador


LA INSTRUCCIÓN


La instrucción ORA es la última de las tres instrucciones lógicas del 6502. Las dos primeras son las instrucciones AND y EOR. La instrucción ORA compara dos números bit a bit, y si un bit se establece en 1 en uno o ambos números, ese bit también se establecerá en 1 en el número resultante. Veamos un ejemplo:


Número 1: #%10100101
Número 2: #%01101100

Resultado ORA: = #%11101101

El uso principal de ORA es establecer un bit particular de un número en 1. Por ejemplo, si tiene un número en la ubicación de memoria $4235 y necesita usarlo con el bit menos significativo (bit 0) establecido en 1, simplemente cargue el Acumulador con el número 1 y haga ORA con la ubicación de memoria $4235. El Acumulador contendrá entonces el número que estaba en la ubicación de memoria $4235, con su bit menos significativo establecido en 1.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número que reside en el Acumulador después de la instrucción ORA es igual a cero, la bandera Cero "Z" será establecida en 1; de lo contrario, se borrará. Si el número resultante es mayor que 127, se establecerá la bandera Negativo "N"; de lo contrario, se borrará.


MODOS DE DIRECCIONAMIENTO


La instrucción ORA utiliza los siguientes ocho modos de direccionamiento:


ModoInstrucciónCiclosBytesSignificado
InmediatoORA #222Hacer "O lógico" entre A y #2
AbsolutoORA $342043Hacer "O lógico" entre A y el contenido de la memoria $3420
Página CeroORA $F632Hacer "O lógico" entre A y el contenido de la memoria $F6
Página Cero, XORA $F6,X42Hacer "O lógico" entre A y el contenido de la memoria $F6 + X
Absoluto, XORA $3420,X43Hacer "O lógico" entre A y el contenido de la memoria $3420 + X
Absoluto, YORA $3420,Y43Hacer "O lógico" entre A y el contenido de la memoria $3420 + Y
Indirecto indexadoORA ($F6,X)62Hacer "O lógico" entre A y el contenido de la dirección en $F6 + X
Indexado indirectoORA ($F6),Y52Hacer "O lógico" entre A y el contenido de (dirección en $F6)+ desplazamiento Y

PHA (Push the Accumulator onto the Stack) - Introducir el Acumulador en la Pila


LA INSTRUCCIÓN


En la programación en lenguaje Ensamblador, generalmente tenemos varios lugares en los que almacenar un valor temporalmente. Podemos colocarlo en alguna ubicación de memoria reservada o colocarlo en los registros X o Y o colocarlo en la Pila. De estos métodos, el único que no alterará ninguna otra información almacenada (como lo harían las instrucciones TAY o TAX) es la instrucción PHA, que insertará el número en la Pila. Sin embargo, se debe tener mucha precaución al utilizar la Pila para almacenar información. Recuerde que la Pila se utiliza para contener direcciones de retorno para que la instrucción JSR sepa dónde regresar después de completar la subrutina. Insertar números extraños en la Pila puede provocar fallas en la computadora a menos que tenga cuidado de no interferir con las direcciones de retorno, ya que el 6502 intentará regresar a una dirección prácticamente aleatoria: las probabilidades de encontrar una instrucción válida en dicha dirección son extremadamente pequeñas.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento disponible para la instrucción PHA es el modo Implícito. La instrucción requiere sólo 1 byte de memoria y 3 ciclos de máquina para ejecutarse.


PHP (Push the Processor Status Register onto the Stack) - Introducir el registro Estado del Procesador en la Pila


LA INSTRUCCIÓN


La instrucción PHP toma el byte que contiene las banderas del registro de Estado del Procesador y lo inserta en la Pila. Su propósito es guardar el contenido del registro de Estado del Procesador para alguna operación futura mientras se procesan los pasos intermedios. Las precauciones al usar PHP son similares a las de la instrucción PHA: Asegúrese de no interferir con la información que normalmente se coloca en la Pila, como las direcciones de retorno para operaciones de subrutina.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


Como era de esperar, el único modo de direccionamiento para la instrucción PHP es el modo Implícito. La instrucción PHP es una instrucción de 1 byte y requiere 3 ciclos de máquina para ejecutarse.


PLA (Pull the Accumulator from the Stack) - Extraer el Acumulador desde la Pila


LA INSTRUCCIÓN


Esta instrucción es la contraparte de la instrucción PHA. Obviamente, si tenemos una manera de enviar el valor almacenado en el Acumulador a la Pila, también deberíamos tener una manera de recuperarlo. La instrucción PLA elimina el valor superior de la Pila y lo coloca en el Acumulador para su uso posterior.


Discutiremos un uso importante de PLA, pero primero necesitamos saber un poco sobre las subrutinas del Lenguaje de Máquina que se usarán en BASIC. Supongamos que, dado que ATARI BASIC no tiene una función AND verdadera, queremos escribir una subrutina en Lenguaje de Máquina que haga AND entre dos números y devuelva la respuesta a BASIC. El primer problema al que nos enfrentamos es cómo introducir los dos números en nuestra rutina de Lenguaje de Máquina. Hay dos maneras de hacer esto.


El primer método es universal y se puede utilizar en la mayoría de las microcomputadoras. Primero, calculamos los bytes alto y bajo de los dos números y luego introducimos cada uno de estos bytes en la memoria. La subrutina en Lenguaje de Máquina luego accede a estas ubicaciones de memoria para obtener los números y, después de unirlos con AND, coloca la respuesta en la memoria, donde su programa BASIC puede acceder a ella. El programa BASIC se ve así:


10 HIGHP=INT(P/256):REM OBTIENE EL BYTE ALTO DE P
20 LOWP = P-256*HIGHP:REM OBTIENE EL BYTE BAJO DE P
30 HIGHQ = INT(Q/256):REM OBTIENE EL BYTE ALTO DE Q
40 LOWQ=Q-256*HIGHQ:REM OBTIENE EL BYTE BAJO DE Q
50 POKE ADDR1,LOWP:REM PONE LOWP EN LA  MEMORIA
60 POKE ADDR2,HIGHP:REM PONE HIGHP EN LA MEMORIA
70 POKE ADDR3,LOWQ:REM PONE LOWQ EN LA MEMORIA
80 POKE ADDR4,HIGHQ:REM PONE HIGHQ EN LA MEMORIA
90 X = USR(1536):REM ACCEDE A LA SUBRUTINA EN Lenguaje de Máquina
100 LOWANS = PEEK(ADDR4):REM OBTENER BYTE BAJO DE ANSWER
110 HIGHANS = PEEK(ADDR5):REM OBTENER BYTE BAJO DE ANSWER
120 ANSWER= LOWANS+256*HIGHANS:REM RECONSTRUIR ANSWER	

Aunque este método funciona, es un poco torpe. Pero para varias microcomputadoras del mercado, este es el único método disponible. Sin embargo, su ATARI tiene una solución mucho más elegante y sencilla a este problema.


La solución implica pasar parámetros del BASIC al Lenguaje de Máquina y viceversa. Estos parámetros pueden ser números, direcciones de cadenas o prácticamente cualquier tipo de constante o variable en su programa BASIC. El método para pasar parámetros a un programa en Lenguaje de Máquina es simplemente enumerar los parámetros que se pasarán después de la dirección de la rutina en Lenguaje de Máquina en la llamada USR, separando los parámetros por comas. Aquí está el programa para hacer esto:


10 ANSWER=USR(1536,P,Q)	

¡Sí! ¡Solo una línea! ¿Cómo hacemos esto?


Su ATARI toma P y Q, los descompone en bytes altos y bajos y los coloca en la Pila, donde su programa en Lenguaje de Máquina puede recuperarlos usando la instrucción PLA. También es posible, al almacenar la respuesta obtenida por su rutina de Lenguaje de Máquina en $D4 y $D5 (primero el byte bajo), hacer que la variable ANSWER contenga automáticamente la respuesta correcta después de ejecutar la línea 10.


Hay un detalle crucial con respecto a este uso del paso de parámetros. Dado que su ATARI permite pasar parámetros en una llamada a USR, también le dice a la rutina de Lenguaje de Máquina cuántos parámetros se pasan. ¡Hace esto incluso si no se pasan parámetros! Esta información se envía automáticamente a la Pila como un solo byte tan pronto como se ejecuta la línea BASIC. Por lo tanto, en el caso de la línea 10 anterior, la Pila tendrá el número 2 insertado antes de que los bytes alto y bajo de P y Q se coloquen allí. Este byte luego contamina la dirección de retorno, por lo que el programa en Lenguaje de Máquina no podría regresar al lugar correcto en el programa BASIC. Su computadora fallará. Con toda probabilidad, tendrá que apagar y encenderla de nuevo, perdiendo su programa. ¿Cómo podemos prevenir esto?


La respuesta es tan simple como obvia. Simplemente comience cada subrutina en Lenguaje de Máquina que escriba para un programa BASIC con una instrucción PLA. PLA eliminará este byte adicional en la Pila y luego podrá continuar con el resto de su rutina de Lenguaje de Máquina. Este byte que PLA extrajo de la Pila al Acumulador se puede utilizar como verificación en su programa BASIC, si lo desea. Por ejemplo, ya sabemos que el número en este ejemplo debería ser 2. Si no es así, alguien cometió un error en el programa BASIC. Ya sabemos que nuestra rutina en Lenguaje de Máquina fallará si no se le pasan dos parámetros. Por lo tanto, podríamos incorporar código en nuestra rutina de Lenguaje de Máquina para verificar el primer byte ingresado en el Acumulador. Si no es un 2, el programa podría pasar a alguna rutina que notifique al usuario del error imprimiendo un mensaje de error o pasando un código de error nuevamente en ANSWER o usando otro método.


En cualquier caso, es fundamental recordar que cuando escribe subrutinas en Lenguaje de Máquina para usar en programas BASIC, debe incluir el PLA adicional para eliminar la cantidad de parámetros de la Pila o su computadora fallará.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número que la instrucción PLA extrae de la Pila es mayor que 127, se establecerá en 1 la bandera Negativo "N"; de lo contrario, se borra. Si el número extraído de la Pila es igual a cero, se establecerá en 1 la bandera Cero "Z"; de lo contrario, se borrará.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento disponible para la instrucción PLA es el modo Implícito, que requiere sólo 1 byte de memoria y 4 ciclos de máquina para su ejecución.


PLP (Pull the Processor Status Register from the Stack) - Extraer el registro de Estado del Procesador desde la Pila


LA INSTRUCCIÓN


PLP invierte la instrucción PHP extrayendo el byte superior de la Pila y colocándolo en el registro de Estado del Procesador. PLP se utiliza para restaurar las cosas a la forma en que estaban en el momento en que se ejecutó la instrucción PHP.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción PLP afecta a todas las banderas en el registro de Estado del Procesador, ya que todos se cambiarán a los valores contenidos en el byte extraído de la Pila.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento disponible para la instrucción PLP es el modo Implícito. PLP es una instrucción de 1 byte y requiere 4 ciclos de máquina para ejecutarse.


ROL (Rotate Left) - Rotar el Acumulador o la Memoria un bit a la izquierda


LA INSTRUCCIÓN


ROL es similar a las instrucciones ASL y LSR, pero con una diferencia significativa: cuando se ejecutan esas dos instrucciones, la rotación de los bits fuerza un cero en el bit alto o bajo, respectivamente. La instrucción ROL es una rotación verdadera, en la que el bit de Acarreo se coloca en el bit cero del número: cada bit del número se mueve una posición hacia la izquierda y el bit más significativo del número se coloca en el bit de Acarreo. Esto se puede mostrar gráficamente de la siguiente manera:
76543210 C

-
antes: 10010101<=0
C76543210
-
despues:100101010

Tenga en cuenta que, a diferencia de las instrucciones ASL y LSR, ROL no cambia los bits reales; cambia solo sus posiciones dentro del número. Por ejemplo, si escribimos un programa que tiene ocho instrucciones ROL consecutivas, volvemos al mismo número con el que empezamos. Usar ocho instrucciones ASL o LSR consecutivas nos daría una respuesta de cero ya que, para cada una de las ocho instrucciones, un bit más se pone en cero.


Cada bit del número original se mueve una posición hacia la izquierda siguiendo una instrucción ROL, por lo que si el bit de Acarreo es inicialmente cero, el número original se duplica cada vez que se utiliza esta instrucción. Las mismas precauciones analizadas en la sección sobre la instrucción ASL también se aplican al uso de la instrucción ROL.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción ROL establece el bit de Acarreo "C" igual al valor del bit más significativo del número original. Si la respuesta es igual a cero, se establecerá en 1 el bit Cero "Z"; de lo contrario, se borrará. Finalmente, si la respuesta es mayor que 127 (lo que sucederá si el bit 6 del número original es 1), se establecerá en 1 la bandera Negativo "N"; de lo contrario, se borrará.


MODOS DE DIRECCIONAMIENTO


La instrucción ROL utiliza los mismos cinco modos de direccionamiento que las instrucciones ASL y LSR:


ModoInstrucciónCiclosBytesSignificado
AbsolutoROL $342063Hacer ROL al contenido de la memoria $3420
Página CeroROL $F652Hacer ROL al contenido de la memoria $F6
Página Cero, XROL $F6,X62Hacer ROL al contenido de la memoria $F6 + X
Absoluto, XROL $3420,X73Hacer ROL al contenido de la memoria $3420 + X
AcumuladorROL A21Hacer ROL al contenido del Acumulador

ROR (Rotate Right) - Rotar el Acumulador o la Memoria un bit a la derecha


LA INSTRUCCIÓN


Como puede imaginar, las instrucciones ROR y ROL son exactamente opuestas. ROR realiza una rotación hacia la derecha, dividiendo un número por 2 si el bit de Acarreo es inicialmente cero. Aplican las mismas precauciones que se discutieron para la instrucción LSR. ROR se puede representar gráficamente de la siguiente manera:
C 76543210
-
antes:1=>01101100
76543210C

-
después: 101101100

Tenga en cuenta que la rotación de los bits es hacia la derecha y el bit de Acarreo original se transfiere al bit 7 de la respuesta. El bit 0 del número inicial se transfiere al bit de Acarreo después de la operación.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


El bit de Acarreo se establecerá en el valor del bit menos significativo (bit 0) del número que se está rotando. Si el número resultante es igual a cero, se establecerá en 1 la bandera Cero "Z"; de lo contrario, se borrará. Si el número resultante es mayor que 127 (lo que sucederá si el bit de Acarreo se hubiera establecido antes del ROR), se establecerá en 1 la bandera Negativo "N"; de lo contrario, se borrará.


MODOS DE DIRECCIONAMIENTO


Los cinco modos de direccionamiento disponibles para la instrucción ROR son los mismos que los que se acaban de analizar para la instrucción ROL y se describen a continuación:


ModoInstrucciónCiclosBytesSignificado
AbsolutoROR $342063Hacer ROR al contenido de la memoria $3420
Página CeroROR $F652Hacer ROR al contenido de la memoria $F6
Página Cero, XROR $F6,X 62Hacer ROR al contenido de la memoria $F6 + X
Absoluto, XROR $3420,X73Hacer ROR al contenido de la memoria $3420 + X
AcumuladorROR A21Hacer ROR al contenido del Acumulador

RTI (Return from Interrupt) - Retornar desde la Interrupción


LA INSTRUCCIÓN


Como ya hemos comentado brevemente, el ATARI hace uso frecuente de rutinas de interrupción. Estas desvían los programas de su flujo normal a una nueva sección que realiza una función particular y luego devuelven el flujo del programa al punto en el que ocurrió la interrupción. La instrucción RTI se proporciona en el conjunto de instrucciones del 6502 para lograr este retorno al flujo normal.


Cuando ocurre una Interrupción, el 6502 transfiere el contenido del registro de Estado del Procesador y el Contador de Programa a la Pila. Cuando se encuentra una instrucción RTI, el microprocesador restaura estos registros desde la Pila, volviendo así al estado exacto del 6502 antes de la Interrupción, permitiendo que se reanude el flujo del programa.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Todas las banderas en el registro de Estado del Procesador pueden cambiarse mediante la instrucción RTI, ya que todo el registro se renueva extrayendo el valor original desde la Pila.


MODOS DE DIRECCIONAMIENTO


La instrucción RTI utiliza sólo el modo de direccionamiento Implícito, que requiere 1 byte y 6 ciclos de máquina para ejecutarse.


RTS (Return from Subroutine) - Retornar desde la Subrutina


LA INSTRUCCIÓN


La instrucción RTS en programación en lenguaje Ensamblador es análoga al comando RETURN del BASIC: regresa a la siguiente instrucción después del salto a la subrutina. La instrucción hace que el Contador de Programa se recargue con la dirección de retorno, que se toma desde la Pila, donde fue colocada por el comando JSR. En las discusiones sobre las instrucciones PHA y PHP, notamos el problema que puede surgir si se han colocado otros números inadvertidamente en la Pila: en este caso, cuando se toma la dirección de retorno, esta es incorrecta y el programa muere.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


La instrucción RTS utiliza sólo el modo de direccionamiento Implícito, que requiere sólo 1 byte de memoria y 6 ciclos de máquina para su ejecución.


SBC (Subtract with Carry) - Restar al Acumulador la Memoria, con préstamo


LA INSTRUCCIÓN


SBC es la única instrucción de resta del 6502. Le permite determinar la diferencia entre dos números cargando el primero en el Acumulador y luego restándole el segundo. Por ejemplo, si queremos realizar la resta


8 - 6 = ?	

Podemos escribir el siguiente programa en lenguaje Ensamblador para hacerlo:


LDA #8
SBC #6	

La respuesta, 2, permanece en el Acumulador hasta que se necesite.


En la resta Decimal, aprendimos en la escuela que, si no tenemos un número lo suficientemente grande en la columna de las unidades para realizar la resta, podemos tomar prestado 1 decena de la columna de las decenas, convertirlo en 10 unidades, sumarlo al número en la columna de las unidades y realizar la resta. Por ejemplo, cuando restamos


24 - 9 = ?	

sabemos que no podemos restarle 9 a 4. Tomamos prestado 1 decena de la columna de las decenas, que se convierte en 10 unidades, y lo sumamos al 4 con el que comenzamos, lo que nos da 14 unidades. Ahora podemos restarle 9 a 14, dejando 5 en la columna de las unidades y obtenemos la respuesta correcta, 15.


El 6502 realiza la resta de la misma manera, pero toma prestado del bit de Acarreo "C". Por esta razón, siempre debemos estar seguros de que el bit de Acarreo esté establecido (igual a 1) antes de realizar una resta para que, si necesitamos pedir prestado, tengamos algo que pedir prestado. Podemos estar seguros de que el bit de Acarreo es igual a 1 utilizando la instrucción SEC que establece el bit de Acarreo. Ahora, para hacer una resta más complicada, el código en lenguaje Ensamblador podría verse así:


SEC     ; Asegúrese de que C sea 1
LDA #24 ; 1er número
SBC #26 ; 2do número
?       ; La respuesta ahora está en el Acumulador	

¿Cuál es la respuesta en "?"? Establecimos en 1 el bit de Acarreo antes de comenzar y es obvio que necesitábamos pedir prestado antes de poder realizar la resta. Por lo tanto, es evidente que el bit de Acarreo que sigue a esta resta será cero. Cuando se utiliza para préstamos, el bit de Acarreo implica un valor de 256; Comenzamos con el número 256 + 24 = 280 y restamos 26, quedando como resultado 254.


Usando la instrucción SBC, podemos restar cualquier número de otro. Tenga en cuenta que aquí hemos limitado nuestros ejemplos a números que pueden expresarse en un solo byte. La aritmética de doble precisión se utilizó en varios ejemplos de los Capítulos 7 al 10.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Como se describió anteriormente, el bit de Acarreo se establecerá en 1 si es necesario un préstamo para realizar la resta. La bandera Negativa "N" se establece en 1 si la respuesta es mayor que 127; de lo contrario, se borra. La bandera Cero "Z" se establece en 1 si la respuesta es igual a cero; de lo contrario, se borra. La bandera de Desbordamiento "V" se establece en 1 cuando la respuesta es mayor que +127 ó -127; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


La instrucción SBC utiliza los mismos ocho modos de direccionamiento que la instrucción LDA. Consulte el Capítulo 5 para obtener detalles sobre estos modos.


ModoInstrucciónCiclosBytesSignificado
InmediatoSBC #222A - #2
AbsolutoSBC $342043A - contenido de la memoria $3420
Página CeroSBC $F632A - contenido de la memoria $F6
Página Cero, XSBC $F6,X 42A - contenido de la memoria $F6 + X
Absoluto, XSBC $3420,X43A - contenido de la memoria $3420 + X
Absoluto, YSBC $3420,Y43A - contenido de la memoria $3420 + Y
Indirecto indexadoSBC ($F6,X)62A - contenido de la dirección en $F6 + X
Indexado indirectoSBC ($F6),Y52A - contenido de (dirección en $F6)+ desplazamiento Y

SEC (Set the Carry Bit) - Establecer en 1 la bandera de Acarreo "C"


LA INSTRUCCIÓN


Esta instrucción se utiliza siempre que sea necesario establecer el bit de Acarreo en 1. El uso principal de SEC es antes de las restas, tal como se describe en SBC. Otro uso de SEC es antes de un comando de rotación, cuando desea forzar el bit de Acarreo a 1 antes de la rotación.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


El único efecto de la instrucción SEC sobre el registro de Estado del Procesador es establecer en 1 el bit de Acarreo incondicionalmente.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento para la instrucción SEC es el modo Implícito. Es una instrucción de 1 byte y requiere 2 ciclos de máquina para ejecutarse.


SED (Set the Decimal Mode) - Establecer en1 la bandera de Modo Decimal "D"


LA INSTRUCCIÓN


Como se analiza en las secciones sobre las instrucciones CLD y ADC, el 6502 puede funcionar en modo Binario o Decimal. Para configurarlo en modo Binario, usamos la instrucción CLD, y para configurarlo en modo Decimal, usamos la instrucción SED. Tenga en cuenta que todas las sumas y restas después de SED se realizarán en modo Decimal, hasta que la bandera sea borrada por la instrucción CLD.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción SED establece incondicionalmente en 1 la bandera Decimal. No tiene otros efectos.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento utilizado por la instrucción SED es el modo Implícito, que utiliza 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


SEI (Set the Interrupt Flag) - Establecer en 1 la bandera de Deshabilitación de la Interrupción "I"


LA INSTRUCCIÓN


Como se mencionó anteriormente, establecer en 1 la bandera de Interrupción evitará que se produzcan interrupciones enmascarables, como las de la Lista de Despliegue y las interrupciones del Blanqueo Vertical. Hay ocasiones en las que nos gustaría escribir nuestro propio controlador de interrupciones, un programa que la computadora ejecutará cada vez que ocurra una interrupción. Antes de dirigir la computadora a nuestra rutina, es una buena práctica de programación establecer en 1 la bandera de Interrupción, dirigir el 6502 a la ubicación de nuestra rutina configurando el vector apropiado (discutido en el Capítulo 8) y luego borrar la bandera de Interrupción para reanudar las operaciones normales. Así es como evitamos que ocurra una interrupción mientras cambiamos la dirección del vector de Interrupción. Si tal interrupción ocurriera cuando estábamos a mitad del cambio, la computadora sin duda fallaría. La instrucción SEI impide que esto suceda.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


El único efecto de la instrucción SEI es establecer en 1 incondicionalmente la bandera de Interrupción.


MODOS DE DIRECCIONAMIENTO


Al igual que las dos instrucciones anteriores, la instrucción SEI utiliza sólo el modo de direccionamiento Implícito y requiere 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


STA (Store the Accumulator in Memory) - Almacenar el Acumulador en la Memoria


LA INSTRUCCIÓN


Así como la instrucción LDA puede cargar el Acumulador desde cualquier ubicación de memoria, la instrucción STA puede almacenar cualquier valor que esté en el Acumulador en cualquier ubicación de la memoria. Tenga en cuenta que esta instrucción no afecta el valor almacenado en el Acumulador. Simplemente copia este valor en alguna ubicación de memoria para su almacenamiento. Sabemos cómo mover un valor de un lugar de la memoria a otro, de la siguiente manera:


LDA $2468; Carga desde ubicación 1
STA $1357 ; Y almacenar en la ubicación 2	

De hecho, ahora podemos volvernos bastante sofisticados y transferir un bloque completo de memoria de un lugar a otro:


     LDY #$50     ; Configure el número de bytes a mover
LOOP LDA $5678,Y  ; Obtenga el primer byte de $56C8
     STA $4567,Y  ; Deposítelo en $45B7
     DEY          ; Contador de decrementos
     BNE LOOP     ; Si el contador es > 0, entonces haga un ciclo
     .            ; Llega aqui solo cuando termina	

Mire particularmente las instrucciones LDA y STA. Ambas utilizan el modo de direccionamiento "Absoluto, Y", lo que permite que Y actúe no sólo como contador de ciclo, sino también como desplazamiento de las direcciones base desde las cuales cargar y a las cuales transferir. El primer byte transferido por esta rutina es el byte más alto del bloque, y la rutina avanza hacia abajo a través de la memoria, hasta que el último byte transferido es el del $5678 al $4567. Después de esa transferencia, cuando volvamos a disminuir el registro Y, éste será igual a cero. Por lo tanto, no se realizará la bifurcación de regreso a LOOP, ya que realizamos un ciclo a LOOP solo si la bandera Cero no es igual a 1 en este punto.


Veamos brevemente la velocidad de dicha rutina. Hemos movido 80 bytes de memoria (recuerde, #$50 = #80). Primero cargamos el registro Y usando el modo Inmediato, que requiere 2 ciclos de máquina. Luego recorremos el circuito 80 veces. Cada ciclo consta de un LDA y una STA, ambos en modo de direccionamiento "Absoluto, Y", una instrucción DEY y una BNE. Si sumamos los ciclos del bucle, obtenemos


LDA   =  4
STA   =  4
DEY   =  2
BNE   =  2
       --
Total = 12	

Multiplicar por 80 bucles produce 960 ciclos de máquina y sumar el 2 de la instrucción LDY da un tiempo total de 962 ciclos de máquina. Dado que cada ciclo en su ATARI toma 0,56 microsegundos, el tiempo total transcurrido para mover 80 bytes de memoria de una ubicación a otra fue de 538,72 microsegundos. En BASIC, usando un programa similar a este


10 FOR I=1 TO 80
20 POKE ADDR1+I,PEEK(ADDR2+I)
30 NEXT I	

¡Se necesitan 1,25 segundos para lograr el mismo fin! ¡Usar una rutina de Lenguaje de Máquina para realizar esta tarea aumentó la velocidad 2.329 veces! Otros ejemplos de transferencia de bloques de memoria se pueden encontrar en el Capítulo 7.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


La instrucción STA utiliza siete de los ocho modos de direccionamiento disponibles para su contraparte, la instrucción LDA. Los modos de direccionamiento se explican completamente en el Capítulo 5 y simplemente se describen aquí:


ModoInstrucciónCiclosBytesSignificado
AbsolutoSTA $3420 43Almacenar el Acumulador en la dirección de memoria $3420
Página CeroSTA $F6 32Almacenar el Acumulador en la dirección de memoria $F6
Página Cero, XSTA $F6,X 42Almacenar el Acumulador en la dirección de memoria $F6 + X
Absoluto, XSTA $3420,X43Almacenar el Acumulador en la dirección de memoria $3420 + X
Absoluta, YSTA $3420,Y43Almacenar el Acumulador en la dirección de memoria $3420 + Y
Indirecto indexadoSTA ($F6,X)62Almacenar el Acumulador en la dirección que se encuentra en $F6 + X
Indexado indirectoSTA ($F6),Y52Almacenar el Acumulador en (dirección en $F6) + desplazamiento Y

STX (Store the X Register) - Almacenar el registro Índice X en la Memoria


LA INSTRUCCIÓN


La instrucción STX se puede usar exactamente igual que la instrucción STA, excepto que es el valor en el registro X, en lugar del Acumulador, el que se almacena en la memoria.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


La instrucción STX utiliza tres modos de direccionamiento como se describe a continuación:


ModoInstrucciónCiclosBytesSignificado
AbsolutoSTX $342043Almacenar el registro X en la dirección de memoria $3420
Página CeroSTX $F6 32Almacenar el registro X en la dirección de memoria $F6
Página Cero, YSTX $F6,Y42Almacenar el registro X en la dirección de memoria $F6 + Y

STY (Store the Y Register) - Almacenar el registro Índice Y en la Memoria


LA INSTRUCCIÓN


STY, al igual que las instrucciones STA y STX, almacena el valor contenido en un registro (esta vez, el registro Y) en la memoria.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Ninguno.


MODOS DE DIRECCIONAMIENTO


Los tres modos de direccionamiento utilizados con la instrucción STY se describen a continuación:


ModoInstrucciónCiclosBytesSignificado
AbsolutoSTY $342043Almacenar el registro Y en la dirección de memoria $3420
Página CeroSTY $F632Almacenar el registro Y en la dirección de memoria $F6
Página Cero, XSTY $F6,X42Almacenar el registro Y en la dirección de memoria $F6 + X

TAX (Transfer Accumulator to the X Register) - Transferir el Acumulador al registro Índice X


LA INSTRUCCIÓN


TAX es una instrucción de transferencia que copia el valor almacenado en el Acumulador al registro X, dejando el Acumulador sin cambios.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número transferido es mayor que 127, se establece en 1 la bandera Negativo "N"; de lo contrario, se borra. Si el número transferido es igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


Sólo el modo Implícito está disponible para las instrucciones de transferencia, que requiere 1 byte de memoria y 2 ciclos de máquina.


TAY (Transfer Accumulator to the Y Register) - Transferir el Acumulador al registro Índice Y


LA INSTRUCCIÓN


Esta instrucción transfiere el valor del Acumulador al registro Y.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número en el Acumulador es mayor que 127, se establecerá en 1 la bandera Negativo "N"; de lo contrario, se borrará. Si el número es igual a cero, se establecerá en 1 la bandera Cero "Z"; de lo contrario, se borrará.


MODOS DE DIRECCIONAMIENTO


Sólo el modo Implícito, que requiere 1 byte de memoria y 2 ciclos de máquina para ejecutarse, está disponible para la instrucción TAY.


TSX (Transfer the Stack Pointer to the X Register) - Transferir el Puntero de la Pila al registro Índice X


LA INSTRUCCIÓN


La instrucción de transferencia TSX copia el puntero de Pila en el registro X, generalmente antes de almacenarlo para uso futuro.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


Si el puntero de la Pila era mayor que 127 (y normalmente lo es), se establecerá en 1 la bandera Negativo "N"; de lo contrario, se borrará. Si el puntero de la Pila era igual a cero (casi nunca), entonces se establecerá en 1 la bandera Cero "Z"; de lo contrario, se borrará.


MODOS DE DIRECCIONAMIENTO


La instrucción TSX utiliza sólo el modo Implícito, ocupando 1 byte de memoria y 2 ciclos de máquina.


TXA (Transfer the X Register to the Accumulator) - Transferir el registro Índice X al Acumulador


LA INSTRUCCIÓN


Esta es la contraparte de la instrucción TAX y transfiere un valor desde el registro X al Acumulador, sin cambiar el valor almacenado en el registro X.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción TXA establece en 1 la bandera Negativo "N" si el número transferido es mayor que 127; de lo contrario, se borra. Si el número transferido es igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento para la instrucción TXA es el modo Implícito, que utiliza 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


TXS (Transfer the X Register to the Stack Pointer) - Transferir el registro Índice X al Puntero de la Pila


LA INSTRUCCIÓN


Esta instrucción se utiliza con mayor frecuencia cuando desea configurar el puntero de la Pila en un número predeterminado. ¡Utilice TXS con extrema precaución! Ya sabe lo que puede pasar cuando la Pila está estropeada. Nada puede alterar más la Pila que el uso incorrecto de la instrucción TXS, así que tenga mucho cuidado con su uso.


EFECTOS EN EL REGISTRO DE ESTADO DEL PROCESADOR


La instrucción TXS no tiene efecto sobre ninguna de las banderas en el registro de Estado del Procesador.


MODOS DE DIRECCIONAMIENTO


El único modo de direccionamiento para la instrucción TXS es el modo Implícito, que utiliza 1 byte de memoria y 2 ciclos de máquina para ejecutarse.


TYA (Transfer the Y Register to the Accumulator) - Transferir el registro Índice Y al Acumulador


LA INSTRUCCIÓN


TYA transfiere el número almacenado en el registro Y al Acumulador, dejando una copia del mismo en el registro Y. Es la contraparte de la instrucción TAY ya comentada.


EFECTOS SOBRE EL REGISTRO DE ESTADO DEL PROCESADOR


Si el número transferido es mayor que 127, se establece en 1 la bandera Negativo "N"; de lo contrario, se borra. Si el número es igual a cero, se establece en 1 la bandera Cero "Z"; de lo contrario, se borra.


MODOS DE DIRECCIONAMIENTO


Al igual que las otras instrucciones de transferencia, la instrucción TYA utiliza sólo el modo de direccionamiento Implícito, que requiere 1 byte de memoria y 2 ciclos de máquina para ejecutarse.



Índice de Contenido | Capítulo anterior | Siguiente apéndice