Дизасм Saboteur оформлен в виде компилируемого файла, собирается с помощью pasmo в такой же точно бинарный файл как снятый после загрузки игры образ памяти.
Объём кода -- 10K строк.
https://github.com/nzeemin/spectrum-saboteur1-rev
Вид для печати
Дизасм Saboteur оформлен в виде компилируемого файла, собирается с помощью pasmo в такой же точно бинарный файл как снятый после загрузки игры образ памяти.
Объём кода -- 10K строк.
https://github.com/nzeemin/spectrum-saboteur1-rev
Некоторые детали, найденные по ходу дизасма.
Ошибку нашёл пока только одну:
B751 LD B,$23 35 objects - BUG: actually, 29 objects
Здесь перебираются объекты по таблице D34D, всего их там 29, но в цикле стоит счётчик на 35. В оригинале ошибка не проявляется, потому что сразу после таблицы идут спрайты (блоки тайлов). При переборе строк таблицы сначала идёт сравнение первых двух байт на номер текущей комнаты. В данных спрайта конечно такого совпадения нет. При конвертации на кода игры УКНЦ я поставил сразу за этой таблицей другую, DE84, в которой тоже перечисляются комнаты, получил артефакт на первой же комнате с собакой.
Неиспользуемые блоки данных:
7361 -- "room token", процедура которая вызывается из обработки последовательности токенов, для подготовки комнаты в виде набора тайловых мапов. Процедура 7361 не входит в список токенов, но по виду это явно "room token". По действию, она рисует рамку вокруг игрового поля. Рисование рамки было переделано в RLE последовательность, этот токен стал не нужен, но процедура осталась. (Дополнение: Косвенно, это говорит о том, что видимо, изначально рамка была частью игрового поля, но потом автор понял, что незачем держать эти статичные данные, и игровое поле стало меньше на 1 тайл с каждой стороны.)
A13D -- неиспользуемая процедура инициализации комнаты, в этой комнате есть охранник.
A17E -- неиспользуемая процедура инициализации комнаты, в этой комнате есть "turret gun".
B437 -- неиспользуемая процедура инициализации комнаты, в этой комнате есть собака и охранник.
Возможно, планировалось сделать на несколько комнат больше, но мы не знаем на сколько именно больше (процедуры инициализации нужны только для комнат с чем-то подвижным внутри).
Кран (спрайт F98F) в комнате 84A8 статичен, но не входит в последовательность комнаты (так сделаны другие подобные блоки), а вписывается отдельно в процедуре инициализации. Возможно, автор хотел сделать его подвижным, или, например, крюк мог быть в разном положении в зависимости от триггера.
На основе реверса кода игры для ZX Spectrum, сделана конверсия (порт) игры на УКНЦ -- см. тему https://zx-pk.ru/threads/36396-sabot...lya-uknts.html