Utiliza un par de trucos interesantes para hacerlo más corto.
Código: Seleccionar todo
; draw bitmap lines
REPT 3 ; repetimos 3 veces
REPT 2 ; repetimos 2 veces
ld a, (hl) ; un byte del sprite
ld (de), a ; a pantalla
inc hl ; siguiente byte del sprite
inc d ; un scanline más abajo (010TTSSS)
ENDM
; Ajuste de la dirección en pantalla
; Se hace cada dos bytes pintados
ld a, d ; ver si hemos pasado de fila
and 7 ; valor del scanline
jr nz, $+11 ; aún no es 0. Ir al siguiente "ld a, (hl)"
; Hemos terminado la fila, pasamos a la siguiente
ld a, e ; el byte bajo de la dirección contiene el número
; de fila y el número de columna: RRRCCCCCC
sub -32 ; bajamos una fila
; esta sentencia equivale a "sub 224"
; Si fC es 0, estamos en fila 1 del tercio
; Si fC es 1, aún estamos dentro del tercio
ld e, a ; actualizamos valor de fila
; Explicación:
; Si ha ocurrido un cambio de tercio, el registro d YA fue actualizado
; con la última instrucción "inc d", por lo tanto NO hay que ajustar nada.
; Usamos el flag C para ajustar el valor de d.
; Sólo tenemos que reducir el valor de d en caso de que AÚN estemos dentro del tercio.
; Ajuste del número de tercio
sbc a, a ; A := A - A - fC
; A = $00 en caso de cambio de tercio
; A = $FF en los demás casos
and -8 ; A := A & $F8
; A = $00 en caso de cambio de tercio
; A = $F8 en otro caso (-8)
add a, d ; D := A + D
; D = D, en caso de cambio de tercio
; (fue cambiado antes, en el "inc d")
; D = D - 8, si no hubo cambio de tercio
; (deshacer el estropicio del "inc d")
ld d, a ; actualizamos valor de tercio
ENDM
; Repetimos para un total de 2x3 bytes
; Pintado del byte 7
ld a, (hl) ; pintar el byte 7
ld (de), a
inc hl ; siguiente byte
inc d ; siguiente scanline
; Pintado del byte 8
ld a, (hl) ; pintar el byte 8
ld (de), a
; Fin, no hace falta incrementar nada más
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


