Cómo hacer scroll de una fila completa en Zx Spectrum

Foro dedicado a la programación en todo tipo de sistemas clásicos.
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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor Namek » 09 Ago 2018, 12:52

Bubu escribió:Buenas, Namek, algunas cuestiones:

- lo primero es que tú haces LD B, 64 para hacer un scroll de 64 scanlines, ¿nor? pero recuerda que es sólo para 8 scanlines, ya que si lo haces de 64, que son 8 filas, pudiera pasar que estuvieras trabajando en 2 tercios diferentes de la pantalla, y ya no te serviría el INC H continuo. Con sólo 8 scanlines nos aseguramos que estamos siempre dentro del mismo tericio.

- ¿para qué es el OR A que haces justo antes del BIT 0,(IX+31)?

- y por lo que veo tu idea es la de ver si el último píxel está ON, y actualizar el valor del acarreo con ese bit para que al hacer el scroll entre por el lado contrario, ¿nor? La verdad es que es buena indea.


Fallo mio entendí el primer tercio completo de pantalla por eso el LD B,64.

El "OR A" es para poner el carry a 0.

Saludos.

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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor Namek » 09 Ago 2018, 13:03

A ver si estoy en un error o no, pero creo que esto:

push af ; Grabo el flag de acarreo
ld a, l
and %00000 ; Vuelvo a la primera columna
ld l, a
pop af ; Recupero el flag de accarreo

Se puede sustituir por:

LD L,0

O no? :roll:

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 398
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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor explorer » 09 Ago 2018, 14:39

BlackHole escribió:
Justamente por eso no participé en ese hilo. Nadie en el mundo de Spectrum denomina así la memoria de pantalla.

Y, ¿cómo lo hace, entonces?

Lo pregunto porque yo no soy programador ni de z80 ni de Spectrum.

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 398
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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor explorer » 09 Ago 2018, 14:57

Namek escribió:De cabeza y sin probarlo, a ver si no he metido la pata en algo:

Código: Seleccionar todo

                LD HL,16384
                LD IX,16384
                LD B,64
LOOP:
                OR A
                BIT 0,(IX+31)
                JR Z,NOCARRY
                SCF
NOCARRY:
                RR (HL)
                INC HL
                (32 veces)
....

Pero, ¿no usáis un macroensamblador? ¿No tenéis alguna sentencia para no tener que escribir 32 veces el mismo código? Algo como

Código: Seleccionar todo

                REP 32
                RR (HL)
                INC HL
                ENDREP

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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor Bubu » 09 Ago 2018, 16:54

Namek escribió:El "OR A" es para poner el carry a 0.
Saludos.


OK, perfect, yo lo hacía con:

Código: Seleccionar todo

scf
ccf


pero OR A es más efectivo, nos ahorramos algún ciclo ;)



Namek escribió:A ver si estoy en un error o no, pero creo que esto:

push af ; Grabo el flag de acarreo
ld a, l
and %00000 ; Vuelvo a la primera columna
ld l, a
pop af ; Recupero el flag de accarreo

Se puede sustituir por:

LD L,0

O no? :roll:


Nop, lo que hago con el AND %00000 es borrar los 5 bits de menos peso del registro L, que en la VRAM sirve para moverse a la columna 0 de la pantalla, estés en la fila que estés. Si hago LD L, 0, me voy a la columna 0 pero también a la fila 0 (del tercio en el que esté indicado en H).



explorer escribió:Pero, ¿no usáis un macroensamblador? ¿No tenéis alguna sentencia para no tener que escribir 32 veces el mismo código? Algo como

Código: Seleccionar todo

                REP 32
                RR (HL)
                INC HL
                ENDREP


Es verdura, lo que pasa es que esas instrucciones REP y ENDREP ya dependen del ensamblador en sí, pero vaya, que ahora mismo lo modifico porque así está mucho más limpio ;)
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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor Bubu » 09 Ago 2018, 17:39

Bueno, pues con los últimos cambios proponidos por vos, así va quedando la cosa:

Código: Seleccionar todo

rot_right:
      
      ld hl, 16384 + 31   ; Última columna
      ld b, 8
   loop:
      or a ; Pone el flag de accarreo a 0
      bit 0, (hl)   ; Compruebo el último píxel
      jr z,nocarry
      scf

   nocarry:      
      push af      ; Grabo el flag de acarreo
      ld a, l
      and %11100000   ; Vuelvo a la primera columna
      ld l, a
      pop af      ; Recupero el flag de accarreo      
      rr (hl)
      REPT 31      
         inc l
         rr (hl)
      ENDM
      inc h   ; Siguiente scanline de la última columna
      djnz loop      
      
      ret




Lo que me saca un poco de quicio es la parte que he incorporado yo de volver a la primera columna, eso de tener que grabar el acarreo con PUSH y luego recuperarlo con POP, creo que es mejorable, a ver si le pego una pensada...
Última edición por Bubu el 09 Ago 2018, 18:25, editado 1 vez en total.
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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor Bubu » 09 Ago 2018, 18:24

Uy, Namek, tenías razón con lo del LD L, 0, es que quise decir:

and %11100000


jiji, se me olvidó poner la máscara de los 1's

Thanx!
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 398
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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor explorer » 09 Ago 2018, 18:33

Una pregunta... ¿Cómo son los datos a desplazar?

Quiero decir si es un decorado, o da igual, haya lo que haya.

Estoy pensando que se podría acelerar un poco el desplazamiento, mirando antes qué es lo que hay que desplazar.

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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor Bubu » 09 Ago 2018, 19:52

Pues en principio sería una rutina genérica desplazar con rotación filas completas, p.ej. se podría usar para el Frogger:


Imagen

Este juego lo implementé cuando yo era joven en el Spectrum pero usé la técnica de las imágenes pre-desplazadas (scroll en tiempo de desarrollo), y ahora se podría ir viendo cómo quedaría con scroll en tiempo de ejecución. Es lo que se me ocurre...
Acabo de probar esta rutina moviendo 5 bloques de 2 filas cada una, y va bastante bien. Téngase en cuén que en el Frogger no todas las filass van a la misma velocidad, hay filas que hay que esperan un tiempo para desplazarse un píxel. No sé si coñoces el juego...
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: Cómo hacer scroll de una fila completa en Zx Spectrum

Mensajepor Namek » 09 Ago 2018, 20:29

Bubu escribió:Uy, Namek, tenías razón con lo del LD L, 0, es que quise decir:

and %11100000


jiji, se me olvidó poner la máscara de los 1's

Thanx!


Pues ahora se me ocurre que si usas EX AF,AF' en lugar de PUSH AF y POP AF tambien es mas rapido... :mrgreen:


Volver a “Programación”

¿Quién está conectado?

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