Какая фиксированная задача поможет и в игре, и в скролле?
- предзаливка атрибутов? не нужна, хотя если поможет для линейности атрибутного буфера, то ОК - есть мультиколор 30x линейный, патч 32 строки в верхнем бордере; есть мультиколор 28x линейный без патча
- патч jp/ld sp мультиколора? нужен только для скролла
- отрисовка спрайтов? нужна только для игры
- опрос клавиатуры? бывают с вайтами только на скорпионе? при скролле можно не делать
- пиксельные сдвиги? нужно только для игры и нефиксировано
- ожидание порта 0xff? (на пентагоне нельзя, там надо совсем по-другому) какая точность привязки мультиколора тогда? можно ли самосинхронизировать?
- игровые таймеры
- обновление игровой панельки?
- [отрисовка тайлов? особо не нужно вообще, разве что чтобы блестело (в игре), но это можно партиклами вне прерывания]
- исправление фона под экраном (вместо клипирования)?

Похоже, придётся при скролле заменять отрисовку спрайтов на скролл, а стирание убрать

В Rick Dangerous скролл на несколько знакомест и неплавный.
В итоге проще всего не делать скроллинг привязанным к чему-то, а просто сдвигать, как сдвигается - только сдвигать пиксели одновременно с атрибутами.
при этом отрисовку-стирание спрайтов заблокировать (чтобы не терять 64 строки на стирание на каждом кадре), заранее отрисовать, а в конце стереть

Допустим, скроллим на 8 пикс
Нам надо сдвинуть при скролле 15*28*(8+4) = 5040 байт + допечатать полстроки тайлов

в GLUF ширина 24 знакоместа (высота тоже 16), а вместо спрайтов рисуются блоки, всего 5 штук (графика блоков учитывает графику фона - это явно не годится для Rick Dangerous)
т.е. у нас движок будет лучше
для скролла (ld..push) там нелинейные пиксели фонового экрана, и в 48К это не помещается
мы можем рисовать в экран (скроллить через pop..push), разницы особой не будет, только удобство обновления тайлов на экране (не надо будет для этого перерисовывать весь экран)

Во время скролла спрайты заменяются на процедуру скролла, восстановитель тоже отключается

Скролл частично в верхнем бордере (nowait)
а) ldi (16t/b) = 882 байта в верхнем бордере
б) pop:push
(вне бордера надо опасаться прерывания, точно рассчитать время! но тогда будет видно разрез! как его скрыть? псевдослучайно? или весь сдвиг на 8 знакомест расписать как последовательность перебросок и прерываний?)
(проблема в том, что процедура с автонастройкой юзается большими блоками, а их может поместиться только целое число - хорошо если 3 влезет)

другие методы исключены на 48К, уже занята память 0x8000..0xb561 + 5 сегментов внизу, а надо размещать спрайты (16K), тайлы (1K) и логику

сколько тактов на байт можно выжать из pop:push с автонастройкой?
ld sp,ix
pop af
pop bc
pop de
pop hl
exx
pop bc
pop de
pop hl ;84
ld sp,iy
push hl
push de
push bc
exx
push hl
push de
push bc
push af ;91 (досюда 20 байт, при hl<>ix, hl'<>iy будет 22 байта)
inc hx/???
inc hy/??? ;16
;min = 191t/14b > 13.6 t/b = 1034 байта в верхнем бордере (73 полустроки или 3 целых строки 8 пикс с атрибутами)

можно бесплатно заменить ix на hl, iy на hl', чтобы удобно было делать down hl/up hl и переход к атрибутам и обратно
нельзя down hl/up hl класть прямо в блок pop:push, надо в вызываторе

можно сделать такой блок кода (все inc и т.п. реально надо делать дважды: hl, hl'):
POPPUSH
inc h
POPPUSH
inc h
POPPUSH
inc h
POPPUSH
inc h
POPPUSH
inc h
POPPUSH
inc h
POPPUSH
inc h
POPPUSH
rrc h
POPPUSH ;attr
dec h
POPPUSH ;attr
dec h
POPPUSH ;attr
dec h
POPPUSH ;attr
ld a,l
add a,14
ld l,a
и обратно
итого 290 + 15+15 + 290 = 610 байт

вызывается как prspr (по крайней мере, первый вход):
        ld sp,hl
        exx
         pop bc <--------------- b=scroller/256
         ld a,c
         out (0xfd),a ;-1t
        pop hl ;gfx <------------ должно указывать на dw scroller
        pop de ;scr
        ld sp,hl
        pop hl ;l = f(hgt, x&4) <----------- scroller
         ld h,b ;f(yphase)
        jp (hl) ;f(yphase,sprhgt)
но для этого нет времени (3 полных строки не помещается!)

Ћбычный режим игры:
INT
выводим спрайты
мультиколор
AY
проверЯем, нужен ли скролл
восстанавливаем тайлы
логика
подмена адреса скрипта

€гра 25 фпс:
INT
выводим спрайты
мультиколор
AY
проверЯем, нужен ли скролл
восстанавливаем тайлы
логика
INT
выводим спрайты
мультиколор
AY
[проверЯем, нужен ли скролл] - не надо, т.к. логика не доделана?
восстанавливаем тайлы
логика
подмена адреса скрипта

TODO как выиграть времЯ и не восстанавливать тайлы, если логики много? тупо по флагу?


за 2 фрейма нельзЯ успеть сдвинуть на знакоместо и дорисовать знакоместо, поэтому цикл=3 фрейма:
или делать скролл по 4 пикс (сдвигатор вдвое меньше, в верхнем бордере вызовем его только 5 раз, в нижнем 10)
но 4 пикс тайлов всЮ равно долго выводить!
можно ли успеть в 2 фрейма с 2 пикс тайлов? (правда, будет видно луч, т.к. всЮ на грани, там нельзЯ будет смещать ничего)
на 128Љ можно было бы заранее сгенерить целый экран и его вдвигать, заодно убрать луч (2 экрана)

‘кролл (спрайты сейчас выведены):
...
проверЯем, нужен ли скролл
(нет восстановлениЯ тайлов)
(на пентагоне сейчас осталось 25088 - 1000(AY) - проверка тактов; скролл одной строки с вызовом = 14058/3 = 4686 (из них 70 = вызов+выход))
скролл 5 строк до конца кадра
подмена INT
  повторЯем, сколько раз надо сдвинуть {
инициализациЯ адресов, hl,hl'
INT
скролл 3 строк
мультиколор
AY
скролл 5 строк до конца кадра
инициализациЯ адресов, hl,hl'
INT
скролл 3 строк
мультиколор
AY
скролл 4 строк

подмена INT
INT

дорисовка строки (долго!!! не успеем до конца кадра!!!)
дорисовка спрайтов на строке???




  } повторЯем
(нет восстановлениЯ тайлов)
подмена INT
сдвиг тайловой карты
пересчЮт координат спрайтов, выкидывание лишних, добавление новых
логика
