017:software

Microhobby 17. Año II, del 26 de febrero al 04 de marzo de 1985

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.

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
  • 017/software.txt
  • Última modificación: d/m/Y H:i
  • por miguel