(на Timex вместо мультиколора просто задержка? иначе не хватит строк на NTSC - а есть ли эмулятор?)



вывод спрайтов 18x16 (сдвинутые = 24x16, 4 копии) в экран и линейные атрибуты:

большинство вычислений надо сделать вне обработчика прерываний. но надо атомарно (как минимум адрес экрана+адрес входа - этого можно добиться, если патчить адрес экрана прямо в процедуре)
если вычислений нет, то можно 8 спрайтов в верхнем бордере, даже с полной маской верхней строки
можно при этом даже спрайты в slowmem
        
Проблема с честными масками!!! как не накладывать атрибуты в пустых местах (хотя бы строках) спрайта? Считать, что платформы ходят по известному фону? А ползание???
в верхней двойной строке можно оставить атрибут фона? а как же волосы?
проще сделать заданную высоту спрайта
при сдвиге спрайта значительная часть крайних столбцов тоже должна быть без атрибутов??? [хранить вывод атрибутов для каждой фазы в виде процедур??? слишком жирно (4 фазы по X, 4 фазы по Y)]
выводить только 2 столбца атрибутов всегда? тогда фликеринг будет не на фоне, а на самом спрайте, кроме центра (активная ширина спрайта примерно 12 пикс, а сбоку по 2-6 пикс жирная маска:
X=-2: (2)+5+12(1 пикс.фликеринг слева)+5, X=0: 1+12+5+(6), X=2: 3+12+5+(4), X=4: 5+12(1 пикс.фликеринг справа)+5+(2))
то есть атрибуты могут требоваться 2 слева, а могут 2 справа
или в большинстве случаев ширина маски 3 (в Rick Dangerous II обводка 2 пикс, в первом 1 пикс, высота в первом 21 пикс, лёжа 15 пикс, включая маску) (S = место центра рисунка спрайта (без фликеринга), s = место края рисунка спрайта с фликерингом, M = место маски, когда спрайт шириной не уже S, иначе маску в байтах с ... надо сжимать?):
...MMMss SSSSSSSS SSssMMMM
......MM ssSSSSSS SSSSssMM
........ MMssSSSS SSSSSSss MM......
........ MMMMssSS SSSSSSSS ssMMM...
тут видно, что and+or требуется только на одном из краёв, в остальных местах ld или пропуск (для низких спрайтов)
как всё-таки ограничить высоту атрибутов (и пикселей?) для низких спрайтов, при постоянном времени? менять адрес входа и на выходе ставить паузу? тогда ld:ld надо отдельно, и появляется лишний jp (и лишний ld sp, если атрибуты общие для 4 фаз скролла?)). и надо гарантировать, что на входе в двойную строку первое данное читается из sp
чтобы не патчить jp, можно сделать стек.

удобно размещать процедуры вывода спрайтов по круглому адресу, а точки входа в них по HGT вычислять в LSB по таблице (умножение нельзя, т.к. где-то downhl)
а как размещать процедуры вывода атрибутов?

насколько можно увеличить высоту? 2 пикс высоты = 136+36 = 172/спрайт (1376 на 8 спрайтов) - это предел (дальше надо добавлять 3-й downhl8)
т.е. технически спрайты 18x18, размер процедуры = 18*11-1(последний inch)+2*9(downhl8)+3(ld:ret) = 218 b, можно добавить вычисление адреса атрибутов (+4 b) = +5t/спрайт (bc свободен, можно туда 2 константы для downhl8 (1 константа совпадает и с downhl8attr), тогда не +5, а -4t/спрайт)
если немного не хватит скорости, можно сделать зигзаг атрибутов (два набора процедур) = -32[+4(лишний inc l при рисовании с конца не нужен)]/спрайт
в крайнем случае заменить верхнюю строку спрайта на POPAr_LDr_APOPd?
можно ещё сделать отдельные входы для спрайтов разной высоты (в максимальной высоте вход прямо в процедуре) - много памяти, но выигрыш 12t/спрайт (похоже, всё равно придётся делать, т.к. всё равно нужна пауза в зависимости от высоты)
а для 128К желательно добавить pop af:out (c),a = +22/спрайт (out (0xfd),a = +21/спрайт), иначе не хватит памяти для графики взрывов (или взрывы рисовать вне прерывания?)





