Microhobby 17. Año II, del 26 de febrero al 04 de marzo de 1985
Software: Gráficos en movimiento (II)
— Miguel Sepúlveda
Especialmente destinado tanto a los programadores en lenguaje máquina, como a los «escritores» de juegos para el Spectrum, este segundo artículo está dedicado al movimiento rápido de las figuras mediante el empleo del lenguaje máquina. Con él conseguiremos decir «adiós» a la lentitud característica en el desplazamiento de nuestras creaciones gráficas por la pantalla.
Este segundo artículo está dedicado al movimiento rápido de las figuras en un juego de acción.
Para empezar, hay que decir que el movimiento de una figura por la pantalla puede estar animada o sin animar. Esta última es la más fácil de mover, porque sólo necesita llevar el control de los datos y coordenadas de un solo dibujo, mientras que en una figura animada, por ejemplo, un hombre que camina o corre, además de mover el cuerpo, se deben también cambiar de posición los brazos y las piernas para que la sensación de movimiento sea real.
Esto se consigue de dos formas distintas:
Una, teniendo varias figuras almacenadas con los diferentes movimientos, de forma que en cada desplazamiento se vaya poniendo la figura correspondiente hasta completar el ciclo.
La otra, consiste en tener el dibujo del cuerpo y varios más con los correspondientes movimientos de brazos y piernas. Así se compone la figura aunque, de esta forma, hay que llevar el control de los datos y coordenadas de los diferentes dibujos que la integran. No siempre es aconsejable utilizar la primera forma, porque sería necesario crear muchos dibujos para obtener el movimiento de un solo bloque.
Por otra parte, se puede mover una figura suavemente, pixel a pixel, en alta resolución, o muy rápidamente, carácter a carácter, en baja resolución.
Este artículo tratará pues, de la rutina en código máquina de movimiento carácter a carácter, equivalente a la sentencia en BASIC
PRINT AT L, C; «dibujo»
o la rutina de la ROM RST 10H
En el caso del BASIC, además de ser un poco lento, hay que darle la dirección (con el AT) de cada línea de caracteres de la figura.
Por ejemplo, una figura con 3 líneas de caracteres se pondría de la siguiente forma:
PRINT AT L, C; «1ª línea»; AT L + 1, C; «2ª línea»; AT L + 2, C; «3ª línea»
La rutina RST 10H de la ROM sólo puede ser usada desde un programa en código máquina y, para situar un carácter en una determinada posición de la pantalla, hay que llamarla 4 veces con el código del AT, la línea, la columna y el carácter a imprimir, todo esto y sucesivamente en el registro A.
Por ejemplo, si queremos poner el primer carácter Gráfico Definido por el Usuario en la línea 7 y la columna 4, con el canal «S» abierto, sería de la siguiente forma:
LD A,22 ; AT control RST 10H LD A,7 ; Línea 7 RST 10H LD A,4 ; Columna 4 RST 10H LD A, 144 ; Primer GDU RST 10H
Estas dos formas sólo pueden manejar una figura que esté creada con los caracteres Gráficos Definidos por el Usuario, y no que esté creada en memoria.
El programa que acompaña este artículo tiene en las sentencias DATA los octetos de la rutina que se carga a partir de la posición 64238 de la memoria, y tiene una longitud de 138 octetos. Esta rutina es reubicable.
Para situarla en otra posición de memoria hay que cambiar los valores del bucle FOR…NEXT de la línea 70 del programa por la nueva dirección de memoria donde se quiere ubicar, y al llamar a la rutina darle la nueva dirección.
Usa figuras creadas por el programa del primer artículo. Este dato es lo primero que pide; a continuación nos pregunta por los atributos con los que queremos que se muestre la figura en pantalla, y por fin se hace una demostración moviendo la figura diagonalmente 10 veces. Finaliza ofreciendo la opción de salvar la rutina en cinta de cassette con la precaución de cambiar la dirección del SAVE “” CODE, si se ha ubicado la rutina en otro lugar de la memoria.
Las variables usadas por la rutina van en el buffer de impresora, en las direcciones siguientes:
Dirección | Contenido |
---|---|
23300 | Número de la columna de la esquina superior izquierda de la figura. (COLUM) |
23301 | Número de la línea de la esquina superior izquierda de la figura. (LINEA) |
23302 | Es el MODO. 1 muestra la figura. 0 borra la figura. (MODO) |
23303 | Número de columnas de la figura, o sea, la longitud en octetos del sean. (ANCHO) |
23304 | Número de líneas de la figura, o sea el número de scan partido por 8 (que son los sean que tiene una línea). (ALTO) |
23305 | Atributos con los que va a mostrar la figura. (ATTR) |
23306 | Octeto bajo de la dirección de la figura en memoria. (FIGUR) |
23307 | Octeto alto de la dirección de la figura en memoria. (FIGUR) |
La variable del MODO con valor 1 coge los atributos de la parte de la pantalla donde se muestra la figura y los guarda, pone los nuevos atributos y muestra la figura. Si la variable MODO es 0 entonces restituye los atributos que tenía anteriormente y borra la figura.
En la variable de la dirección 23304 va el número de líneas en baja resolución; esto quiere decir que cuando se cree una figura, el número de scan que se dé tiene que ser múltiplo de 8 (número que es precisamente el de scan por línea en baja resolución).
En la variable 23305 va el octeto de los atributos de la figura que se forma, como es el BASIC, de la siguiente forma:
INK + PAPER * 8 + BRIGHT * 64 + FLASH * 128
BRIGHT y FLASH tendrán valor 1 para activado y 0 para desactivado.
INK y PAPER tendrán un valor comprendido entre 0 y 7.
A continuación, se hará una descripción rápida de la rutina en código máquina para facilitar su modificación en caso de interés.
Lo primero que hace es poner el registro índice IX apuntando a las variables que están en el buffer de la impresora; a continuación, calcula la dirección en el archivo de pantalla donde va a ir el octeto de la esquina superior izquierda de la figura, y calcula también dónde van a ir los atributos en el archivo de los atributos, luego, se mete en un bucle que se repetirá tantas veces como líneas tenga la figura y, dentro de este bucle, se repite otro 8 veces, que son los scan de cada línea. La rutina mostrará o borrará la figura dependiendo de la variable MODO.
Desensamble de la rutina
FAEE 1710 DIBUB EQU FAEE F3 1720 DI FAEF DD21045B 1730 LD IX,COLUM FAF3 ED4B045B 1740 LD BC,(COLUM) FAF7 78 1750 LD A,B FAF8 0F 1760 RRCA FAF9 0F 1770 RRCA FAFA 0F 1780 RRCA FAFB E6E0 1790 AND 0E0H FAFD 6F 1800 LD L,A FAFE 78 1810 LD A,B FAFF E618 1820 AND 18H FB01 F640 1830 OR 40H FB03 67 1840 LD H,A FB04 0600 1850 LD B,0 FB06 09 1860 ADD HL,BC FB07 5D 1870 LD E,L FB08 7C 1880 LD A,H FB09 0F 1890 RRCA FB0A 0F 1900 RRCA FB0B 0F 1910 RRCA FB0C E603 1920 AND 3 FB0E F658 1930 OR 58H FB10 57 1940 LD D,A FB11 D5 1950 PUSH DE FB12 ED5B0A5B 1960 LD DE,(FIGUR) FB16 3A085B 1970 LD A,(ALTO) FB19 1980 DBBZ EQU $ FB19 08 1990 EX AF,A'F' FB1A 0E08 2000 LD C,8 FB1C 2010 DBB4 EQU $ FB1C E5 2020 PUSH HL FB1D DD4603 2030 LD B,(IX+3) FB20 DDCB0246 2040 BIT 0, (IX+2) FB24 2003 2050 JR NZ,DBB6 FB26 11003D 2060 LD DE,3D00H FB29 2070 DBB6 EQU $ FB29 1A 2080 LD A, (DE) FB2A 77 2090 LD (HL),A FB2B 13 2100 INC DE FB2C 23 2110 INC HL FB2D 10FA 2120 DJNZ DBB6 FB2F E1 2130 POP HL FB30 24 2140 INC H FB31 0D 2150 DEC C FB32 20E8 2160 JR NZ,DBB4 FB34 7D 2170 LD A,L FB35 E6E0 2180 AND 0E0H FB37 FEE0 2190 CP 0E0H FB39 2808 2200 JR Z,DBB8 FB3B 01E007 2210 LD BC,7E0H FB3E A7 2220 AND A FB3F ED42 2230 SBC HL,BC FB41 1809 2240 JR DBB10 FB43 2250 DBB8 EQU $ FB43 7C 2260 LD A,H FB44 FE57 2270 CP 57H FB46 3004 2280 JR NC,DBB10 FB48 7D 2290 LD A,L FB49 E61F 2300 AND 1FH FB4B 6F 2310 LD L,A FB4C 2320 DBB10 EQU $ FB4C 08 2330 EX AF,A'F' FB4D 3D 2340 DEC A FB4E 20C9 2350 JR NZ,DBB2 FB50 E1 2360 POP HL FB51 112000 2370 LD DE,32 FB54 DDCB0246 2380 BIT 0,(IX+2) FB58 2005 2390 JR NZ,DBB12 FB5A 3A125B 2400 LD A,(ATTR0) FB5D 1807 2410 JR DBB14 FB5F 2420 DBB12 EQU $ FB5F 7E 2430 LD A,(HL) FB60 32125B 2440 LD (ATTR0),A FB63 3A095B 2450 LD A,(ATTR) FB66 2460 DBB14 EQU $ FB66 DD4E04 2470 LD C,(IX+4) FB69 2480 DBB16 EQU $ FB69 DD4603 2490 LD B,(IX+3) FB6C E5 2500 PUSH HL FB6D 2510 DBB18 EQU $ FB6D 77 2520 LD (HL),A FB6E 23 2530 INC HL FB6F 10FC 2540 DJNZ DBB18 FB71 E1 2550 POP HL FB72 19 2560 ADD HL,DE FB73 0D 2570 DEC C FB74 20F3 2580 JR NZ,DBB16 FB76 FB 2590 EI FB77 C9 2600 RET