martes, 9 de marzo de 2021

Definir el tamaño de pantalla


Antes siquiera de empezar a pintorrojear en  pantalla  debemos plantearnos que tamaño va a tener esta pues, entre otras cosas, afecta al rendimiento de nuestro Amiga.

Generalmente, en una pantalla PAL las dimensiones son de 320x256 en baja resolución, 640x256 en alta o tener modos entrelazados de 512 pixels de altura.
Pero esas dimensiones no son fijas. Podemos tener otro tipo de dimensiones como 320x200, 336x210 o la que mejor nos convenga.


Para definir nuestra resolución debemos entender los siguientes registros: 

DIWSTRT  ($dff08e) 
DIWSTOP  ($dff090)
DDFSTRT  ($dff092)
DDFSTOP  ($dff094)


Primero debemos saber que en un monitor hay mas pixeles de los que podemos ver físicamente. Es por eso que cuando definimos el comienzo de la pantalla damos valores por encima de cero pues este está en el lado no visible del monitor.

Verticalmente empieza a verse sobre la línea 26 hasta la línea 312 ($1a a $138). Ese periodo en el que los pixeles no se ven verticalmente se denomina Vertical Blanking Interval (VBI) y será una zona muy a tener en cuenta para nuestras rutinas como ya explicaré en otra entrada.
Horizontalmente se puede ver ya desde la columna 107 ($6b).

Lo primero que haremos es  definir donde van a mostrarse los pixeles en nuestro monitor y cuantos.
Como ejemplo centraremos la imagen en el monitor con una resolución de 320x256 pues es muy común.

DIWSTRT
Empezamos definiendo el lado superior izquierdo en DIWSTRT. Este registro se divide en 8 bits para la coordenada Vertical y 8 para la Horizontal de la siguiente forma.
DIWSTRT v7v6v5v4v3v2v1v0 h7h6h5h4h3h2h1h0
Al ser una resolución muy usada sabemos que este punto es $2c81. Es decir, la línea 44 ($2c) y la columna 129 ($81).

DIWSTOP
Definido el inicio de la pantalla procedemos a poner en DIWSTOP el final de esta, o sea, 320 pixeles mas a la derecha y 256 mas hacia abajo.
DIWSTOP v7v6v5v4v3v2v1v0 h7h6h5h4h3h2h1h0
 
DIWSTRT define su inicio vertical en 44($2c) por lo que debemos poner en DIWSTOP 44+256=300($12c).
Pero aquí hay un problema. La componente Vertical de estos registros solo tiene 8 bits (hasta 255) por lo que no nos cabe nuestro 300($12c).
Este registro soluciona este problema de una manera ingeniosa. Por defecto el valor del componente Vertical si es 00($00) apunta a la línea 256. Entonces todo el valor que le pongamos a esa componente se la añade a 256 automáticamente.
En nuestro caso sería la línea 300($12c) - 256($100) = 44($2c)

Para la componente Horizontal nos fijamos que tenemos en DIWSTRT y le sumamos 320($140).
El componente de inicio vertical en DIWSTRT es 129($81) + 320($140) = 449($1c1).
Tenemos el mismo problema que con el componente Vertical y lo solucionamos de la misma manera.
449($1c1) - 256($100) = 193($c1)

Y con esto ya tendríamos los valores de pantalla para 320x256 pixeles.
DIWSTRT $2c81
DIWSTOP $2cc1






En el caso de querer resoluciones inferiores a 256 lo que hacemos es restar valores al 256. 
Por ejemplo, si queremos tener 200 puntos de alto desde el inicio 44($2c), hacemos 44+200=244( $f4). O lo que visto de otra manera, 244-256 = -12($f4).
Esto se consigue emulando un bit 8. Si el bit 7 es cero, el bit 8 (virtual) se pone a uno, por lo que los números comienzan desde 256 en adelante. Si el bit 7 es uno, el 8 es entonces cero y ya se crean los números negativos. ( Me explico como el culo pero es la matemática binaria vamos.)


Una vez hecho esto tenemos que decirle al sistema del DMA cuando empieza a lanzar horizontalmente bytes de nuestro grafico a nuestra pantalla definida. Esto se hace mediante los registros DDFSTRT y DDFSTOP.
Estas posiciones de DMA están fijadas en el rasterline y se denominan ciclos de DMA.

Hay que calcular que posición de DMA corresponde a la ventana que hemos definido con DIWSTRT-DIWSTOP y para eso tenemos un par de formulas.

DDFSTRT = (PosiciónHorizontalDeDIWSTRT / 2) - 8
DDFSTOP = DDFSTRT + (Pixels por lines / 2) - 8

El -8 es porque debemos empezar a disparar nuestra imagen 8 ciclos antes para dar tiempo al DMA.

En nuestro ejemplo tendríamos:
DDFSTRT = $81/$2 - $8 = $38 
DDFSTOP = $38 +(320/2) -8 = $D0




Si nos fijamos en las posiciones de DMA del gráfico vemos que $38 es justo cuando empiezan un ciclo entero de visualización de los bitplanos. Para visualizar los pixeles de todos los planos son necesarios 8 ciclos.
Es por eso que estas posiciones deben ser múltiplos de 8. Fijándonos en el gráfico podemos determinar el porqué de estas posiciones.

El DMA comienza verticalmente en las posiciones de línea de DIWSTRT y acaba en DIWSTOP y horizontalmente donde indica DDFSTRT y DDFSTOP.
Como decía al principio, vemos que en esta zona el DMA esta muy ocupado por lo que es deseable hacer el máximo de operaciones en el VB pues está menos saturado.

Luego ya habría que activar el dma de los bitplanos, definir el modulo, los punteros etc etc pero eso ya seria otro tema.

Espero haber podido explicar con un mínimo de claridad el tema pues, aunque no es complicado, si requiere algo de conocimiento del funcionamiento interno del Amiga.
En cualquier caso teneis los comentarios para dudas, correcciones y demás menesteres.

Salud y AMIGA!



1 comentario: