        macro GOPRSPR
        ld sp,hl
        exx
         if FULL7FFD
         pop de ;нельзя портить de', bc
         ld bc,0x7ffd ;FIX
         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
        
