Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM
Publicado: 06 Nov 2018, 22:40
Acabo de ver que en el motor NIRVANA+ hay una rutina parecida, pero especializada en pintar un bitmap 8×8 pero solo si está en una línea par.
Utiliza un par de trucos interesantes para hacerlo más corto.
Hay otra parte para mostrar teselas. Aquí no hay comprobaciones ya que se sabe que se pinta siempre en múltiplo de caracteres.
Utiliza un par de trucos interesantes para hacerlo más corto.
Código: Seleccionar todo
; draw bitmap lines
REPT 3
REPT 2
ld a, (hl) ; pintar los bytes 1 a 6
ld (de), a
inc hl ; siguiente byte
inc d ; siguiente línea (lo podemos hacer dos veces seguidas
; porque sabemos que empezamos en línea par)
ENDM
; ajuste de la dirección destino
; se hace cada dos líneas. Se puede haber incrementado el tercio
ld a, d ; ver si hemos pasado frontera de línea (scan)
and 7
jr nz, $+11 ; no. Ir al siguiente "lda a,(hl)"
ld a, e ; byte con la fila+columna
sub -32 ; le sumamos una fila más. C = 0 si la fila fue la última del tercio
ld e, a
sbc a, a ; A = A - A - C. A = $00 en caso de cambio de tercio. $FF en otro caso
and -8 ; A = A & $F8. A = $00 en caso de cambio de tercio. $F8 en otro caso
add a, d ; nuevo valor de tercio ajustado a uno menos si no hubo cambio de tercio
; D queda igual en caso de cambio de tercio (ya fue incrementado en el último "inc d")
ld d, a
ENDM
ld a, (hl) ; pintar el byte 7
ld (de), a
inc hl ; siguiente byte
inc d ; siguiente línea
ld a, (hl) ; pintar el byte 8
ld (de), a
Hay otra parte para mostrar teselas. Aquí no hay comprobaciones ya que se sabe que se pinta siempre en múltiplo de caracteres.
Código: Seleccionar todo
; draw bitmap lines
REPT 8
pop de
ld a, e
add a, b
ld e, a
ldi
ld a, (hl)
ld (de), a
inc hl
dec e
inc d
ldi
ldi
ENDM