019:software

Microhobby 19. Año II, del 12 al 18 de marzo de 1985

Miguel Sepúlveda

Ya sabemos casi todo sobre el movimiento de los gráficos por la pantalla y de cómo conseguir una animación adecuada y natural. Ahora, en este cuarto y último capítulo, veremos cómo hacer girar las figuras cuando intentamos cambiarlas de dirección, tanto horizontal como verticalmente.

Para introducirnos de lleno en este tema, nada mejor que unos cuantos ejemplos que nos ayudarán en su comprensión. De este modo, si queremos crear la figura de un hombre caminando hacia la derecha, el frontal de la figura debe ir hacia la derecha.

Ahora bien, si cambiamos la dirección y lo hacemos caminar hacia la izquierda, la figura del hombre caminará de espaldas si no se gira la figura horizontal-mente y se pone el frontal de la figura hacia la izquierda.

Otro ejemplo sería la figura de un avión ascendiendo, en cuyo caso el morro del avión iría hacia arriba; pero en el supuesto de que se haga caer en picado, si no se gira verticalmente y se pone el morro del avión hacia abajo, la figura del avión caería de cola.

Estos giros se pueden hacer de dos formas distintas: la primera, más lenta y costosa, es tener 2 rutinas, una que mueva la figura hacia el lado derecho o hacia arriba, y otra que invierta la figura hacia la izquierda o hacia abajo en el momento de almacenarla en el archivo de pantalla.

La segunda forma, más rápida y más barata, es la que explicaremos aquí, que consiste en girar la figura, tanto horizontal como vertical, en la misma posición de memoria donde está ubicada, o sea, como si cargáramos la misma figura pero girada en la posición de memoria donde estaba la otra.

Vistas un poco las facilidades de estas 2 rutinas, pasamos a explicar el programa que acompaña a este artículo y que es una demostración.

Las sentencias DATA 10, 12 y 14, tienen los octetos del código máquina de la rutina de giro horizontal, que se carga en la posición de memoria 64376 y tiene una longitud de 53 octetos. Las sentencias DATA 16, 18 y 20 tiene los octetos del código máquina de la rutina de giro vertical, que se carga a continuación de la anterior, en la posición de memoria 64429 y tiene una longitud de 61 octetos. Hace una comprobación de la suma de los octetos de las dos rutinas por si al introducir los datos se ha producido un error.

La sentencia de la línea 70, almacena las rutinas a partir de la posición de memoria 64376 y una a continuación de la otra; pero como las dos rutinas son reubicables cambiando los valores del bucle FOR-NEXT y teniendo en cuenta la longitud de las dos rutinas, que es de 114 octetos, se puede ubicar en la parte de la memoria que se quiera, siempre por encima de la RAMTOP que está situada en la dirección de memoria 27999.

También se pueden ubicar las dos rutinas por separado, teniendo en cuenta su longitud y creando otro bucle FOR-NEXT. El valor de comprobación de la suma de los octetos de la rutina de giro horizontal, es 4837, y el valor de comprobación de la suma de los octetos de la rutina de giro vertical, es 6336.

Estas rutinas sólo funcionan con figuras creadas por el programa del primer artículo. Este, va acompañado del dibujo de una figura que es la que se va a usar para la demostración de estas rutinas. El método para crear la figura y hacer la demostración, es el siguiente.

Primero se carga en memoria el programa creador de figuras. Cuando se haya creado, ésta no se salva en cinta de cassette, y a la pregunta de si quiere crear más figuras, se contesta que no. Entonces aparecerá el mensaje de STOP, después se pulsa NEW y ENTER y este programa se borrará; pero la figura creada seguirá en memoria porque está por encima de la RAMTOP y el comando NEW sólo limpia la memoria hasta la dirección de memoria indicada por la RAMTOP.

A continuación, se carga el programa de este artículo que ya se ha salvado en cinta de cassette antes de haber cargado el programa creador de figuras. Se nos pedirá que si queremos cargar la figura, a lo que contestaremos negativamente, ya que la tenemos en memoria.

