FYI, Jerri удалось максимально оптимизировать вывод спрайтов любой ширины, со сдвигом от 1 до 7, через таблицу длинной 3584 (#0e00) байт.
Инициализация таблицы смещений:
Код:
init_offset_tab ld hl,offset_tab
ld b,1
init_offset_tab_1 push bc
ld d,l,e,0
init_offset_tab_2 srl d
rr e
djnz init_offset_tab_2
ld (hl),d
inc h
ld (hl),e
dec h
inc l
pop bc
jr nz,init_offset_tab_1
inc h,h,b
ld a,b
cp 8
jr nz,init_offset_tab_1
ret
Вывод одного байта с маской:
Код:
HL = адрес на экране
HL' = адрес спрайта
D' = старший байт адреса таблицы смещений offset_tab
BC' = данные предыдущего байта (в начале каждой линии нужно обнулять)
ld a,(hl)
exx
or c
xor b
ld e,(hl)
inc hl ;в частном случае можно inc l
ld b,(hl)
inc hl ;в частном случае можно inc l
ex de,hl
or (hl)
inc h
ld c,(hl)
ld l,b
ld b,(hl)
dec h
xor (hl)
ex de,hl
exx
ld (hl),a
В конце линии нужно вывести остатки из BC'
ld a,(hl)
exx
or c
xor b
exx
ld (hl),a
Итого: 104 такта на один байт с маской (100 тактов в частном случае).