Cap 6b Blitter: A=D
En la introduccion tocamos un poco por encima la idea del blitter, vimos que con "cuatro" lineas lo tenemos apañado. Hoy vamos a hacer el blit mas tipico y explicaremos las cosas un poco mas a fondo.
Nuestro primer blit no usaba fuentes de origen, simplemente usamos el destino con un minterm sacado de la manga para borrar/rellenar el area que que necesitabamos.
Ahora que tenemos una fuente, podemos empezar a meterle mano al asunto.
Siguiendo la idea del capitulo anterior, para copiar necesitamos seguir una serie de pasos.
1. Esperar a que el blitter esté libre (testeas el bit 14 en DMACONR)
2. Configurar el blit con nuestra "chuleta" $AFMMB000 (BLTCON0/BLTCON1)
3. Mascara de la Fuente A (BLTAFWM/BLTALWM, estas son nuevas)
4. Modulos del origen y el destino (BLTxMOD)
5. Punteros de origen y destino (BLTxPTH/L)
6. Tamaño del blit para empezar a copiar (BLTSIZE)
Vamos al turrón.
1.Esperar a que el blitter esté libre.
Esta es sencilla, simplemente testeamos el bit 14 en DMACONR.
Si está encendido, podemos proceder. Si esta apagado, no podemos interrumpirlo o nos cargaremos el blit en curso.
2. Configurar el blit con nuestra "chuleta" $AFMMB000
http://amiga-dev.wikidot.com/hardware:bltcon0Para configurar el blitter tenemos 2 words (BLTCON0/1), nosotros los unimos en una doble palabra por comodidad.
La A y la B de nuestra chuleta no las vamos a usar aun, asi que las podemos dejar a 0.
Solo nos queda la F (fuentes/destino) y MM (minterm).
Sabemos que el blitter tiene 3 entradas (ABC) y una salida (D), para encenderlas solo hay que editar el nibble en cuestion.
D= bit 0
A= bit 3
B= bit 2
C= bit 1
En el primer ejemplo usamos 1 (solo la D), ahora usamos 9 (A y D).
$09MM0000
Depende de las fuentes que activemos, gastaremos mas o menos slots.
Tres fuentes mas el destino son 4 words que tienen que pasar por el DMA (slots).
Sin embargo, a la hora de hacer los calculos hay que tener en cuenta unos detalles.
En la introduccion deciamos que el blit mas sencillo (solo D) no era mas el mas "barato".
¿como es posible si una fuente/destino = un word?
La razon es que el blitter (por su funcionamiento) no trabaja con un solo word, siempre va a mirar como minimo la fuente A, por eso se dice que A es gratis. La uses o no, el blitter va a gastar los 2 slots.
Si ademas activamos la fuente B, gastamos otro slot. Ya van 3 (A B y D).
Y si encima activamos la C, gastamos otro. 4 en total.
Esto es entendible ¿no?
Ahora viene la triquiñuela.
Si yo solo enciendo C y D, porque me apetece hacerlo asi, el blitter va a tardar lo mismo que si tuvieras ABC
Si me da por encender B y D, tardaremos lo mismo que AB.
Si quiero gastar el minimo tiempo posible, tiene que ser A y D. Por eso A=D el "rey de los blits".
Moraleja, hay que usar las fuentes en orden (A-->B---->C).
Teniendo claro el nibble F,
toca el minterm.
Imagina un bitmap de 1 bitplane, donde cada bit es un pixel. Sencillo ¿no?
Cada pixel puede estar encendido/apagado (1/0).
Ahora metemos un trozo de bitmap en cada fuente (ABC) y empezamos a procesarlas bit a bit.
Esta tabla representa todas las combinaciones que pueden salir de las 3 fuentes.
Como solo tenemos la fuente A, nos deshacemos de los demas.
Como siempre, A puede estar encendido/apagado (0/1). ¿Hasta aqui todo claro?
Ahora toca saber que queremos en el destino (D).
Si queremos una copia tal cual:
D tiene que ser 0 cuando A sea 0
D tiene que ser 1 cuando A sea 1
$F0 es el minterm que necesitamos para copiar de A a D.
Si quisieramos un negativo de A, usariamos $0F (donde A=1,D=0 y viceversa)
Si me he explicado bien, ahora podeis deducir el origen de los minterms que usamos en la introduccion.
Da igual la combinacion o el numero de fuentes, D siempre va a ser 0 ($00) o 1 ($FF)
Cuando añadamos mas fuentes, veremos el juego que nos da la tabla.
Ya tenemos nuetra doblepalabra.$09F00000.
3. Mascara de la Fuente A (BLTAFWM/BLTALWM)http://amiga-dev.wikidot.com/hardware:bltafwmAqui empiezan las novedades, y es que la fuente A tiene bastante jugo.
No solo podemos copiar bitmap tal cual, podemos ponerle una mascara (ocultar los pixels) del pricipio/final.
¿Para que sirve eso? Pues con lo aprendido, lo primero que se me viene a la cabeza es que si el blit solo trabaja de 16 en 16 pixels (1 word), podemos usar esa mascara para tapar lo que no nos cuadre en los extremos.
Por ejemplo, si nuestra fuente/tile/bob tiene 8 pixels de ancho y el blit recorta 16, podemos deshacernos de los otros 8 que sobran en el extremo.
BLTAFWM Mascara de los primeros (FIRST) 16bits/pixels
BLTALWM Mascara de los ultimos (LAST) 16bits/pixels
Como nuestros blits van a cuadrar, usamos $FFFF para que no se pierda nada.
4. Modulos del origen y el destino (BLTxMOD)El concepto de modulo ya lo conocemos, basicamente saltamos la parte que no queremos tocar.
A la hora de blitear hay que tener en cuenta si nuestos tiles/bobs/caracteres estan sueltos o juntos.
Si estan sueltos, no hay modulo.
Si no, hay que saltarse lo que sobra.
5. Punteros de origen y destino (BLTxPTH/L)Mas de lo mismo, tenemos que tener en cuenta que los offset deben cuadrar a 16 pixels.
Si un tile está en PANTALLA, el siguiente en PANTALLA+2, el otro en PANTALLA+4 .... asi hasta el ultimo en PANTALLA+38, ya que PANTALLA+40 cae en el siguiente renglon y no interesa.
De ahi saltamos las lineas necesarias segun el alto del tile/bob/caracter.
6. Tamaño del blit para empezar a copiar (BLTSIZE)Esto lo vimos en la introduccion, BLTSIZE dispara el blit al recibir las dimensiones del mismo.
El word tiene el formato $ALaw (ALTO EN LINEAS ancho en words)
Como es esto en codigo.
WaitBlit
move.l #$09f00000,custom+bltcon0
move.l #$ffffffff,custom+bltafwm
move.w #0,custom+bltamod
move.w #38,custom+bltdmod
move.l #Tile0,custom+bltapth
move.l #Pantalla,custom+bltdpth
move.w #16*64+1,custom+bltsize
Macro que espera al blitter
Configuramos blitter: A=D
Sin mascara, que se vea todo.
Modulo de A: 0 porque el tile esta suelto
Modulo de D: 38 porque el tile tiene 2 bytes(16px) y la pantalla 40(320px)
Puntero del tile en A
Puntero de Pantalla en D
Blit de 16 de alto por un word (16pix) de ancho.
Como siempre dejo un ejemplo sin mucha complicacion.
Hay que aprender a ubicarse en pantalla usando offsets de 16 pix (2bytes)
Simplemente generamos un tileset con 4 tiles + 1 en blanco. todos en el mismo bitmap, por lo que hay que usar modulos. OJO.
Podemos editar añadir mapas, toquetead con otros tamaños (respetando los 16pixels)....
PD: Necesito feedback, a veces no se si quedan las cosas claras o no.