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...
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...
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 (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).