lunes, 27 de junio de 2016

VOLCADO DEL BUFFER CON LA PILA (III): RUTINA DE VOLCADO I



Vamos a ir volcando el buffer en la pantalla real en bloques de un caracter de alto por 24 de ancho.
Para que quede centrada en la pantalla dejamos un marco de 4 caracteres a la izquierda.
Estos valores se establecen al principio de CONTENIDA.ASM. Así podrás cambiarlos para hacer tus pruebas sin comerte mucho la cabeza.




MITAN es el ancho en caracteres del recuadro que vamos a volcar partido por 2.
CHAR es el número de caracteres que dejamos en blanco.

EL corazón de la rutina es VOLVU que vuelca primero los 12 primeros caracteres y luego los otros 12  desde la dirección que le marca IX (buffer) hasta que le marca HL. Además, retorna con la dirección del siguiente caracter tanto en IX como en HL. Pero no comprueba si cambiamos de tercio, por lo que tendremos que comprobarlo nosotros "a mano".

Por esto es por lo que hay que llamar a VOLVU varias veces (tantas como caracteres verticales tenga el trozo de buffer que queremos imprimir). Esto supondría realizar 16 CALL VOLVU. Nosotros vamos a utilizar otro método:  construimos una "pila artificial" donde ponemos a qué dirección tiene que saltar cada vez que se ejecute un RET (en concreto con el que termina VOLVU).

Esta es nuestra pila:



Si hacemos LD SP,STACCR cuando se ejecuten los RETs, saltará a la dirección que indique SP:

RET: salta a VOLVU
RET: salta a VOLVU
RET: salta a VOLVU
RET: salta a VOLT
RET: salta a VOLVU
RET: salta a VOLVU
RET: salta a VOLVU
RET: salta a VOLT1
RET: salta a VOLVU
RET: salta a VOLVU
RET: salta a VOLVU
RET: salta a VOLTF
etc...
RET: salta a STACV que es el final de la rutina.
De esta manera nos ahorramos las llamadas.



Pues lo dicho, ponemos SP apuntando a STACCR (nuestra pila artificial).
HL va a llevar las direcciones de la pantalla real donde se va a volcar nuestro rectángulo e IX lleva las direcciones del buffer desde donde se vuelcan.
Los datos  se van cogiendo del buffer con POP (al hacer POP se coge el dato de la pila y ésta se incrementa) y se van metiendo en la pantalla real con PUSH (al hacer PUSH, se decrementa primero la pila y luego se mete el dato).

Por eso IX se carga con $8000+CHAR: inicio del buffer más el marco de 4 caracteres a la izquierda.
HL se carga con $4080+CHAR+MITAN: vamos a volcar a partir del 4 caracter horizontal (dirección $4080) más el marco (CHAR) más los doce primeros caracteres  horizontales a volcar. Ya he comentado que al hacer PUSH la pila se va decrementando, por eso a HL se le suma MITAN.

Comenté que VOLVU vuelca un rectángulo de un caracter de alto por 24 de ancho desde IX hasta HL y devuelve IX y HL con el valor para el siguiente caracter. Osea, que si cambiamos de tercio no vale.

Si te das cuenta, HL empieza en el cuarto caracter vertical. Podemos llamar a VOLVU cuatro veces hasta que llegue al cambio de tercio. Así que hacemos JP VOLVU (1 vez) y en nuestro stack tenemos VOLVU (2 veces),VOLVU (3 veces),VOLVU (4 veces) y VOLT.
En VOLT cargamos HL con la dirección del principio del segundo tercio $4800 más el marco más MITAN.

Pero los caracteres verticales también van pasando para el buffer. Empezó en $8000. Cuando VOLT se haya ejecutado 8 veces tenemos que cambiar de tercio a mano.
Hasta ahora VOLVU se ha ejecutado 5 veces (VOLT también salta a ella), así que en nuestro stack hemos puesto VOLVU (6 veces),VOLVU (7 veces),VOLVU (8 veces) y VOLT1.
En VOLT1 cargamos IX con el inicio del segundo tercio del buffer $8800 más el marco y saltamos otra vez a VOLVU. Despúes de cuatro VOLVUs tenemos que actualizar HL con la dirección del tercer tercio de la pantalla más el marco más MITAN.

Si quisiéramos posicionar el volcado del buffer en la pantalla real en otra dirección, por ejemplo a partir del segundo caracter vertical ($4040+CHAR+MITAN) deberíamos cambiar nuestra pila artificial. Si has entendido esto, deberías ser capaz de hacerlo.

No hay comentarios:

Publicar un comentario