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
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 525
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: 12 veces
Gracias recibidas: 15 veces

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

Mensajepor Bubu » 09 Ago 2018, 00:35

¡Jarl, torpedos!

Es verano, y estamos (yo al menos) ávidos de divertimentos programativos, jiji. Es por ello que os propongo el siguiente pasatiempo: una rutina que coja una fila (8 scan lines) de la pantalla y la haga un scroll completo de un pixel en todo lo ancho de las 32 columnas, de tal manera que el píxel que se salga por el borde reaparezca por el borde contrario.
Para facilitar las cosas un poco, esa fila debe ser una fila exacta, es decir, dada la vídeomemoria como ya sabemos: 010TTSSS RRRCCCCC, se trataría de desplazar desde SSS=000 hasta SSS=111, por tanto, mantenemos constante TT y RRR.

¿Qué se os ocurre a priori? ¿Cuál sería la instrucción estrella del Z80 que haga el trabajo duro? Si queremos desplazar a la izquierda necesitaríamos un "shift" de tal manera que lo que se salga por desbordamiento se almacene en el acerreo y entonces en el siguiente "shift" sea inyectado.

La rutina debe ser ante todo rápida, no hace falta que ahorre memoria.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
explorer
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 222
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 recibidas: 48 veces
Contactar:

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

Mensajepor explorer » 09 Ago 2018, 00:57

¿Hay limitación de tamaño? ¿Puedo usar las 48 KB del Spectrum? ;-)

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 525
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: 12 veces
Gracias recibidas: 15 veces

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

Mensajepor Bubu » 09 Ago 2018, 01:09

aJajJAajaja, qué grande. Yo creo que en 100 ó 200 bytes lo podríamos hacer. He pensado que la instrucción rotadora podría ser la RL (HL), ¿nor?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1219
Registrado: 07 Nov 2009, 11:38
Ubicación: Madrid
Gracias dadas: 3 veces
Gracias recibidas: 96 veces

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

Mensajepor BlackHole » 09 Ago 2018, 02:01

Bubu escribió:dada la vídeomemoria como ya sabemos: 010TTSSS RRRCCCCC
¿Sabemos? No. Yo no sé qué quieres decir con esas letras.

Avatar de Usuario
explorer
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 222
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 recibidas: 48 veces
Contactar:

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

Mensajepor explorer » 09 Ago 2018, 03:09


Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 637
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 30 veces

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

Mensajepor Namek » 09 Ago 2018, 08:34

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

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
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
RR (HL)
INC HL
ADD IX,32
DJNZ LOOP

Saludos.

Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 637
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 30 veces

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

Mensajepor Namek » 09 Ago 2018, 08:56

Revisando se me ocurre una optimización que sería cambiar el INC HL por INC L y antes del DJNZ comprobar si L=0 para hacer un INC H.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 525
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: 12 veces
Gracias recibidas: 15 veces

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

Mensajepor Bubu » 09 Ago 2018, 09:43

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.


Bueno, voy a intentar catar esto, ahora sus cuenco.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 525
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: 12 veces
Gracias recibidas: 15 veces

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

Mensajepor Bubu » 09 Ago 2018, 11:23

Ya lo he catado. Te he optimizado la rutina, ahora no hace falta usar los registros IX (que son lentos):

Código: Seleccionar todo

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

   nocarry:      
      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

      rr (hl)      
      inc l
      rr (hl)
      inc l
      ; ... 32 veces
      
      inc h   ; Siguiente scanline de la última columna
      djnz loop      
      
      ret




Lo he catado y va folladísimo.
Última edición por Bubu el 09 Ago 2018, 11:47, editado 2 veces en total.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1219
Registrado: 07 Nov 2009, 11:38
Ubicación: Madrid
Gracias dadas: 3 veces
Gracias recibidas: 96 veces

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

Mensajepor BlackHole » 09 Ago 2018, 11:24

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


Volver a “Programación”

¿Quién está conectado?

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