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

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

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

Mensajepor Bubu » 09 Jul 2018, 12:38

¡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?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

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

Mensajepor Bubu » 09 Jul 2018, 15:37

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...
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

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

Mensajepor Bubu » 09 Jul 2018, 16:14

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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

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

Mensajepor Bubu » 09 Jul 2018, 16:29

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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Lenko
Atari 1040 STf
Atari 1040 STf
Mensajes: 797
Registrado: 29 Mar 2005, 11:39
Gracias dadas: 440 veces
Gracias recibidas: 92 veces

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

Mensajepor Lenko » 09 Jul 2018, 17:45

Puedes decir que lo has sacado gracias a la inestimable ayuda del foro :D

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

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

Mensajepor Bubu » 09 Jul 2018, 21:32

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
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
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

Mensajepor Namek » 10 Jul 2018, 16:40

Me gustan estos hilos donde el mismo que pregunta se responde a si mismo, es como cuando vas hablando solo por la calle... :mrgreen:

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 396
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: 138 veces
Contactar:

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

Mensajepor explorer » 10 Jul 2018, 17:07

En Informática, a esto se le llama Método de depuración del patito de goma.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

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

Mensajepor Bubu » 10 Jul 2018, 19:05

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 )
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
GXY
Amiga 1200
Amiga 1200
Mensajes: 1445
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: 36 veces
Gracias recibidas: 119 veces

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

Mensajepor GXY » 11 Jul 2018, 01:46

definitivamente, en desarrollo de software esta TODO estudiao xD
RetroPescando... :mrgreen:


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados