Microhobby 18. Año II, del 05 al 11 de marzo de 1985
Software: Gráficos en movimiento (III)
— Miguel Sepúlveda
La rutina de movimiento más esperada por los aficionados es, sin duda, la que desplaza los gráficos pixel a pixel por la pantalla. En esta tercera parte de la serie abordamos cómo hacerlo.
En primer lugar, había que decir que en esta rutina el movimiento de las figuras por la pantalla es lento si lo comparamos con la del artículo anterior, que va saltando de 8 en 8 pixel; pero la suavidad con que mueve esta rutina la figura, sin saltos bruscos, es asombrosa si tenemos en cuenta que se mueve de pixel en pixel.
El tamaño de las figuras que puede manejar puede ir, desde un simple pixel, hasta una figura que tenga 255 pixel (32 octetos) por scan y una altura de 176 scan; como se puede comprobar, maneja desde un simple pixel hasta un figura que ocupe toda la pantalla y, en este caso, se puede usar para hacer el scroll de la pantalla hacia arriba, pixel a pixel.
También esta rutina puede mover las figuras suavemente, o sea pixel a pixel, o más rápidamente, moviéndola de dos en dos pixel o de tres en tres, etc. dependiendo del incremento que se haga en las coordenadas X e Y de la esquina superior del gráfico al llamar a la rutina, que sitúa la figura en pantalla a partir de esas dos coordenadas.
Visto un poco las grandes posibilidades que tiene esta rutina, pasamos a explicar el programa que acompaña a este artículo.
Las 10 sentencias DATA contienen los octetos del código máquina de la rutina que se carga en la posición de memoria 64000, y tiene una longitud de 238 octetos. La línea 80 hace una comprobación de la suma de los octetos por si al introducir el programa se produce un error.
La sentencia de la línea 70 almacena la rutina en la posición de memoria 64000; pero como esta rutina es reubicable cambiando los valores del bucle FOR… NEXT y, teniendo en cuenta la longitud de la rutina que es de 238 octetos, se puede incluir en la parte de memoria que se quiera, siempre que sea por encima de la RAMTOP, que está situada en la dirección de memoria 27999.
Lo primero que nos pide la rutina son las figuras creadas con el programa del primer artículo, ya que es precisamente a éstas, a las que dotamos de movimiento. A continuación, pide el número de bits (pixel) que tiene de anchura el scan (no tiene por qué ser necesariamente el número de octetos del scan multiplicado por 8), y, luego, pide el número de scan.
Más adelante nos requerirá los atributos con los que queremos que se muestre la figura en la pantalla, y hace una demostración moviendo la figura diagonalmente 8 veces. Para terminar, el programa preguntará si se quiere salvar la rutina en cinta de cassette, teniendo 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 esta rutina, también van en el buffer de la impresora en las direcciones siguientes:
Dirección | Contenido |
---|---|
23300 | Número de la coordenada X de la esquina superior izquierda de la figura. |
23301 | Número de la coordenada Y de la esquina superior izquierda de la figura. |
23302 | Es el MODO. 1 muestra figura. 0 borra figura. |
23303 | Número de bits (pixel), o sea la longitud del scan en bits. |
23304 | Número de scan de la figura. |
23305 | Los atributos con los que se muestra la figura. |
23306 | Octeto bajo la dirección de la figura en memoria. |
23307 | Octeto alto de la dirección de la figura en memoria. |
Además esta rutina utiliza, desde la 23308, hasta la posición 23314 para su uso interno.
La variable MODO, con el 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 borra la figura y restituye los atributos que tenía anteriormente.
Como se verá en la demostración de esta rutina, muestra la figura y, a continuación, la borra, lo que quiere decir que hay que llamar 2 veces a la rutina, la primera vez con la variable MODO igual a 1, y la segunda con la variable MODO igual a 0.
De este modo la velocidad de la figura por la pantalla es lenta, pero se puede aumentar el doble si sólo se muestra la figura y no se borra, en cuyo caso irá dejando una estela detrás de ella de los últimos pixel de la figura, en la dirección que se mueva.
Para evitar esto, hay un truco que consiste en dejar tantos pixel en blanco alrededor de la figura, al crearla, como el incremento que se haga de la coordenada correspondiente en el movimiento de la figura.
En esta demostración se incrementan las coordenadas en cada pasada tantos pixel como el número de la pasada, o sea, de uno en un pixel, de dos en dos pixel, etc, hasta 8.
En la variable 23305 va el octeto de los atributos de la figura que se forma como en el BASIC (ver figura 2).
Composición del atributo | ||||||||
---|---|---|---|---|---|---|---|---|
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Campo | Flash | Bright | Paper | Ink |
El listado 2 corresponde a los nemo-técnicos de la rutina para facilitar su modificación en caso de interés y adaptarla a su propio juego.
Desensamble de la rutina
FA00 0010 ORG 64000 5B04 0020 CORDX EQU 23300 5B04 0030 COLUM EQU 23300 5B05 0040 CORDY EQU 23301 5B05 0050 LINEA EQU 23301 5B06 0060 MODO EQU 23302 5B07 0070 ANCHO EQU 23303 5B07 0080 NBYTE EQU 23303 5B08 0090 ALTO EQU 23304 5B08 0100 NSCAN EQU 23304 5B09 0110 ATTR EQU 23305 5B0A 0120 FIGUR EQU 23306 5B0C 0130 NATTL EQU 23308 5B0D 0140 NATTH EQU 23309 5B0E 0150 REST EQU 23310 5B0F 0160 RESS EQU 23311 5B10 0170 ANCH EQU 23312 5B11 0180 BUCLE EQU 23313 5B12 0190 ATTRO EQU 23314 0200 ; 0210 ; PROGRAMA 0220 ; FA00 0230 DIBUJ EQU $ FA00 F3 0240 DI FA01 DD21045B 0250 LD IX, CORDX FA05 ED4B045B 0260 LD BC,(CORDX) FA09 CDAA22 0270 CALL 22AAH FA0C 320E5B 0280 LD (REST),A FA0F DD340A 0290 INC (IX+10) FA12 010001 0300 LD BC, 100H FA15 DD8603 0310 ADD (IX+3) FA18 3D 0320 DEC A FA19 3805 0330 DB0 JR C, DB2 FA1B 0C 0340 INC C FA1C D60B 0350 SUB 8 FA1E 18F9 0360 JR DB0 FA20 ED430C5B 0370 DB2 LD (NATTL),BC FA24 5D 0380 LD E,L FA25 7A 0390 LD A,D FA26 0F 0400 RRCA FA27 0F 0410 RRCA FA28 0F 0420 RRCA FA29 E603 0430 AND 3 FA2B F658 0440 OR 58H FA2D 57 0450 LD D,A FA2E D5 0460 PUSH DE FA2F ED5B0A5B 0470 LD DE,(FIGUR) FA33 EB 0480 EX DE,HL FA34 3A0B5B 0490 LD A,(ALTO) FA37 0500 DIB0 EQU $ FA37 0B 0510 EX AF,A'F' FA38 D5 0520 PUSH DE FA39 3A075B 0530 LD A,(ANCHO) FA3C 32105B 0540 LD (ANCH),A FA3F 3A0E5B 0550 LD A,(REST) FA42 320F5B 0560 LD (RESS),A FA45 DDCB0246 0570 BIT 0,(IX+2) FA49 2008 0580 JR NZ,DIB2 FA4B 0600 0590 LD B,0 FA4D DD360DFA 0600 LD (IX+13),250 FA51 1806 0610 JR DIB6 FA53 0620 DIB2 EQU $ FA53 46 0630 LD B,(HL) FA54 23 0640 INC HL FA55 0650 DIB4 EQU $ FA55 DD360D0B 0660 LD (IX+13),B FA59 0670 DIB6 EQU $ FA59 0E08 0680 LD C,8 FA5B 1A 0690 LD A,(DE) FA5C DD350B 0700 DEC (IX+11) FA5F 2807 0710 JR Z,DIB10 FA61 0720 DIB8 EQU $ FA61 07 0730 RLCA FA62 0D 0740 DEC C FA63 DD350B 0750 DEC (IX+11) FA66 20F9 0760 JR NZ,DIB8 FA68 0770 DIB10 EQU $ FA68 CB20 0780 SLA B FA6A 17 0790 RLA FA6B DD350C 0800 DEC (IX+12) FA6E 2817 0810 JR Z,DIB14 FA70 DD350D 0820 DEC (IX+13) FA73 2006 0830 JR NZ,DIB12 FA75 46 0840 LD B,(HL) FA76 23 0850 INC HL FA77 DD360D08 0860 LD (IX+13),B FA7B 0870 DIB12 EQU $ FA7B 0D 0880 DEC C FA7C 20EA 0890 JR NZ,DIB10 FA7E 12 0900 LD (DE),A FA7F 13 0910 INC DE FA80 1A 0920 LD A,(DE) FA81 0E08 0930 LD C,8 FA83 18E3 0940 JR DIB10 FA85 0950 DIB13 EQU $ FA85 18B0 0960 JR DIB0 FA87 0970 DIB14 EQU $ FA87 0D 0980 DEC C FA88 2804 0990 JR Z,DIB18 FA8A 1000 DIB16 EQU $ FA8A 07 1010 RLCA FA8B 0D 1020 DEC C FA8C 20FC 1030 JR NZ,DIB16 FA8E 1040 DIB18 EQU $ FA8E 12 1050 LD (DE),A FA8F D1 1060 POP DE FA90 0B 1070 EX AF,A'F' FA91 FE01 1080 CP 1 FA93 2B31 1090 JR Z,DIB26 FA95 08 1100 EX AD,A'F' FA96 E5 1110 PUSH HL FA97 EB 1120 EX DE,HL FA98 7C 1130 LD A,H FA99 E607 1140 AND 7 FA9B FE07 1150 CP 7 FA9D 2B03 1160 JR Z,DIB20 FA9F 24 1170 INC H FAA0 181E 1180 JR DIB24 FAA2 1190 DIB20 EQU $ FAA2 7D 1200 LD A,L FAA3 E6E0 1210 AND 0E0H FAA5 FEE0 1220 CP 0E0H FAA7 2B0B 1230 JR Z,DIB22 FAA9 DD3409 1240 INC (IX+9) FAAC 11E006 1250 LD DE,6E0H FAAF A7 1260 AND A FAB0 ED52 1270 SBC HL,DE FAB2 180C 1280 JR DIB24 FAB4 1290 DIB22 EQU $ FAB4 7C 1300 LD A,H FAB5 FE57 1310 CP 57H FAB7 2807 1320 JR Z,DIB24 FAB9 DD3409 1330 INC (IX+9) FABC 112000 1340 LD DE,20H FAFB 19 1350 ADD HL,DE FAC0 1360 DIB24 EQU $ FAC0 EB 1370 EX DE,HL FAC1 E1 1380 POP HL FAC2 08 1390 EX AF.A'F' FAC3 3D 1400 DEC A FAC4 20BF 1410 JR NZ, DIB13 FAC6 1420 DIB26 EQU $ FAC6 E1 1430 POP HL FAC7 112000 1440 LD DE,32 FACA DDCB0246 1450 BIT 0,(IX+2) FACE 2005 1460 JR NZ,DIB28 FAD0 3A125B 1470 LD A,(ATTRO) FAD3 1807 1480 JR DIB30 FAD5 1490 DIB28 EQU $ FAD5 7E 1500 LD A,(HL) FAD6 32125B 1510 LD (ATTRO),A FAD9 3A095B 1520 LD A,(ATTR) FADC 1530 DIB30 EQU $ FADC DD4E09 1540 LD C,(IX+9) FADF 1550 DIB32 EQU $ FADF DD4608 1560 LD B,(IX+8) FAE2 E5 1570 PUSH HL FAE3 1580 DIB34 EQU $ FAE3 77 1590 LD (HL),A FAE4 23 1600 INC HL FAE5 10FC 1610 DJNZ DIB34 FAE7 E1 1620 POP HL FAE8 19 1630 ADD HL,DE FAE9 0D 1640 DEC C FAEA 20F3 1650 JR NZ,DIB32 FAEC FB 1660 EI FAED C9 1670 RET