При известном количестве плоскостей можно сэкономить ещё около 8 тысяч CPU states на полный экран. Зааттачил рендерер для 2х плоскостей. Вроде шустро, но всё равно есть visual glitches при скроллинге. Будем всё-ж делать framebuffer.
StkMvUp Macro _rp
IFIDN <'&_rp'>,<'d'>
pop d
mov m,e
inr l
mov m,d
ELSE
pop b
mov m,c
inr l
mov m,b
ENDIF
EndM
StkMvDn Macro _rp
IFIDN <'&_rp'>,<'d'>
pop d
mov m,e
dcr l
mov m,d
ELSE
pop b
mov m,c
dcr l
mov m,b
ENDIF
EndM
SpMvUp Macro _rp,_count
Rept (_count SHR 1) - 1
StkMvUp _rp
inr l
EndM
StkMvUp _rp
EndM
SpMvDn Macro _rp,_count
Rept (_count SHR 1) - 1
StkMvDn _rp
dcr l
EndM
StkMvDn _rp
EndM
CSEG
PUBLIC Spt216
; Non-reentrable
; Needs disabled interrupts
; <HL> - sprite address
; <DE> - screen address
Spt216: shld ldSpr+1
lxi h,0
dad sp
xchg ; <HL> - screen address, <DE> - return address
ldSpr: lxi sp,0
sp16lp: SpMvUp b,16
inr h
SpMvDn b,16
mov a,h
adi 20h
mov h,a
SpMvUp b,16
dcr h
SpMvDn b,16
xchg
sphl
ret
End