Instrucciones para operaciones lógicas

Las instrucciones para hacer operaciones lógicas son:

  • “and”.
  • “ora”.
  • “eor”.

La instrucción “and” realiza el AND bit a bit del acumulador y de un valor u operando que vendrá suministrado por el modo de direccionamiento utilizado. El resultado de ese AND se guarda en el acumulador.

La instrucción “ora” realiza el OR bit a bit del acumulador y de un valor u operando que, nuevamente, vendrá suministrado por el modo de direccionamiento utilizado. El resultado de ese OR se guarda en el acumulador.

Por último, la instrucción “eor” realiza el XOR u OR exclusivo bit a bit del acumulador y de un valor u operando que, una vez más, vendrá suministrado por el modo de direccionamiento utilizado. El resultado de ese XOR se guarda en el acumulador.

Las tablas de verdad de las operaciones AND, OR y XOR se pueden consultar aquí:

Tablas verdad

En la práctica, estas instrucciones se utilizan mucho para:

  • “and”: Poner a cero determinados bits seleccionados.
  • “ora”: Poner a uno determinados bits seleccionados.
  • “eor”: Cambiar de cero a uno o al revés determinados bits seleccionados.

Para verlo, supongamos que en las tablas anteriores la columna A es el acumulador y la columna B es un valor que llamaremos “máscara” y que vendrá suministrado de forma directa (modo de direccionamiento inmediato) o como el contenido de una posición de memoria (modo de direccionamiento absoluto u otros). Para ser más exactos, un bit del acumulador y un bit de la máscara, pero el proceso es el mismo para cada uno de los 8 bits del acumulador/máscara.

Pues bien, en el caso de AND, si el bit de la máscara vale 0, el bit resultante es 0. Y si el bit de la máscara es 1, el bit resultante es el bit original de A. Total, los bits 0 de la “máscara” ponen a 0 los bits correspondientes en el acumulador.

Análogamente, en el caso de OR, si el bit de la máscara vale 1, el bit resultante es 1. Y si el bit de la máscara es 0, el bit resultante es el bit original de A. Total, los bits 1 de la “máscara” ponen a 1 los bits correspondientes en el acumulador.

Por último, en el caso de XOR, si el bit de la máscara vale 1, el bit resultante cambia de valor. Y si el bit de la máscara es 0, el bit resultante se queda como estaba. Total, los bits 1 de la “máscara” cambian los bits correspondientes en el acumulador.

De hecho, en lógica se suele definir también la operación NOT, o complemento, que cambia los 0’s por 1’s y los 1’s por 0’s. Sin embargo, en el 6510 no es necesaria una instrucción “not”, ya que, por lo visto en el párrafo anterior, un “eor %11111111” consigue el mismo efecto (cambia los 8 bits).

Estas instrucciones suelen utilizarse con máscaras expresadas en binario (ej. %10010110), porque de este modo salta a la vista qué bits son los que se están poniendo a cero (los 0’s de un AND), o a uno (los 1’s de un OR), o cambiando (los 1’s de un XOR). Y se usan mucho cuando se programa vídeo (VIC), sonido (SID), o entrada/salida (CIAs), porque estos chips disponen de muchos registros (para el programador posiciones de memoria, al fin y al cabo) que atribuyen significados o funciones específicas a determinados bits.

Todas estas instrucciones soportan los modos de direccionamiento inmediato, absoluto, página cero, absoluto indexado, página cero indexado, indirecto – indexado e indexado – indirecto. Y todas afectan a los flags S – sign y Z – zero.

Sus detalles se pueden consultar aquí: http://www.6502.org/tutorials/6502opcodes.html#AND, http://www.6502.org/tutorials/6502opcodes.html#ORA y http://www.6502.org/tutorials/6502opcodes.html#EOR.


Programa de ejemplo: Prog16

Deja un comentario