Página 1 de 7

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

Publicado: 09 Ago 2018, 00:35
por Bubu
¡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.

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

Publicado: 09 Ago 2018, 00:57
por explorer
¿Hay limitación de tamaño? ¿Puedo usar las 48 KB del Spectrum? ;-)

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

Publicado: 09 Ago 2018, 01:09
por Bubu
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?

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

Publicado: 09 Ago 2018, 02:01
por BlackHole
Bubu escribió:dada la vídeomemoria como ya sabemos: 010TTSSS RRRCCCCC
¿Sabemos? No. Yo no sé qué quieres decir con esas letras.

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

Publicado: 09 Ago 2018, 03:09
por explorer

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

Publicado: 09 Ago 2018, 08:34
por Namek
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.

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

Publicado: 09 Ago 2018, 08:56
por Namek
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.

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

Publicado: 09 Ago 2018, 09:43
por Bubu
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.

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

Publicado: 09 Ago 2018, 11:23
por Bubu
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.

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

Publicado: 09 Ago 2018, 11:24
por BlackHole
Justamente por eso no participé en ese hilo. Nadie en el mundo de Spectrum denomina así la memoria de pantalla.