Остается последний шаг, чтобы связать результаты анализа снизу (от экрана к набору) и сверху (от набора к экрану) - понять, как адреса из предэкрана + смещение попадают в экран . Так как для этого копирования используется адресация через нулевую страницу, точку остановки поставить нельзя, поэтому можно только поставить ее на запись в экран и просто искать в окрестностях чтение из предэкрана .
Этот кусок кода и есть функция- комбинатор . Она показывает связь между предэкраном и экраном . Новые важные переменные здесь $366 (x_shift_cycle) - насколько сдвигаться за один шаг цикла считывания, похоже на разницу между строками, то есть ширину всего уровня; xcoord - число повторов выборки, постоянно равно 5, от есть считывается по 4 тайла 5 раз = 20 раз - один столбец на экране. $A2-$A3 - пара ячеек, в которых написан изначальный индекс, от которого проводится измерение.
Разбираться откуда он берется пока не обязательно, можно посмотреть первый попавшийся и начать написание функции-комбинатора, которая будет делать то же самое, что и приведенный выше кусок кода на ассемблере.
Шаг 0x0B.
Реализация комбинатора на питоне:
Набор данных можно выхватить прямо из дампа памяти:
Дальше можно проверить отрисовку и убедиться, нарисовалась полоса уровня высотой в 20 клеток.
Шаг 0x0C.
Экспериментируя с параметрами A2A3 и значением vertCount можно получать разные срезы уровня, например, такой:
По нему можно прикинуть, откуда начинается мусор, и как конец уровня связан с началом по высоте и вычислить правильное значение A2A3 соответствуюшее началу уровня (и в итоге заметить, что оно на 1 меньше, чем адрес в $47-$48 (это первое значение из набора ), то есть равно первому значению и набора - 1).
Также можно обратить внимание, что рядом с шириной уровня ($366) в ячейке $367 лежит и его ширина).
Тогда можно вывести полную схему работы комбинатора:
и написать универсальную функцию рисования:
(уровень определяется - дампом памяти, набором адресов, размерами (ширина и высота) и картой тайлов).
Этой функцией можно нарисовать любой уровень: Уровень 1. Уровень 2. Уровень 3. Уровень 4. Уровень 5. Уровень 6. Уровень 7. Уровень 8. Уровень 9. Уровень 10. Код скрипта (использовался больше в интерактивном режиме)