В топе этой ветки выложена новая версия 0.64a.
------------------
v. 0.64a 01.30.2017
------------------
Изменено:
1. Отказался от умножения сдвигами при вычислении адресов битмапов. Перешёл на табличный обсчёт, пожертвовав 512 байт на BSS,
но доведя FPS субтайлового рендерера заднего плана до 16 (тайлмап и битмапы всё также - в банках).
2. Полностью устранил запрещёние прерываний при выводе субтайлов во время рендеринга заднего плана и при одновременном
переключении банков для воспроизведения SFX и саунд-трека.
Прерывания теперь запрещаются на очень короткий момент только при выводе оверлеев (тоже устранимо, но надо менять банк для тайлмапа оверлеев).
Пофикшено:
1. Race condition при выводе левой части субтайла (алгоритм в версии 0.63 рано или поздно начинал гадить в экран одним из макросов)
Добавлено:
1. Добавлено 2 новых системных шрифта опционально.
Причина - обнаружил на этих выходных race condition в одном из своих хитромудрых макросов по выводу полутайлов. Заодно пооптимизировал ей чуток . Всё-же, умножать на 66 сдвигами - это медленно, учитывая, что надо вычислять
64 * n + 2 * n + 2 = 2 * (32 * n + n + 1). Множить на 32 - это много-много сдвигов.
Перешёл на таблицы. Сначала был даже вариант, где SP использовался в виде РОН - хранил базовый адрес таблицы с адресами тайлов в банке, но потом и от этого отказался. Просто завёл 2 выровненных таблицы по 256 байт, получив 64 векторовских такта (с вэйтами) на загрузку (<E> на входе - индекс тайла):
Код:
xchg
mvi h,HIGH(TLE_ADR)
mov a,m
inr h
mov h,m
mov l,a
sphl ; points to 1st byte AFTER gap, so that ISR uses gap
pop b
Со сдвигами у меня не получалось быстрее 80 векторовских тактов на выборку.
Использовать <BC> или <HL> нельзя: регистр <BC> на входе кажет в предыдущий битмап (не всегда в его конец), в <HL> - координаты тайла в тайлмапе. Подумалось сейчас, что в общем-то <BC> можно использовать, если его после рендеринга тайла всегда выставлять на промежуток между битмапами, и использовать его как новую базу при вычислениях (от самого <BC> толку почти нет: 80е процы не ортогональны).
Посчитал статистику.
Для вывода выровненного на тайлы заднего плана, новый подход даёт 2097 тайлов в секунду (2-х битовый тайл 16x16), что для вьюпорта 13x10 тайлов занимает 186800 тактов (со всеми циклами, переключениями банков и т.д) и рендерит 16 FPS.
Для вывода субтайлового кадра получил 2054 тайла в секунду, 15.8 FPS. Но пришлось слегка замедлить, чтобы бежать с разрешёнными прерываниями когда нужно читать из середины битмапа. Вопрос, который jerri задал сам себе:
(а что делать если урезание будет).
Всё-же не хотелось запрещать прерывания нигде, и пришлось двигаться по битмапу ползком, т.е. стеком до нужного места.
Это сказалось: 2032.7 тайлов в секунду и 15.64 FPS.
Но зато весь вывод заднего плана теперь вообще происходит без запрещённых прерываний. При этом ISR ещё дополнительно переключает банки чтобы сыграть саунд-трек и/или звуковой эффект. Такая там чехарда стоит
Но в среднем задний план рендерится за 15.8 FPS так как субтайловые кадры чередуются с обычными при движении ГГ. По моим подсчётам, вывод таким методом c bank-switching ТОЛЬКО тайлов без подсчёта их координат, индексов, координат тайла в видео-памяти и зацикливания пока не выведен весь вьюпорт в теоретическом пределе позволяет рендерить таким алгоритмом до 18 FPS. На практике, конечно, надо двигаться и по видеопамяти вьюпорта и по тайлмапу, вычисляя тайловые индексы (2 кадра туда и уходит). Но в общем, практические 16 FPS - это совсем недурно для нашего неспешного Вектора, учитывая, что рендерер - субтайловый, и трюки со сравнением и перерисовкой только изменившихся тайлов тут не пройдут (они и так в роботах не пройдут потому, что поверх заднего плана "гадит" в видеопамять рендерер альфа-тайл - оверлеев).
Померил суммарную скорость роботов. Сейчас это что-то в районе 8.5 FPS. Силы уходят на обработку событий, отработку триггеров, модель повреждений, collision detection, проигрыватели SFX (немного) и sound track (много) в драйверах, вызываемых из ISR ну и на обновление всякой инфо-фигни на экране. Но, думаю, при наличии времени и уровне попроще, чем этот (45 триггеров, 54 события для 900 "движущихся" тайлов заднего плана плюс оверлеи), можно этот мультиплановый рендерер-ад ещё ускорить.
А пока-более-менее равномерный звук .