Вектор-06Ц/Вывод спрайта

Материал из Emuverse
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

(Права на описание — Emuverse, права на фрагменты кода — см. в шапке фрагмента.)

Вывод спрайта с маской

https://zx-pk.ru/threads/29144-programmirovanie-na-assemblere.html?p=1163800&viewfull=1#post1163800

Один план, с использованием стека:

; by ivagor
;SP - маска, байт спрайта, маска, байт спрайта, ...
;HL - VRAM
		pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
;12+8+4+4+8+8=44 такта/байт

Один план, без использования стека:

; by ivagor
;HL - маска, байт спрайта, маска, байт спрайта, ...
;DE - VRAM
		ldax d\ ana m\ inx h\ ora m\ inx h\ stax d\ dcr e
;8+8+8+8+8+8+8=56 тактов/байт

https://zx-pk.ru/threads/29144-programmirovanie-na-assemblere.html?p=1163804&viewfull=1#post1163804

Один битплан, маска и пиксели отдельно — можно использовать для нескольких битпланов, каждый раз возвращая маску на начало:

; by ivagor
;HL - маска
;DE - спрайт
;BC - VRAM
		ldax b\ ana m\ inx h\ xchg\ ora m\ inx h\ xchg\ stax b\ dcr c
;8+8+8+4+8+8+4+8+8=64 такта/байт

В два битплана стеком:

; by ivagor
;SP - маска, байт спрайта, байт спрайта, маска, байт спрайта, байт спрайта, ...
;HL и DE - VRAM
;начало
		pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
		ldax d\ ana c\ pop b\ ora c\ stax d\ dcr e
;установившийся режим
		dcx sp\ pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
		ldax d\ ana c\ pop b\ ora c\ stax d\ dcr e
;(12+12+8+4+4+8+8)+(8+4+12+4+8+8)=100 тактов/2 байта=50 тактов/байт

https://zx-pk.ru/threads/29144-programmirovanie-na-assemblere.html?p=1163822&viewfull=1#post1163822

В два битплана стеком, совместимо с методом Медноногова:

; by ivagor
;SP - маска, байт спрайта, байт спрайта, маска, байт спрайта, байт спрайта, ...
;HL и DE - VRAM
		pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
		ldax d\ ana c\ pop b\ ora c\ stax d\ dcr e
;12+8+4+4+8+8+8+4+12+4+8+8=88 тактов
		mov a,b\ sta $+10\ ana m\ pop b\ ora c\ mov m,a\ dcr l
		ldax d\ ani 0\ ora b\ stax d\ dcr e
;8+16+8+12+4+8+8+8+8+4+8+8=100 тактов
;(88+100)/4=47 тактов/байт