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
 
018/software.txt · Última modificación: d/m/Y H:i por miguel
Recent changes RSS feed Creative Commons License Driven by DokuWiki Made on Mac