Página 1 de 5

Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 09 Jul 2018, 12:38
por Bubu
¡Hola, torpedos!

Ya sabemos que el Spectrum (al menos en las versiones 16KB y 48KB), tiene la siguiente distribución de scanlines en la vídeomemoria:

[ 0 1 0 T T S S S ] - [ R R R C C C C C ]

donde TT = tercio de pantalla, SSS = scanline, RRR = fila y CCCCC = columna. Así las cosas, necesito una rutinilla que dado el valor de una posición en la vídeomemoria o VRAM, almacenado p.ej. en hl, me calcule el valor de la VRAM en el scanline justo que está debajo de hl.
La cosa básicamente es incrementar SSS, y si no desborda, pos ya está.
Pero si desborda, poner SSS=0 e incrementar RRR, y si no desborda, pos ya está.
Pero si desborda, poner RRR=0 e incrementar TT.

El poblema está en incrementar RRR y en incrementar TT, ya que estos bits están por medio de su correspondiente registro 'h' o 'l', y habría que estar haciendo rotaciones tipo RLCA, etc.

¿Conocéis alguna rutinilla que sea cortita y ágil y que realice la tarea de calcular el siguiente scanline en VRAM?

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 09 Jul 2018, 15:37
por Bubu
Se me está ocurriendo un método que no sé si será más mejor que el anterior, se trata de mezclar en un solo registro los valores de TT y RRR, con lo que tendríamos: 000TTRRR
Ese registro me da exactamente la fila en pantalla. Así las cosas:

- Incremento SSS, y si no desborda, yastá
- Si desborda, incremento ese registro 000TTRRR, y finalmente rehago la posición VRAM

Y un método más, que sería el más rápido pero el que más memoria consume: memorizar cada posición VRAM junto con su siguiente posición VRAM. Así sólo tendría que buscar en ese array la posición VRAM, y entonces leo el siguiente WORD. Pero entonces me las tendría que ingeniar para realizar una rutina de búsqueda en ese array... no sé yo...

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 09 Jul 2018, 16:14
por Bubu
Pos tras comerme mucho el cráneo, voy a implementar una mezcla del método 2 (construcción del valor de 000TTRRR) y del método 3 (array de posiciones VRAM) de tal manera que una vez que tengo el 000TTRRR, me voy al array a ver cuál es la siguiente fila en VRAM, y a eso le encasqueto la columna CCCCC la cual permanece constante. Sería simplemente un array de 24 valores de 16 bits, ya que el Spectrum tiene sólo 24 filas en pantalla.

En breva sus pongo la rutina cómo queda por si a alguién le es de interés.

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 09 Jul 2018, 16:29
por Bubu
He aquí la rutina:

Código: Seleccionar todo

calc_next_vram:
 ; Calcula la siguiente posición en VRAM del scanline inmediatamente inferior
 ; útil para desplazamientos gráficos hacia abajo
 ; formato: 010TTSSS RRRCCCCC
 ; IN : hl = dirección en VRAM
 
 ld a, h
 and %111
 cp %111
 jr z, calc_next_vram_01
 inc h
 ret
 
 calc_next_vram_01:
 push hl
 ld a, h
 and %00011000
 ld h, a
 ld a, l
 and %11100000
 ccf
 rla
 rla
 rla
 or h
 inc a
 ld e, a
 ld d, 0
 ld hl, vram_array
 add hl, de
 ld e, (hl)
 inc hl
 ld d, (hl)
 ld l, e
 ld h, d
 pop de
 ld a, e
 and %00011111
 or l
 ld l, a
 ret
 
 
 vram_array:
    DEFW 0x4000, 0x4020, 0x4040, 0x4060, 0x4080, 0x40A0, 0x40C0, 0x40E0
    DEFW 0x4800, 0x4820, 0x4840, 0x4860, 0x4880, 0x48A0, 0x48C0, 0x48E0
    DEFW 0x5000, 0x5020, 0x5040, 0x5060, 0x5080, 0x50A0, 0x50C0, 0x50E0




Probado, y funciona perfestamente.

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 09 Jul 2018, 17:45
por Lenko
Puedes decir que lo has sacado gracias a la inestimable ayuda del foro :D

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 09 Jul 2018, 21:32
por Bubu
Pues no te creas, que muchas veces el esfuerzo de tener que postear la pregunta hace que le dé más vueltas a la chosla y lo resuelva mejón. Así que esta vez efestivamente ha sido gracias al foro, aunque no a los foreros :D

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 10 Jul 2018, 16:40
por Namek
Me gustan estos hilos donde el mismo que pregunta se responde a si mismo, es como cuando vas hablando solo por la calle... :mrgreen:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 10 Jul 2018, 17:07
por explorer
En Informática, a esto se le llama Método de depuración del patito de goma.

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 10 Jul 2018, 19:05
por Bubu
AjJAjAJjajajAjAJJA, ¡¡eso es!!

Bueno, de toas formas, si alguien coñoce algún código que resulte más eficiente o simétrico o más mejón, pos que lo diga (o calle para siempre :D )

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Publicado: 11 Jul 2018, 01:46
por GXY
definitivamente, en desarrollo de software esta TODO estudiao xD