¡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.
Cómo hacer scroll de una fila completa en Zx Spectrum
- 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
Cómo hacer scroll de una fila completa en Zx Spectrum
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
- explorer
- MSX Turbo R
- Mensajes: 443
- 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: 162 veces
- Contactar:
Re: Cómo hacer scroll de una fila completa en Zx Spectrum
¿Hay limitación de tamaño? ¿Puedo usar las 48 KB del Spectrum? 

- 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: Cómo hacer scroll de una fila completa en Zx Spectrum
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!!
-
- Amiga 1200
- Mensajes: 1489
- Registrado: 07 Nov 2009, 11:38
- Sistema Favorito: C64
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Nintendo SNES
- Primera consola: Nintendo SNES
- Ubicación: Madrid
- Gracias dadas: 14 veces
- Gracias recibidas: 244 veces
Re: Cómo hacer scroll de una fila completa en Zx Spectrum
¿Sabemos? No. Yo no sé qué quieres decir con esas letras.Bubu escribió:dada la vídeomemoria como ya sabemos: 010TTSSS RRRCCCCC
- Namek
- Atari 1040 STf
- Mensajes: 840
- 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
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.
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.
- Namek
- Atari 1040 STf
- Mensajes: 840
- 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
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.
- 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: Cómo hacer scroll de una fila completa en Zx Spectrum
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.
- 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!!
- 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: Cómo hacer scroll de una fila completa en Zx Spectrum
Ya lo he catado. Te he optimizado la rutina, ahora no hace falta usar los registros IX (que son lentos):
Lo he catado y va folladísimo.
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!!
-
- Amiga 1200
- Mensajes: 1489
- Registrado: 07 Nov 2009, 11:38
- Sistema Favorito: C64
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Nintendo SNES
- Primera consola: Nintendo SNES
- Ubicación: Madrid
- Gracias dadas: 14 veces
- Gracias recibidas: 244 veces
Re: Cómo hacer scroll de una fila completa en Zx Spectrum
Justamente por eso no participé en ese hilo. Nadie en el mundo de Spectrum denomina así la memoria de pantalla.explorer escribió:Mira aquí: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados