lunes, 18 de noviembre de 2019

Mostrando una imagen

En la entrada anterior pudimos al fin montar nuestra copperlist ademas de reservar memoria gráfica para nuestra pantalla de visualización, pero seguimos sin ver nada por nuestro monitor.
Pues vamos a visualizar un gráfico que hayamos creado con DPaint, Ppaint o similares.



Antes de visualizar una imagen debemos entender como organiza la memoria gráfica el Amiga para poder convertir nuestro gráfico al modo que el Amiga entiende.
La clave esta en los Bitplanos. Y seamos sinceros. Como soy un poco vago y la verdad, el bueno de Nandius ya escrito sobre ello de manera excelente, os remito a su blog para que lo entendais.

El rincón de Fer - Explicación Bitplanos entre otras cosas.

Pues ya hemos entendido lo que son los bitplanos. Ahora nos queda coger un IFF y transformarlo a formato RAW, que no es mas que la imagen tranformada en planos de bits.
Para ello podemos utilizar programas como PicConArtPro o similares.
Básicamente cargas la imagen iff y la conviertes a RAW.

Una vez que ya tenemos nuestra imagen en formato de bitplanos tenemos que incluirla en nuestro programa.
Recordamos que en la entrada anterior sobre la CopperList reservamos un area de memoria Chip bajo la etiqueta "Screen:" de la siguiente forma:
ds.b    40*256      ;40 bytes por linea * 256 lineas

Pues ahora no nos hace falta reservar memoria libre pues vamos a usar nuestra imagen raw por lo que sustituiremos esa linea por la siguiente:
incbin "imagen.raw"

Ya tenemos nuestra imagen en memoria en el formato que el Amiga entiende pero aun tenemos que decirle a la maquina en que dirección de memoria está la imagen y cuantos bitplanos queremos mostrar.

Si observamos la copperlist de la entrada anterior veremos el siguiente registro:

DC.W    BplCon0,$1200

Este registro, entre otras cosas, dice al Amiga cuantos Bitplanos activar. En este caso solo activa 1 plano.
Para activar 2 planos haríamos:
DC.W    BplCon0,$2200
Para 3 planos:
DC.W    BplCon0,$3200
etc etc...
Pondremos este registro acorde al numero de colores que tenga nuestra imagen.
1 plano = 2 colores, 2 planos = 4 colores, 3 planos = 8 colores etc etc...

Bien, ya le hemos dicho al Amiga cuantos planos queremos. Ahora hay que indicarle la dirección de cada bitplano de la imagen en sus correspondientes registros.

Volvamos de nuevo a la copperlist de la entrada anterior y fijemonos en la linea:
Planes:
        DC.W    Bpl1Pth,$0000,Bpl1Ptl,$0000     ;punteros del Bitplano 1

Esa linea va a tener la dirección del primer bitplano de nuestra imagen. Si nuestro gráfico consta de mas bitplanos hay que añadir mas registros.
Por ejemplo, supongamos que nuestra imagen consta de 32 colores (5 bitplanos)

DC.W    Bpl1Pth,$0000,Bpl1Ptl,$0000     ;punteros del Bitplano 1
DC.W    Bpl2Pth,$0000,Bpl2Ptl,$0000     ;punteros del Bitplano 2
DC.W    Bpl3Pth,$0000,Bpl3Ptl,$0000     ;punteros del Bitplano 3
DC.W    Bpl4Pth,$0000,Bpl4Ptl,$0000     ;punteros del Bitplano 4
DC.W    Bpl5Pth,$0000,Bpl5Ptl,$0000     ;punteros del Bitplano 5

Pero vemos que realmente esos registro apuntan todos a $0. Debemos meter la dirección real de nuestro gráfico y eso lo hacíamos en _Main: de la siguiente forma:
move.l  #screen,d0
        lea     Planes,a1
        move.w  d0,6(a1)
        swap    d0
        move.w  d0,2(a1)
        swap    d0

Ponemos la dirección de screen (nuestro gráfico) de d0 y la dirección de los registros de los bitplanos en  a1 y como los registros de los bitplanos son de 16 bits hay que poner la dirección en dos veces (de ahí el swap y los dos moves).

En esas lineas solo hemos puesto la dirección del primar plano (Bpl1pth - Bpl1Ptl).
Si nuestra imagen tiene mas colores debemos actualizar cada registro.

Una forma de hacerlo es un bucle:
moveq  #NumPlanes-1,d1
        move.l  #screen,d0
        lea     Planes,a1
.bp
        move.w  d0,6(a1)
        swap    d0
        move.w  d0,2(a1)
        swap    d0
        add.l   #Plane_Size,d0
        add.l   #8,a1           ;siguiente puntero a plano
        dbra    d1,.bp

Donde NumPlanes es el número de planos que usamos y Plane_Size es el tamaño de un bitplano. Para una pantalla de 320*256 serian 10240 bytes (40 bytes * 256 lineas)

Y ya por último (joder, pensé que esto iba a ser mas corto) necesitamos poner los colores de nuestra imagen en los registros de color.
Con los mismos programas que hemos utilizado para convertir el iff a raw podemos extraer los colores de la imagen a diferentes formatos. En este caso los he exportado a formato copperlist y lo pego.

Vamos a mostrar todo el código para hacernos una idea mas global.

Como siempre, aquí dejo los enlaces con los ficheros necesarios para probar el ejemplo.
Main.s
Imagen.iff
Imagen.raw

No hay comentarios:

Publicar un comentario