Код:
macro GOPRSPR
ld sp,hl
exx
if FULL7FFD
pop de ;нельзя портить de', bc
out (c),e ;pg
ld a,d ;f(yphase)
else
pop bc
ld a,c
out (0xfd),a ;-1t
endif
pop hl ;gfx
pop de ;scr
ld sp,hl
pop hl ;l = f(hgt, x&4)
if FULL7FFD
ld h,a ;f(yphase)
else
ld h,b ;f(yphase)
endif
jp (hl) ;f(yphase,sprhgt) ;для sprhgt=18 переход сразу на отрисовщик (x4) или на jp (x0), иначе на задержку
endm
macro PRSPREND
exx
add hl,de
GOPRSPR
endm
;вывод графики и атрибутов одновременно (по идее выигрыш 10(ret)+2*31(downhl8attr) = 72, т.е. можно раздуть на 8 тактов на двойную строку)
;входим с разных мест, получаем разную высоту спрайта при заданном yend = f(yphase, sprhgt)
;для нечётных yphase downhl8 оказывается в другом месте зигзага (т.к. графика спрайта одна на оба варианта)
macro SPR2LINES0_x0 ;28b
;выводим строку 0
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld a,(hl)
and d
or e
ld (hl),a
inc h
;выводим строку 1
pop de
ld a,(hl)
and d
or e
ld (hl),a
dec l
pop de
ld (hl),e
dec l
ld (hl),d
rrc h ;было h0=1, результат 0xa0+ ;+4t
;выводим атрибуты строк 0-1
pop de
ld (hl),e ;attr
inc l
ld (hl),d ;attr
inc h
endm ;172t
macro SPR2LINES1_x0 ;28b
;выводим атрибуты строк 2-3
pop de
ld (hl),e ;attr
dec l
ld (hl),d ;attr
sla h ;+4t
;выводим строку 2
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld a,(hl)
and d
or e
ld (hl),a
inc h
;выводим строку 3
pop de
ld a,(hl)
and d
or e
ld (hl),a
dec l
pop de
ld (hl),e
dec l
ld (hl),d
inc h
endm ;172t
macro SPR2LINES0_x4 ;28b
;выводим строку 0
pop de
ld (hl),e
dec l
ld (hl),d
dec l
pop de
ld a,(hl)
and d
or e
ld (hl),a
inc h
;выводим строку 1
pop de
ld a,(hl)
and d
or e
ld (hl),a
inc l
pop de
ld (hl),e
inc l
ld (hl),d
rrc h ;было h0=1, результат 0xa0+ ;+4t
;выводим атрибуты строк 0-1
pop de
ld (hl),e ;attr
dec l
ld (hl),d ;attr
inc h
endm
macro SPR2LINES1_x4 ;28b
;выводим атрибуты строк 2-3
pop de
ld (hl),e ;attr
inc l
ld (hl),d ;attr
sla h ;+4t
;выводим строку 2
pop de
ld (hl),e
dec l
ld (hl),d
dec l
pop de
ld a,(hl)
and d
or e
ld (hl),a
inc h
;выводим строку 3
pop de
ld a,(hl)
and d
or e
ld (hl),a
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc h
endm
;DOWNHL требует лишний inc h по сравнению с UPHL
;но при выводе вверх не получится rrc h для перехода к атрибутам
macro DOWNHL8_AFTERLINES1
ld a,l
sub -32
ld l,a ;NC=next third
sbc a,a
and -8
add a,h
ld h,a ;-8/+0
endm ;38t (+34 по сравнению с inc h)
macro DOWNHL8_AFTERLINES0
ld a,l
sub -32
ld l,a ;NC=next third
sbc a,a
and -4
add a,h
ld h,a ;-4/+0
endm ;38t (+34 по сравнению с inc h)
;b свободен, т.к. присвоить его = +7t, а выигрыш на его использовании только -6t
;можно освободить c=-32 (+6t), тогда out (c),e вместо ld a,e:out (0xfd),a (-3t)
;если чередовать столбцы: gfx,attr,gfx,attr,gfx, то можно сэкономить в генераторе на двукратном чтении тайлов, а тут на одном add hl,hl
;в восстановителе A используется только в downhl8, uphl8attr
macro RESPR2LINES
pop de
ld (hl),e
inc h
ld (hl),d
inc h
endm
macro RESPR_DOWNHL8
ld a,l
sub -32
ld l,a ;NC=next third
sbc a,a
and -8
add a,h
ld h,a ;-8/+0
endm ;38t (+34 по сравнению с inc h)
macro RESPR2LINESATTR
pop de
ld (hl),e
dec h
ld (hl),d
dec h
endm
macro RESPR1LINEATTR
pop de
ld (hl),d
dec h
endm
macro RESPR_UPHL8ATTR
org $-1
ld a,l
sub 32
ld l,a ;CY=previous third
sbc a,a ;0 = this third, ff = previous third
or 3 ;+3 = this third, -1 = previous third
add a,h
ld h,a ;+3/-1
endm