Spiiin's blog

Nes hacking build tool

На основе конфигов Ti_ научился вставлять в ROM игры ассемблированные кусочки кода.

В качестве базового исходника можно копировать куски реверсированного кода из IDA.

Ассемблер 6502 Asm6.

Для сборки надо указать директивой .ORG место, в которое будет вставлен код (относительно адресного пространства процессора). Если собирается не целый банк, то в исходник дополнительно нужно будет скопировать из IDA имена переменных и меток.

После копирования кода рекомендуется собрать его для того, чтобы убедиться, чтобы он бинарно совпадает с кодом из ROM. В случае ошибок, проверить, что с помощью .ORG выставлен правильный адрес (правильный адрес можно проверить, загрузив ром в эмулятор и найти, по какому адресу будет загружен банк с кодом, или просто рассчитать его на основании адреса в роме и данных о маппере игры).

Дальше можно переписывать код, в случае сборки отдельных кусков также надо следить за тем, чтобы не увеличить его размер.

Собранный бинарник нужно вставить в ром. asm6 для этого не годится, потому что он не умеет отмерять смещения больше FFFF (хотя судя по исходникам вроде должен), но для вставки одного бинарника в другой можно использовать любой другой инструмент, например, ассемблер сеги ASM68K.

Такой подход даёт:

  • модульность - разбиваем код и данные на части. удобный контроль версий - текстовые файлы удобно диффить и хранить изменения.
  • навешивание тестовых скриптов для проверки целостности результата.
  • комментирование кода - без комментариев.

В общем, шаг от программирования в машинных кодах к программированию на языке высокого уровня - ассемблере.

Для теста сделал пару конфигов на основе старых реверсов:
Выдернутая функция поведения для робота-стража из Чёрного Плаща - теперь не сторожит территорию, а сразу атакует ЧП.
Список позиций объектов для первого уровня Чипа и Дейла 2 - и измененная версия на основе хака врагов Roket’а.

Ну и потом еще переделаю на такой конфиг lua-скрипт для врагов New Ghostbusters 2.