хотя фаз по X четыре, надо 2 разных выводилки по X *4 фазы по Y, итого 8
или делать симметричную медленную выводилку POPAORr_POPLDr_APOPORd_APOPORl_LDl_POPAORd = 176t/doubleline = (6+3+6 + 6+2+6 = 29) b/doubleline (можно будет делать дыры в спрайтах, с фликерингом фона или с подкраской этого места наиболее вероятным атрибутом - тогда атрибуты для каждой фазы по X рисовать отдельно)?
	inc h
	macro 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)

        
        
как атомарно пропатчить всю цепочку вызовов спрайтов и пауз с параметрами? сменой начального адреса стека
надо иметь triple buffering скриптов спрайтов



буфер экрана для восстановления - слишком жирно, а запоминать картинку под спрайтами медленно
восстановление фона, видимо, лучше перерисовкой тайлов под спрайтами - максимум 4*6 тайлов 16x16 (можно рисовать их не полностью, можно по столбцам)
оптимально восстановить 3 столбца высотой n и 3 столбца высотой 16-n
надо восстановить всегда 3*3 знакоместа (трудно оптимизировать по sprhgt)
если стирать атрибуты тут же (L общий), то атрибуты в неиспользованном столбце тоже восстанавливать - как сэкономить?

в стеке будут лежать готовые патчи, адреса и входы?

такой код не учитывает contention, а надо бы, т.к. восстановитель работает в строках 128..191
        ...
        ld (hl),c ;+7
        dec h
        ld (hl),b ;+23(18) (потеряно 5t)
        dec h
        pop bc
        ld (hl),c ;+47(44) (потеряно 3t)
        ...
максимальная потеря 4t/b * 8*(18*3+9*2) = 4*576 = 2304t
реально надо умножить на коэффициент 128/224: 1316.6t (потеря 6 строк)
четверть (1.5 строки) можно сэкономить, если attr в fastmem
пока непонятно, как можно улучшить, если не подгонять к 224t
теоретически можно сэкономить 1296t (6 строк), если не выводить лишний столбец атрибутов
на пустом знакоместе тоже можно сэкономить?

надо оптимизировать сумму времён: восстановитель + генератор скрипта для него

допустим, отдельно восстанавливаем столбцы графики, отдельно столбцы атрибутов (чтобы не восстанавливать лишний):
;можно сделать pop iy:pop ix каждый раз в атрибутах (итого прочитаем 3 раза), потом уже рисуем пиксели, а там не читаем каждый раз (но как тогда выйти???) - надо читать только ix??? или pop af:jr c:pop ix:pop iy? (но тогда надо что-то делать с add hl,de)
;но при входе в восстановитель следующего спрайта надо опять прочитать iy
;можно вообще без iy (приклеить) при высоте 18 - проигрыш по размеру явно менее чем в 2 раза


        
        
        

;удобства для спрайтов (чтобы удобнее составлять скрипт):
;- авторасчёт pg?
;- автопереход на процедуру (x&4)!=0? (она на 4t дольше)

;в графике спрайта можно положить фазу x и высоту (сейчас там только высота)
;чтобы перейти на нужный prspr, нужны фаза x, фаза y и высота
;допустим, переходим не по ret, а вычисляем:
        exx
         pop de ;нельзя портить de', bc
         ld a,d
         out (0xfd),a ;pg (надо 0b010xxxxx, иначе сработает 1ffd)
         ld a,e ;f(yphase)
        pop hl ;gfx
        pop de ;scr
        ld sp,hl
        pop hl ;l = f(hgt, x&4)
        ld h,a ;f(yphase)
        jp (hl)
        ...
        jp[x<4]/inc hl...inc l[x>=4]
        ...
        ex de,hl
;91 (было 70+4(nop/incl)) = +21 (17?)
;укладываемся в +22t/спрайт??? но мы добавили лишние операции на выходе!!! (было просто pop af:out (c),a:ret = 32, а стало 77-10(ld bc,7ffd)=67, т.е. >8.3t/спрайт лишних!)
;у нас на 128К остаётся только 121t на удобства 8 спрайтов = 14.8t/спрайт!!! можно выиграть 3*2*8 = 48t на attr=0xa300, остаётся 21t/спрайт +1t
;нельзя через 7ffd? нельзя авторасчёт pg?
;как выходить из списка? специально подготовленный псевдо-gfx с нужным адресом внутри





