¡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?
Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
- Bubu
- Atari 1040 STf
- Mensajes: 895
- Registrado: 04 Abr 2018, 23:10
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Atari 2600
- Primera consola: Nintendo GameBoy
- Gracias dadas: 21 veces
- Gracias recibidas: 67 veces
Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- Bubu
- Atari 1040 STf
- Mensajes: 895
- Registrado: 04 Abr 2018, 23:10
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Atari 2600
- Primera consola: Nintendo GameBoy
- Gracias dadas: 21 veces
- Gracias recibidas: 67 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
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...
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...
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- Bubu
- Atari 1040 STf
- Mensajes: 895
- Registrado: 04 Abr 2018, 23:10
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Atari 2600
- Primera consola: Nintendo GameBoy
- Gracias dadas: 21 veces
- Gracias recibidas: 67 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
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.
En breva sus pongo la rutina cómo queda por si a alguién le es de interés.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- Bubu
- Atari 1040 STf
- Mensajes: 895
- Registrado: 04 Abr 2018, 23:10
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Atari 2600
- Primera consola: Nintendo GameBoy
- Gracias dadas: 21 veces
- Gracias recibidas: 67 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
He aquí la rutina:
Probado, y funciona perfestamente.
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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- Lenko
- Atari 1040 STf
- Mensajes: 831
- Registrado: 29 Mar 2005, 11:39
- Gracias dadas: 606 veces
- Gracias recibidas: 134 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
Puedes decir que lo has sacado gracias a la inestimable ayuda del foro 

- Bubu
- Atari 1040 STf
- Mensajes: 895
- Registrado: 04 Abr 2018, 23:10
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Atari 2600
- Primera consola: Nintendo GameBoy
- Gracias dadas: 21 veces
- Gracias recibidas: 67 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
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 

Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
Me gustan estos hilos donde el mismo que pregunta se responde a si mismo, es como cuando vas hablando solo por la calle... 

- explorer
- MSX Turbo R
- Mensajes: 442
- Registrado: 11 May 2014, 17:10
- Sistema Favorito: Atari ST
- primer_sistema: Atari 800XL/600XL
- consola_favorita: Atari 2600
- Primera consola: Atari 2600
- Ubicación: Valladolid, España
- Gracias dadas: 2 veces
- Gracias recibidas: 158 veces
- Contactar:
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
En Informática, a esto se le llama Método de depuración del patito de goma.
- Bubu
- Atari 1040 STf
- Mensajes: 895
- Registrado: 04 Abr 2018, 23:10
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Atari 2600
- Primera consola: Nintendo GameBoy
- Gracias dadas: 21 veces
- Gracias recibidas: 67 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
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
)
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

Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- GXY
- Amiga 1200
- Mensajes: 1540
- Registrado: 05 Oct 2013, 08:21
- Sistema Favorito: Commodore Amiga
- primer_sistema: Spectrum +2
- consola_favorita: Sony PlayStation 1
- Primera consola: Sony PlayStation 1
- Gracias dadas: 42 veces
- Gracias recibidas: 141 veces
Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
definitivamente, en desarrollo de software esta TODO estudiao xD
RetroPescando... 

¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados