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, 20:45

Mejor aun:

Código: Seleccionar todo

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

   nocarry:     
      ld l, a
      rr (hl)
      REPT 31     
         inc l
         rr (hl)
      ENDM
      inc h   ; Siguiente scanline de la última columna
      djnz loop     
     
      ret


Toma del frasco carrasco... :mrgreen:

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

Y tambien se puede quitar el "OR A" porque el AND tambien resetea el carry... :roll:

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

Mensajepor explorer » 09 Ago 2018, 21:08

Tengo ensamblador y desensamblador en mi Linux, pero no encuentro una manera de hacer depuración paso a paso, salvo montar algo con el Mess, pero me parece demasiado lioso.

Voy a probar con el sistema de desarrollo que está en https://www.asm80.com

¿Qué sistema de trabajo usan ustedes?

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, 21:28

Muy bueno, Namek, lo voy a catar ;)

explorer, yo para el Spectrum uso las siguientes herramientas para el desarrollo:

- Editor de textos : Notepad ++ (antes usaba PsPad)
- Compilador PASMO
- Emulador ZxSpin (trae un debugger muy bueno)
- Diseño gráfico : SevenuP
- Diseño sonoro : Beepola
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, 23:09

He estado catando el asm80 ese que dices, explorer, y aunque tiene una pinta ingreíble (encima todo es web, sin instalar nada), pero me resulta enfarragoso el pasar el código compilado al emulador que trae incorporado, y además las pulsaciones de teclas muchas veces no las detecta...
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 » 10 Ago 2018, 01:16

Bueno, he estado adaptando la pantalla original del Frogger a la resolución (256x192) y colores (8 colores, sin clash attribute) del Spectrum:

completo.png
completo.png (4.06 KiB) Visto 6953 veces


Ya sólo habría que escribir la rutina que rote a la izquierda, y aplicársela a esta pantalla. Concretamente tiene que mover 10 filas: 5 en el río y 5 en la carretera, jiji.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

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

Mensajepor explorer » 10 Ago 2018, 01:27

Si pones la directiva

.engine zxs

al principio del código, al pulsar F10 te carga el emulador de spectrum en la web, que reinicia y te carga el código y ya puedes ejecutarlo con un RANDOMIZE USR 40000

Lo que no me gusta... es que ese reinicio no es... limpio. Quiero decir que a veces tienes que hacer tú mismo un RESET y luego seleccionar tu código (a la izquierda) y ya se carga en el emulador.

Aquí está mi versión. Creo que he reducido un poco el bucle principal. El truco está en que guardamos en el registro E el valor del registro L, y así podemos "volver hacia atrás" de forma inmediata. También otro detalle es que la primera instrucción de rotación es en realidad de desplazamiento, por lo que siempre metemos un '0' en el bit más alto. Solo al final de la línea, al comprobar el valor del indicador C es cuando se lo ponemos (o no). Quizás no sea lo correcto porque podría verse algún parpadeo en pantalla. No lo sé.

El código está hecho para el asm80.com por si queréis probarlo. Se puede generar desde ahí la versión .sna y desde allí al emulador que queráis.

Código: Seleccionar todo

;--------------------------------------------------------------------

            .ENGINE zxs

                    ; [ 0 1 0 T T S S S ] - [ R R R C C C C C ]

VIDEO       =       $4000
TERCIO      =       1
FILA        =       4

INICIO      =       VIDEO | (TERCIO * 2^11) | (FILA * 2^5)

;--------------------------------------------------------------------

            .ORG    40000
            .ENT    $

;--------------------------------------------------------------------
; Relleno de pantalla

; tamaño del bloque a pintar
ANCHO       =       16
ALTO        =       8

        .BLOCK

                LD      b,ALTO
                LD      hl,INICIO | (16 - ANCHO/2)
LOOP0:
                PUSH    bc

                LD      de,hl
                INC     de
                LD      bc,ANCHO-1
                LD      a,$FE
                LD      (hl),a
                LDIR   

                INC     h
                LD      a,l
                SUB     ANCHO-1
                LD      l,a

                POP     bc
                DJNZ    LOOP0

        .ENDBLOCK

;--------------------------------------------------------------------
; Bucle

        .BLOCK

                LD      bc,$0200

LOOP1:             
                PUSH    bc
                CALL    ROT_RIGHT

; bucle de espera
                LD      bc,$0800
WAIT:
                DEC     c
                JR      nz,WAIT
                DJNZ    WAIT

                POP     bc
                DEC     c
                JR      nz,LOOP1
                DJNZ    LOOP1

                RET     

        .ENDBLOCK

;--------------------------------------------------------------------
; Desplazar a la derecha

        .BLOCK

@ROT_RIGHT:
                LD      hl,INICIO       ; comienzo del área a rotar
                LD      b,8             ; número de líneas a rotar
                LD      e,l             ; recordar número de fila (RRR), columna 0

LOOP_SCAN:         
                SRL     (hl)            ; desplazamos el primer byte
                                        ; desplazamos el resto de la fila
        .REPT   31
                INC     l
                RR      (hl)
        .ENDM

                LD      l,e             ; recuperamos fila, columna 0
                JR      nc,NEXT_SCAN    ; ver estado del último desplazamiento
                SET     7,(hl)          ; activar primer bit de la línea
NEXT_SCAN:         
                INC     h               ; Siguiente scanline
                DJNZ    LOOP_SCAN

                RET

        .ENDBLOCK

;--------------------------------------------------------------------

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 » 10 Ago 2018, 01:40

¡¡Bieeeennn!! Catado en la web asm80, y carbura perfestamente. Yo estoy intentando mover los coches, troncos y tortugas del Frogger, pero es que no encuentro la manera de que PASMO me cargue la pantalla en la VRAM y aluego compile el código en la dirección 40000 p.ej.
Seguiremos investigando...
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 » 10 Ago 2018, 23:12

Y siguiendo un poco con el divertimento este de hacer scroll lateral de una fila, ¿cómo plantaríais la situación de hacer scroll de 2 en 2 píxeles, y darle así el doble de velocidad? Yo creo que si hacemos

RR (HL)
RR (HL)
INC L


no vale, porque entonces perdemos el acarreo, y lo estaríamos inyectando por la izquierda sobre sí mismo. Quizás haya que hacer una paranoia de estas:

LD A, (HL)
AND %11
RRCA
RRCA

Aquí en A tenemos los 2 bits de la izquierda de la siguiente VRAM. Pero me parece que quizás esto sea más lento aún que con la rutina que hemos creado de scroll de píxel en píxel

¿nor? ¿cómo lo veis?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

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

Mensajepor explorer » 11 Ago 2018, 04:22

Ya que tienes la rutina de desplazar un bit, prueba a llamarla dos veces (sí, en serio).


Volver a “Programación”

¿Quién está conectado?

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