Окно Debugger

Вернуться на главную страницу

Содержание

Окно Debugger

Требуется ознакомление с окном Hex Editor перед прочтением раздела.

Debugger (дебаггер, отладчик) предназначен для изучения работы кода игры, а также для редактирования кода. Основная работа с ним осуществляется на паузе эмулятора, в частности после срабатывания брейкпоинтов.

Окно Debugger'а вызывается в эмуляторе FCEUX через Debug -> Debugger (или горячей клавишей). Предварительно нужно запустить игру.

Содержимое окна обновляется при переключении фокуса на другое окно, а затем снова на окно Debugger'а. Также оно обновляется при нажатии на некоторые кнопки.

Окно охватывает все адреса NES Memory, интерпретируя байты в этих адресах как код. Код состоит из набора инструкций, которые находятся в PRG по адресам $8000-$FFFF.

Значительно реже код также может находиться на батарейке $6000-$7FFF и в RAM $0000-$07FF.

Не весь код, который отображает Debugger, на самом деле является кодом. Окно просто интерпретирует байты в адресах. Достаточно легко отличить реальный код от обычных байтов, которые являются какими-то данными.

Синтаксис

В старой версии эмулятора нет синей, зеленой и серой подсветки синтаксиса.

Инструкции процессора

Здесь отображаются инструкции процессора.

Опкоды инструкций

Инструкции получаются исходя из байтов, которые находятся слева. Самый первый байт называется "опкод".

Debugger может распознать 151 опкод. Если он не знает как расшифровывается неизвестный опкод, такая инструкция будет записана как UNDEFINED (неопределенная). На практике чаще всего встречается у байта #$FF.

Режимы адресации

Одна и та же инструкция, например LDA, может использовать несколько режимов адресации памяти, который задается опкодом этой инструкции. Выбранный режим адресации определяется по синтаксису справа от инструкции.

Операнды

После опкода записан операнд (аргумент) инструкции. Расшифровка операнда отображается справа от инструкции.

У некоторых инструкций отсутствует операнд, у других он размером 1 или 2 байта. Размер операнда и его расшифровка зависят от режима адресации. Debugger считывает опкод, вычисляет размер операнда, и отображает следующую инструкцию по списку с учетом общего размера предыдущей инструкции.

Например, инструкция TAX по адресу $82A0 в сумме занимает 1 байт, поэтому следующим опкодом по мнению Debugger'а является байт по адресу $82A1 ($82A0 + 1). Здесь находится инструкция AND #$07, которая в сумме занимает 2 байта, значит следующая должна находиться по адресу $82A3 ($82A1 + 2), где мы видим инструкцию STA $076B.

Подсказки

Если инструкция может использовать или изменять байт в адресе, с которым работает эта инструкция, справа от таких адресов отображен знак "=", после которого показан байт, находящийся по этому адресу в NES Memory.

Последние 2 указанных на изображении байта относятся к адресам, выделенным серым цветом, а не зеленым.

Если адрес, с которым работает инструкция, вычисляется через индексную или косвенную адресацию, то итоговый адрес, вычисляемый Debugger'ом, будет отображен после знака "@". Этот итоговый адрес может отличаться в разное время.

Правильный адрес гарантированно получается только тогда, когда код выполняет данную инструкцию. Поэтому если эмулятор не стоит на паузе, то не нужно обращать внимание на серые адреса. А даже если и стоит, информация все равно может оказаться неверной. Это же касается и байтов после знака "=".

Если вручную менять байты индексных регистров X и Y на паузе эмулятора, то при обновлении окна итоговые адреса будут пересчитаны и отображены. А даже если окно не обновлялось, то при пошаговом выполнении кода новые байты в регистрах (включая регистр A) все равно будут учтены во время выполнения инструкции.

Адрес инструкции

Здесь отображен адрес инструкции, то есть то место, где находится ее опкод в NES Memory.

Номер банка

Слева от адреса указан номер банка PRG.

Банк - часть памяти из ROM File, подключенная в NES Memory.

Номер банка может не совпадать с номером банка в маппере.

Номер банка не отображается по адресам $0000-$7FFF.