Закладка "Команды" .
Содержит список недокументированных команд , в котором можно выбирать ( помечать ) отдельные команды .
Пункт главного меню "Отметить все команды" - помечает сразу все эти команды .
Пункт главного меню "Снять все команды" - снимает отметку сразу со всех этих команд .
Рядом с названием некоторых из них в скобках есть альтернативные названия эти команд взятые из разных источников ( документации ) , но не смотря на это название в тексте ассемблерного кода будет то , которое не скобках . Лучше использовать и отмечать сразу все , чем выборочно по отдельности .
Кнопки для работы с таблицей на этой закладке аналогичны , тем что и на закладке "Маппер" .
Кнопка "Обратить отметки" - Во всех строках таблица где строка помечена знаком "+" , этот знак сбрасывается и наоборот где не отмечено , устанавливается знак "+" .
Двойной клик левой кнопкой мыши по первой колонке c названием "Отметка" позволяет устанавливать знак "+" или
снимать его если он уже установлен , таким образом каждой строкой можно управлять отдельно ( будет ли она задействована при анализе кода или нет ) .
За исключением того , что тут добавлены еще 2 - "Вверх" и "Вниз" , которые предназначены для ручной сортировки
по адресам ( она не учитывается , но полезна для экспериментов ) .
Для чего же нужна эта таблица и данные которые в ней содержатся .
Когда у нас в коде встречаются непрямые ( косвенные ) переходы ( прыжки ) . Типичный пример JMP ( $0006 ).
Эта команда передает управление не на адрес $0006 ( PC = $0006 ) как обычный JMP $0006 ( прямой переход ) , а переходит на адрес формирующийся из двух байт , которые в свою очередь находятся в оперативной памяти ОЗУ в нулевой странице по адресам $06 и $07 соответственно ( PC = [$0006] ) и там содержимым может быть всё что угодно , поэтому в данном случае необходимо анализировать вручную на какие именно адреса будет переход . Иногда это сделать очень трудно ( долго изучать код ) и в таких случаях проще всего посмотреть в эмуляторе под отладчиком этот список адресов куда передается управление . Но чаще всего это можно сделать очень легко ( даже вручную ) , хотя все равно на это тратится достаточно много времени , особенно без привычки , поэтому в программу я добавил функцию , чтобы это было намного быстрее и полуавтоматически .
Типовой пример .
Игра Пакман . Скриншот приложил .
По адресу $C1F2 находится сама команда JMP ( $0010 ) .
По адресам $C1E8 и $C1EB расположены 2 команды LDA $C1F5 ,Y и STA $10 , которые пересылают байт из адреса $C1F5 в адрес $0010 , а по адресам $C1ED и $C1F0 расположены 2 команды LDA $C1F6 ,Y и STA $11 , которые пересылают байт из адреса $C1F6 в адрес $0011 . В итоге получается , что по адресу $C1F5 лежит 2 байта в которых находится адрес и по которому будет передаваться управление , а равен он у нас $C1FB , при том так как у нас использовалась индексная адресация ( Y ) , по этому адресу находится целый массив переходов , а не всего один переход .
Так вот программа если выбрать строку с адресом начала массива , то есть $C1F5 , а потом нажать на кнопку "Загрузить из файла" в нижнем правом углу экрана , то в правом большом окне на закладке "Команды" появится
следующая строка "(3)$C1F5=$C1FB,$C3BD,$C458" , которая означает , что найдено три перехода . Теперь в этом же окне мы немного правим исходную строку на такую "$С1F2=$C1FB,$C3BD,$C458" , где перед знаком "=" мы указываем
адрес команды перехода к которому мы привязываем наши адреса перехода , а потом добавляем с помощью кнопки "Добавить" эту строку в таблицу . Теперь нам надо в главном меню нажать "Закрыть образ" и заново загрузить тот же NES файл и на этот раз у нас уже будут учитываться данные из таблицы , которые мы добавили и появятся новые участки кода для анализа , в которых кстати тоже могут быть новые непрямые переходы . Ну и повторяем это действие пока не исчерпаем все ресурсы этой возможности . Суть в том что когда все будет готово , можно сохранить все строки в текстовый файл и потом в любое время сразу за один раз загружать все адреса одним списком в таблицу .
Вот что у меня например получилось для Пакман .
$CA0A=$CE35,$CA9D,$CA1F,$CC0F,$CC3C,$CD61,$CCE6,$E655,$E74B
$C1F2=$C1FB,$C3BD,$C458
$C471=$C48C,$C4B9,$C4CF,$C6C8
$C6D4=$C6DD,$C728,$C78D
$EFA7=$EFCA,$EFD7,$EFEF,$F007,$F01F,$F02F,$F03F
$E766=$E76F,$E853,$E8FA
$EA2C=$EA35,$EAC9,$EAF9
$D962=$D98C,$D998,$D955,$D9B5
$D8BB=$D8C8,$D50C
$D4FE=$D840,$D7F0,$D50C,$D50B
$D376=$D381,$D385,$D3A0,$D39C
$E906=$E911,$E93A,$E965,$E996
$E85F=$E868,$E891,$E8CB
$E77B=$E786,$E7AF,$E7DA,$E846
$EB05=$EA4C,$EB10,$EB2B
$EAD5=$EA4C,$EADE
$EA41=$EA4C,$EA62,$EA79,$EA90
$D3C2=$D405,$D3FB,$D3D7,$D3CD
$D854=$D85B,$D85D
$D51D=$D53E,$D542,$D528,$D52C
$D569=$D574,$D588,$D57A,$D582
$D646=$D6A6,$D6B0,$D6CF,$D651
Как видно из примера выше адреса привязка могут не отсортированы ( идти не по порядку ).
А вот другой пример , который уже взят для игры "Супер Марио" , но вторым способом , то есть из отладчика эмулятора , потому там слишком сложно определить адреса первым способом . Надо долго анализировать большие куски кода .
$8E16=$AEDC,$AEEA,$B0E9,$B35A
И осталась еще одна маленькая настройка на закладке "Команды". По умолчанию анализируются все 256 байт предполагаемого массива адресов переходов , но можно вручную уменьшить это число , поставив галочку напротив "Другое" , тем самым активировав соответствующее поле . Разумеется в этом случае число должно быть четным , то есть кратным двум .
NESEmDev - Russian
Moderator: Moderators