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
;--------------------------------------------------------------------