CURSO DE ASSEMBLER
Por Willy Soft
6. Instrucción JMP.
Hemos visto hasta ahora algunas instrucciones para darle más color al Atari. Sin embargo, dejamos pendiente qué significa la instrucción JMP. Supongo que ya sospecharán qué significa.
JMP significa simplemente JuMP (saltar en inglés). Su uso es:
JMP dirección
Dicha instrucción lo que hace es saltar a la dirección especificada en el parámetro del JMP. Ahora, como ya vimos en el capítulo anterior, ésta puede ser una dirección fija (un número en decimal o hexadecimal) o bien una etiqueta equivalente.
En el capítulo anterior utilizamos la instrucción JMP para que fuese a la dirección equivalente a la etiqueta LOOP. Esta etiqueta comenzaba en la misma dirección del JMP LOOP, por lo tanto, lo que hace el Atari es caer es un ciclo infinito. Eso nos sirvió para ver en pantalla los resultados obtenidos. Ahora vamos a darle otro uso, con el siguiente programa:
Ahora utilizamos la instrucción JMP para volver a la dirección que corresponde a “inicio”. El resultado es el siguiente:
Como pueden ver, esto va tomando forma cada vez más.
Ahora vamos a presentar un ejemplo más complejo. Utilizaremos la instrucción JSR y JMP para crear interrupciones de blanqueo vertical. (Vertical Blank Interruptions, VBI). Esta interrupción se ejecuta 60 veces por segundo en los computadores NTSC ó 50 veces por segundo en los computadores PAL. Noten que para Tipeen el siguiente listado:
Compilen el programa, y ejecútenlo. ¿Qué opinan?
Si revisan el monitor del emulador (apretando F8) y digitan el comando “d 6000”, verán lo siguiente:
Ése es el programa compilado en lenguaje máquina. Podrán ver la correspondencia de las instrucciones.
Ahora bien, ¿qué es lo que hace el programa? Veremos línea por línea:
El “jsr inicia.vbi” ejecuta una subrutina que está indicada más adelante por la etiqueta “inicia.vbi”. La instrucción “jmp loop” genera un loop infinito.
La subrutina “inicia.vbi” parte con la instrucción “lda #7”. Esta instrucción carga el acumulador con el valor 7. Esto es utilizado más adelante, cuando se ejecute la subrutina en “SYSVBV”. Después viene la instrucción “ldy #<rutina”. Esto hace lo siguiente: La etiqueta rutina es equivalente a la dirección en que se encuentra en ese momento la compilación. Si ven el monitor de más arriba, ésta corresponde al número $6010 en hexadecimal. Luego el “#<rutina” carga el registro Y con el valor de los últimos dos números hexadecimales, en este caso, el $10. Por eso el símbolo “<”. Análogamente, el “#>” da los primeros dos números en hexadecimal. Luego, en la línea siguiente se carga el registro X con un $60 en hexadecimal.
Después se carga la subrutina en la dirección de SYSVBV. Esta subrutina viene por defecto en la ROM del Atari 8-bits y prepara la interrupción, según los parámetros dados en los registros A, X e Y. El 7 en el acumulador indica qué tipo de interrupción es y los registros X e Y busca los primeros dos números y los dos últimos de la dirección en que está la interrupción, respectivamente.
Finalmente, está la rutina de interrupción, y lo que hace es lo siguiente: toma el valor de la posición $14 (20 en decimal). Esta posición corresponde a un contador utilizado por el Atari que se incrementa en uno cada 1/60 de segundo en los computadores NTSC y cada 1/50 de segundo en los PAL. Ese valor es guardado en la posición $2C6 (710 en decimal). Este controla el color de fondo de la pantalla de texto. Luego la rutina de interrupción ejecuta un “jmp xitvbv”, es decir, salta a la dirección indicada en la variable “xitvbv”. Esa dirección guarda la rutina en la cual sale de la interrupción.
Por lo tanto, lo que hace el Atari es ejecutar cada 1/60 de segundo en un NTSC (o 1/50 de segundo para los PAL) cambios de colores en la pantalla de texto. Por eso se ve el efecto en pantalla.
Bueno, cada vez iremos complejizando más las rutinas, y le daremos un uso más completo. Nos vemos en el siguiente capítulo.