Написал процедуру вывода спрайта в линейный буфер, возможно кто-нибудь предложит вариант оптимизации по скорости выполнения
Процедура состоит из 8 почти идентичных блоков, различие в величине смещения. Все показывать смысла нет, вот самый медленный кусок, смещение = 4
Код:
;смещение 4
;HL - адрес в буфере экрана vscreen
;DE - данные спрайта [байт маски, байт данных]
;B - ширина спрайта в символах
;C - высота спрайта в пикселях
;vscreen.len - ширина строки в буфере экрана
drw_sprite_sm4 ld a,b
ld (drw_sprite_sm4_loop1+1),a
neg
add a,vscreen.len
ld (drw_sprite_sm4_offsetx+1),a
ld a,c
exx
ld c,a
exx
drw_sprite_sm4_loop1 ld a,0
ld bc,#ff00
drw_sprite_sm4_loop2 exa
ld a,(de)
inc de
dup 4
rr b
rra
edup
rr b
and (hl)
ld (hl),a
ld a,b
dup 4
rrca
edup
ld b,a
ld a,(de)
inc de
dup 4
rr c
rra
edup
rr c
or (hl)
ld (hl),a
ld a,c
dup 4
rrca
edup
ld c,a
inc hl
exa
dec a
jp nz,drw_sprite_sm4_loop2
ld a,b
dup 4
rrca
edup
or #0f
ld b,a
ld a,c
dup 4
rrca
edup
and #f0
ld c,a
ld a,(hl)
and b
or c
ld (hl),a
drw_sprite_sm4_offsetx ld a,0
add a,l
ld l,a
jp nc,$+4
inc h
exx
dec c
exx
jp nz,drw_sprite_sm4_loop1
ret