Tengo el libro "QL Gamesmaster" y en él se indica que la memoria de pantalla empieza en 131072 y que se escribe en ella de forma lineal (cuando se acaba una línea se pasa a la siguiente, no como en ZX Spectrum). La cuestión es cómo realizar sprites, y es que no hay más remedio que usar ensamblador porque ni el basic estándar ni el Super Basic contemplaron esta posibilidad.
Bada, necesito un ensamblador sencillo para QL que veo muy necesario una rutina decente.
En el mismo libro se emplea una técnica para realizar en el modo de 256x256 impresión de GDU's y así tener un modo de baja resolución de 32x32 caracteres en pantalla (no hay movimiento pixel a pixel), la cual voy a ir escribiendo aquí poco a poco.
COMO CREAR GDU's EN MONOCROMO DE 8x8 PIXELS
En primer lugar hay que reservar memoria, para lo cual usamo:
Código: Seleccionar todo
C_TAB=RESPR (32*N)
C_TAB va indicar donde se sitúa la tabla de GDU's
N es el número de GDU's que vamos a usar
Ahora vamos a definir GDU's:
Código: Seleccionar todo
def_graph s,f,b,r0,r1,r2,r3,r4,r5,r6,r7
def_graph va a ser el procedimiento que nos va a definir cada GDU, el cual tiene como entrada:
s es el nº de orden del GDU dentro de la tabla, empezando por cero
f es el color del GDU
b es el color de fondo
r0-r7 son los bytes que definen el GDU, y se usan exactamente igual que en ZX Spectrum
Cada byte del GDU se calcula, si queréis hacerlo a mano, así:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Es decir, la línea 10001111 sería 143.
Ahora vamos a realizar la rutina que nos defina la tabla de GDU's en memoria:
Código: Seleccionar todo
1300 DEFine PROCedure def_graph (S%,f%,B%,R0%,R1%,R2%,R3%,R4%,R5%,R6%,R7)
1310 LOCal A,FH%,FL%,BH%,BL%
1320 A=C_TAB+32*S%
1330 FH%=(F% DIV 4)*2
1340 FL%=F% && 3
1350 BH%=(B% DIV 4)*2
1360 BL%=B% && 3
1370 charline(R0%)
1380 charline(R1%)
1390 charline(R2%)
1400 charline(R3%)
1410 charline(R4%)
1420 charline(R5%)
1430 charline(R6%)
1440 charline(R7%)
1499 END DEFine def_graph
1500 DEFine PROCedure charline (R%)
1510 LOCal M%,J,I,DL%,DH%
1520 M%=128
1530 FOR J=1 TO 2
1540 DL%=0:DH%=0
1550 FOR I=1 TO 4
1560 IF (R% && M%)=M% THEN
1570 DL%=FH%+DL%*4
1580 DH%=FL%+DH%*4
1590 ELSE
1600 DL%=BH%+DL%*4
1610 DH%=BL%+DH%*4
1620 END IF
1630 M%=M% DIV 2
1640 END FOR I
1650 POKE A, DL%
1660 POKE A+1, DH%
1670 A=A+2
1680 END FOR J
1699 END DEFine charlie
Ala, sin anestesia, más difícil es escribirlo que leerlo.
Para finalizar tenemos que realizar un procedimiento que nos imprima los GDU's en pantalla sin que nos den las uvas, así que tenemos que meter ensamblador de por medio. El procedimiento para imprimir GDU's es:
Código: Seleccionar todo
graph x,y,s
x es la posición horizontal (0 a 31, 0 es la izquierda)
y es la posición vertical (0 a 31, 0 es arriba)
s el GDU que queremos poner en pantalla
Esto se define así:
Código: Seleccionar todo
1700 DEFine PROCedure graph (X%,Y%,S%)
1710 CALL do_graph, X%,Y%,S%,C_TAB
1799 END DEFine graph
Y para crear la rutina ensamblador:
Código: Seleccionar todo
360 DATA -5245,-10109,-7806,-11646
370 DATA -6783,1665,2,0,8769,8316
380 DATA 0,0,9264,18432,8834,-11524,128
390 DATA 2264,-20228,32,26350,28672,20085
400 do_graph=RESPR(100)
410 RESTORE 360
420 FOR I=do_graph TO do_graph+22*2 STEP 2
430 READ B
440 POKE_W I.B
450 END FOR I
Y eso es todo por ahora, con todo lo aquí explicado podemos usar GDU's desde Super BASIC, a ver si aprendo algo de ensamblador del 68000 y genero yo otra rutina que permita sprites del tamaño que queramos con cada pixel de su color (y a ser posible que se puedan usar máscaras)