CURSO DE ASSEMBLER
Por Willy Soft
7. Comparaciones y saltos (branches).
Ya tenemos claro las primeras instrucciones para interactuar con el Atari. Ahora utilizaremos instrucciones que nos permitirán realizar las primeras decisiones. En el caso del procesador 6502, las decisiones son realizadas principalmente a través de las comparaciones y los saltos (branches).
El 6502 tiene una serie de registros que permiten realizar saltos de instrucciones, ya sean bytes más adelante o bien bytes más atrás. Estos saltos se hacen generalmente después de una comparación. La instrucción que se utiliza para comparar se llama CMP (CoMPare). Su utilización es la que sigue:
CMP #número
CMP dirección
Esta instrucción lo que hace es comparar entre el valor en el acumulador y el valor del argumento, ya sea como el valor en sí (para el caso del #) o bien el valor de memoria almacenada en la dirección especificada.
Ejemplos:
lda #$04
cmp #$05
lda #$04
sta $4000
lda #$05
cmp $4000
De manera análoga, existen las instrucciones CPX y CPY para comparar los registros X e Y, respectivamente.
Ahora, esas comparaciones no servirán de nada si no se toma una decisión al respecto. Dichas decisiones se implementan cuando se realizan branches (saltos). La lista de saltos son:
BEQ dirección (Branch if EQual): salta cuando el resultado de la comparación es igual.
BNE dirección (Branch if Not Equal): salta cuando el resultado de la comparación no es igual.
BPL dirección: salta si el valor en el registro es mayor o igual al comparado.
BMI dirección: salta si el valor en el registro es menor estricto al comparado.
BCS dirección: salta si el valor en el registro es mayor estricto al comparado.
BCC dirección: salta si el valor en el registro es menor o igual al comparado.
Ejemplos:
lda #$04
cmp #$04
beq salta
lda #$05
cmp #$04
bne salta
lda #$08
cmp #$04
bpl salta
lda #$03
cmp #$04
bmi salta
lda #$04
cmp #$03
bcs salta
lda #$07
cmp #$0a
bcc salta
Ahora, se pueden combinar los saltos, a fin de dar distintas condiciones. Ejemplo:
lda $2fc
cmp #$0c
beq salta
bmi salta.menor
Una salvedad: para el caso de las instrucciones BPL y BMI, esta tiene un rango de 128 bytes ($80 en hexadecimal) para considerar “mayor o igual” o “menor estricto”. Veamos estos ejemplos:
lda #$04;4 en decimal
cmp #$83;131 en decimal
bpl rutina2
En este caso va a “rutina2”, ya que la diferencia es menor a 128 bytes.
lda #$04
cmp #$84
bmi rutina3
En este caso va a “rutina3”, ya que la diferencia es mayor a 128 bytes.
Bueno, como este curso es práctico, vamos a ver un ejemplo concreto. Por favor examínenlo, ya que incluye varios conceptos del Atari 8-bits, a saber:
- Lectura de posiciones de memoria de chips del Atari, en este caso, leyendo la posición CONSOL ($D01F en hex, 53279 en decimal)
- Comparaciones con distintos valores.
- Ejecución de rutinas de la ROM en el Atari (en este caso, la dirección $C642 contiene una rutina que sirve para imprimir una línea completa según lo indicado en los registros X e Y. Con eso nos ahorramos el tener que imprimir carácter por carácter.
Nos vemos en el siguiente capítulo.