Cuando nos pida el número de octetos y número de scan, le daremos los mismos que le hemos dado al programa creador de figuras al componer ésta, que son 2 octetos por scan y 16 scan de altura.

Más adelante pedirá los atributos con los que vamos a mostrar la figura en pantalla y el octeto bajo y alto de la dirección de memoria donde está la figura creada que, si le hemos dado la 28000, serán 96 y 109, respectivamente.

A partir de este punto empiezan las demostraciones del programa. La primera es la del giro horizontal de la figura que va avanzando horizontalmente por la pantalla y, al llegar a los bordes, gira la figura y avanza hacia el lado contrario. La segunda demostración es la del giro vertical de la figura, que sube y baja por la pantalla y cada vez que llega al borde superior o inferior, gira verticalmente y cambia el sentido del movimiento.

La tercera demostración es una combinación de las dos rutinas, con lo cual, se consigue un giro circular como el movimiento de las manecillas del reloj, o viceversa.

Las variables usadas por estas rutinas, también van en el buffer de la impresora en las direcciones siguientes:

Dirección Contenido
23303 Número de octetos del scan (longitud del scan).
23304 Número de scan (altura de la figura).
23306 Octeto bajo de la dirección de la figura en memoria.
23307 Octeto alto de la dirección de la figura en memoria.

Estas cuatro variables son usadas independientemente por cada una de las dos rutinas y tienen el mismo significado.

A continuación, se hará una descripción rápida de las rutinas en código máquina para facilitar su modificación en caso de interés.

La rutina de giro horizontal actúa de la siguiente forma:

Lo primero que hace es cargar el registro índice IX con la dirección de las variables, salvar el número de scan en el registro doble AF, y poner al registro doble DE apuntando al principio del scan, y el registro doble HL apuntando al final del scan.

Carga en el registro A el octeto que apunta el registro doble DE, y carga en el registro C el octeto que apunta el registro doble HL. Carga el registro B con el valor 254 que lo usa como control de un bucle que se repite 8 veces, ya que pone todos los bits del registro a 1 menos el bit cero que lo pone a cero, hace el desplazamiento de los tres registros 8 veces para girar los octetos, y almacena el registro A en la posición de memoria que apunta el registro doble DE.

Antes de almacenar el registro B, comprobar si es la misma dirección de memoria que se ha almacenado el registro A. Si no es lo almacena y si es, entonces ha terminado de girar todo el scan, comprobar si se han terminado los scan y, si quedan repetir la misma operación con el scan siguiente hasta acabarlos todos y entonces sale la rutina.

La rutina de giro vertical actúa de la siguiente forma:

Lo primero que hace es cargar el registro índice IX con la dirección de las variables, pone al registro doble DE apuntando al primer octeto del primer scan, y al registro doble HL apuntando al primer octeto del último scan. Comprobar si están apuntando los dos registros dobles DE y HL al mismo octeto y, si es así, salir de la rutina y si no, cargar en el registro B la longitud en octetos del scan. En este punto, se irán intercambiando los octetos las posiciones de memoria que apuntan los registros dobles DE y HL, tantas veces como indica el registro B. Pone apuntando al registro doble DE al primer octeto del siguiente scan y al registro doble HL al primer octeto del anterior scan. Si apuntan los dos al mismo octeto, entonces el giro vertical de la figura se ha completado y sale de la rutina.

Figura 1
P-RAMPT
UDG
RAMTOP
WORKSP 80H
NL
Comando o línea de programa que se está corriendo.
E-LINE 80H
Variables.
VARS Programas en Basic
PROG 80H
Información para canales.
CHANS Mapa de Microdrive.
23734 Variables del sistema.
23552 Buffer de impresora.
23296 Archivo de atributos.
22528 Archivo de pantalla.
16384 ROM
  • 019/software.txt
  • Última modificación: d/m/Y H:i
  • por miguel