Página 3 de 7

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

Publicado: 09 Ago 2018, 20:45
por Namek
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:

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

Publicado: 09 Ago 2018, 20:50
por Namek
Y tambien se puede quitar el "OR A" porque el AND tambien resetea el carry... :roll:

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

Publicado: 09 Ago 2018, 21:08
por explorer
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?

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

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

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

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

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

Publicado: 10 Ago 2018, 01:16
por Bubu
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 7237 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.

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

Publicado: 10 Ago 2018, 01:27
por explorer
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

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

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

Publicado: 10 Ago 2018, 01:40
por Bubu
¡¡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...

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

Publicado: 10 Ago 2018, 23:12
por Bubu
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?

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

Publicado: 11 Ago 2018, 04:22
por explorer
Ya que tienes la rutina de desplazar un bit, prueba a llamarla dos veces (sí, en serio).