Заморозка адресов

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

Содержание

Заморозка RAM адресов

Заморозка напрямую связана с окном Cheats, которое открывается в эмуляторе FCEUX во вкладке Tools.

Заморозка запрещает коду изменять байт в адресах RAM $0000-$07FF. Такая функция называется "созданием чита" в эмуляторах. Это бывает полезно во многих случаях, например:

  1. Помощь в определении значения адреса. Если байт заморожен, что-то в игре может перестать изменяться.
  2. Временное создание хака с вечными жизнями/патронами/таймером неуязвимости. Неуязвимость поможет сэкономить время, когда пытаешься дойти до нужного места в игре, особенно если немного увеличить скорость в эмуляторе.
  3. Фиксация координат врагов в некой точке, чтобы не мешались под ногами, или чтобы протестировать хитбоксы.
  4. Во время паузы эмулятора позволит насильно запихать в адрес нужный байт, когда игра постоянно перезаписывает твои ручные попытки изменить байт в RAM.

Чтобы заморозить байт в адресе, нужно при необходимости поставить эмулятор на паузу, записать желаемый байт, а затем кликнуть по адресу правой кнопкой и выбрать Freeze/Unfreeze Address.

В некоторых случаях заморозка не будет работать с ожидаемым результатом. Заморозка лишь запрещает игре изменять байт в этом адресе, но она не запретит ей считать байт и произвести над ним какие-то отдельные вычисления.

Если взять в пример игру Battle City, и заморозить байт #$01 в адресе с жизнями $0051 с целью получения бесконечных жизней, все равно будет вызыван Game Over после смерти игрока.

Происходит это потому, что инструкция DEC, которая уменьшает байт в адресе, считывает этот байт, уменьшает на #$01, и затем пытается записать его обратно. Ей это не удается из-за заморозки адреса, однако результат уменьшения байта отобразится в состоянии процессора как Z = 1, поскольку в результате уменьшения получился байт #$00.

Далее выполняется инструкция условного перехода, проверяющая на флаг Z, в результате которой будет вызван Game Over, несмотря на то, что в адресе с жизнями был заморожен байт #$01.

Чтобы предотвратить такую ситуацию, нужно замораживать байт побольше, например #$02.

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

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

Чтобы исправить ситуацию, разморозь адреса через Hex Editor или удали/деактивируй читы в окне Cheats.

Freeze/Unfreeze Address

Предварительно можно выделить сразу несколько адресов для заморозки/разморозки некого диапазона.

В состоянии заморозки могут находиться одновременно не более 256-ти адресов. Если точнее, то количество читов в окне Cheats не может быть более 256-ти.

Toggle state

Переключает состояние адреса на замороженный/размороженный.

Если байт был разморожен, он заморозится. Если был заморожен, то разморозится.

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

Freeze

Замораживает байт в адресе. Байт перекрасится в синий цвет, и изменить его можно будет лишь через окно Cheats.

Если байт уже был заморожен, ничего не изменится.

Замороженный байт в основной RAM не отображается в зеркалах, а также замороженное зеркало не отображается в основной RAM и в двух других зеркалах. Заморозка зеркал не влияет на основную RAM.

Если в окне Cheats отключена опция Enable cheats, заморозка не сработает, несмотря на то, что байт все равно будет выделен синим цветом (когда он не изменяется).

Unfreeze

Размораживает байт в адресе.

Если байт уже был разморожен, ничего не изменится.

Если во время того, как байт в адресе был заморожен, игра пыталась изменить байт в этом адресе, то после разморозки ты увидишь байт, который оказался в результате последней такой попытки.

Если же игра не пыталась изменить байт, то он таким и останется после разморозки.

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

Для отслеживания байтов, которые игра пытается записать в адрес во время заморозки, можно просматривать зеркало этого адреса в Hex Editor'е. Еще можно воспользоваться Write брейкпоинтом, либо записать лог через окно Trace Logger и затем изучить его.

Unfreeze all

Аналогично Unfreeze, только размораживает сразу все замороженные адреса. Предварительно можно кликнуть по любому адресу RAM.