Полезные советы |
Автор: 2002 (c) Oliver Sahr. Перевод: 2005 (c) System SoftLab. В хелпе очень много полезной информации, но её иногда явно не достаточно. Хотел поделиться некоторыми "хитринками". Авось кому помогут. Тем более, что разработчики игр нынче не глупые пошли и пытаются:
Спасибо за внимание. Автор: 2003 (c) Defil (defil@pisem.net) Здесь описаны способы нахождения значений в эмуляторах приставок, компьютеров и аркадных автоматов. Этими же способами можно искать в любых эмуляторах (мобильных телефонов и пр.), и в ПК-играх. Эмуляторы обычно позволяют сохранять текущее состояние в игре - это так и называется "Save state", иначе "Quick save state", " Save snapshot". 1. Поиск значения, представленного на экране цифрами (иногда значение бывает представлено не цифрами, а графическими элементами, например две жизни - два самолета.). Количество жизней обычно ищется поиском точного значения. Я обычно нахожу, начав с поиска диапазоном значений (если на экране 3 жизни: значение больше или равно 2 и меньше или равно 4), потом теряю одну жизнь - отсеиваю "уменьшилось на 1" и т.д. Или аналогичным способом по формуле: На экране число 3 - сохраняем дамп памяти в ArtMoney PRO (будет состояние M1) На экране число 2 - сохраняем второй дамп памяти (будет M2) На экране 1 - сохраняем третий дамп памяти (будет M3) И далее по формуле: (M1>=2)and(M1<=4)and(M1=M2+1)and(M2=M3+1) или же (M1>=2)and(M1<=4)and(M1=M2+1)and(M1=M3+2) 1.2. Поиск неизвестного значения. Допустим, нужно найти адрес, отвечающий за полоску жизни. Два примера: 1.2.1 Здоровье хранится как полоска, значение уменьшается, соответственно уменьшается и здоровье. Вариант поиска полоски на уменьшение: Сохраняемся, когда у нас 100% жизни, ищем в ArtMoney -"неизвестное значение" - "целое 2 байта" (в различных случаях надо выбирать "целое 4 байта", иногда "4 байта с точкой" - об этом в конце статьи). Пропускаем удар - отсеиваем "уменьшилось". Грузим сохранение - "увеличилось" (также можно дождаться следующего раунда). Без ранений проводим какое-то время в игре - "не изменилось". И так далее. Нередко заодно находится и адрес таймера. И может быть еще дополнительный адрес, отвечающий за длину полоски жизни на экране. Сохраняться можно сколько угодно, главное - оставить сохранение при 100% жизни, так будет удобнее. В версии PRO лучше использовать отсеивание по формуле - то же, просто сохранять дамп памяти при разных состояниях, как написано в руководстве. Пример: На экране 100% полоски - сохраняем дамп памяти в ArtMoney PRO (будет M1). Также на этом шаге делаем быстрое сохранение игры средствами эмулятора. Теряем чуть-чуть здоровья - сохраняем второй дамп памяти (будет M2) Без новых ранений двигаемся в игре - делаем в игре что хотим, чтобы было максимум изменений (но лучше без перехода на другой уровень, ибо адреса могут измениться)- сохраняем третий дамп (будет M3) Грузим наше быстрое сохранение с 100% здоровьем, после этого выполняем различные действия в игре, как и на предыдущем шаге, но так, чтобы оставалось 100% здоровья - сохраняем дамп памяти (будет M4) После этого отсеиваем по формуле: (M1>M2)and(M1=M4)and(M2=M3)and(M2>0) Можно продолжить обычными отсеиваниями в случае необходимости ("уменьшилось/увеличилось/изменилось/не изменилось/больше 0") Быстрые сохранения в эмуляторах позволяют очень быстро проделывать такие действия - не нужно искать бонусы для восстановления здоровья и т.п. 1.2.2. Если вышеуказанным способом найти не удалось, то вероятно здоровье хранится как повреждение, т.е. при 100 здоровья значение по нужному адресу равно 0, при каждом ранении постепенно увеличивается, при достижении определенного значения наступает смерть персонажа. Примеры таких игр - Pitfall the Mayan Adventure (SMD, Sega 32X, SNES, Atari Jaguar), World's Scariest Police Chases (PSX). В игре Red Zone на Sega Genesis здоровье вертолета хранится как повреждение (значение равно 0 при 100% здоровья), а здоровье игрока в миссиях за человека - в обычном виде, значение здоровья человека уменьшается от ранений. На экране 100% здоровья - сохраняем дамп памяти в ArtMoney PRO (будет M1). На этом шаге делаем быстрое сохранение игры средствами эмулятора. Предполагается, что сейчас в памяти значение равно 0. Теряем чуть-чуть здоровья - сохраняем второй дамп памяти (будет M2). Предполагается, что значение в памяти увеличилось. Без новых ранений проводим какое-то время в игре - сохраняем третий дамп (будет M3). Теряем ещё здоровье - сохраняем четвертый дамп (будет M4) Грузим наше быстрое сохранение с 100% здоровьем, продвигаемся в игре без ранений- сохраняем дамп памяти (будет M5) Предлагается две различных формулы - более "универсальная" и такая, которая включает точное значение 0. Первая: (M1< M[2,4])and(M1=M5)and(M2=M3)and(M2< M4) Вторая: (M1=0)and(M1=M5)and(M1< M[2,4])and(M2=M3)and(M2< M4) Опять же, можно продолжать обычными отсеиваниями "уменьшилось/увеличилось/изменилось/не изменилось/больше 0/равно 0") 1.2.3. Кроме того, если уровень длины полоски больше миниального и меньше максимального, то можно дополнять отсеиваниями диапазоном (примеры даны, если используется беззнаковое целое): Для типа 1 байт целое: Больше 0 и меньше 255 Для типа 2 байт целое: Больше 0 и меньше 65535 Можно и нужно также включать их в формулы. 2 Нужно найти адрес переменной, отвечающий за бессмертие, которое дается в начале уровня, после взятия приза, после пропущенного удара или респауна (Invincibility), с миганием (Flashing). Этот параметр позволяет избегать столкновений с врагами, ходить по шипам и т.п. Когда бессмертие есть, значение по этому адресу больше нуля, постепенно падает до нуля - по сути, это тот же таймер, только отсчет скрыт от пользователя. В некоторых играх это значение может быть другим - в игре Go Go Ackman 2 на SNES при "выключенном" бессмертии оно равно 2. Находим поиском незвестного значения, можно с условиями "изменилось/не изменилось" (наиболее универсальный способ), при желании можно "уменьшилось/увеличилось/изменилось/не изменилось/больше 0". Конечно же, Вы всегда можете отсеять на нулевое значение при «выключенном» бессмертии, но при этом не забывайте, что в настройках ArtMoney всегда должно быть включено «разрешить отмену отсеиваний». Тип переменной при поиске лучше всего выбирать целое 4 байта (можно целое 2 байта). 2.2. Важно - при таком поиске обычно находятся несколько адресов, обычно, 2-4 адреса (если выбран тип целое 4 байта или целое 2 байта). После того, как Вы нашли адреса неуязвимости, то нужно брать тот, размер у которого меньше ( целое 1 байт или целое 2 байта). Как объясняют это разработчики ArtMoney: Если адрес 0001 и размер 4 байта, то он включает адреса 0001-0004. Адрес 0002 и размер 2 байта, включает адреса 0002-0003. Соответственно все эти три адреса с такими типами включают друг друга, если все работают, то логично верный тот у которого размер меньше. 2.3. В ряде игр при «включенном» бессмертии персонаж не может подобрать бонусы, те. просто проходит сквозь них. Например, в игре Sonic CD игрок не может подбирать кольца при таком состоянии. 3. Нужно найти адреса, отвечающие за координаты объектов. Например, хочется "пролететь" какое-то место в игре - поиском неизвестного значения можно найти адрес каждой координаты. Может быть так, что чем выше (для координаты Y) и левее (для координаты X) объект на экране - тем значение меньше. С вертикальными координатами может быть и наоборот - чем выше позиция объекта, тем больше значение. Также бывают так называемые "неабсолютные" координаты - к примеру, один адрес отвечает за положение объекта на одном экране, а при переходе на другой экран за его положение отвечает уже другой адрес. Или же один адрес отвечает за какую-то часть экрана (например, половину экрана), а второй за другую часть. Для примера, в игре Phantom Fighter на Nes за положение игрока по оси X (горизонтальной оси) внутри помещений отвечают два разных адреса - за положение на левой части и на правой части, тип 1 байт целое. Может быть так, что за координаты отвечают переменные разных типов, например за координату X-целое 2 байта, а за координату Y - целое 4 байта - это может зависеть от того, на какие расстояния двигается объект. В 8-мибитных играх обычно это целое 1 байт, может быть целое 2 байта, в более новых играх 4 байта целое, в консолях выше первой PlayStation 4 байта с точкой, или же 8 байт с точкой (включая Nintendo 64) Пример - игра Dynamite Cop (Dynamite Deka 2) на Sega DreamCast и Sega Model 2 координаты объектов и камеры хранит как 4 байта с точкой. Если Вы будете искать переменные целых типов (т.е целое 1, 2, 4 байта), то смотрите пункт 2.2 этой статьи (про несколько адресов разных типов). В "одноэкранных" играх вроде Galaga и Bomberman, а также многих 2D файтингов часто координаты хранятся как 1 байт целое. т.е. крайняя левая позиция игрока по оси X — значение равно нулю, крайняя правая правая позиция — значение равно 255. Можно и нужно пробовать находить адрес следующей координаты, прибавляя к адресу предыдущей смещения 1h, 2h, 4h, 8h, 10h, 6h, A6h, 100h и т.д. Наиболее часто используется 4h - найдите адрес координаты X поиском неизвестного значения, после этого прибавьте к её адресу смещение 4h, получите адрес координаты Y или Z. То же касается адресов координат камеры. Для старых консолей и компьютеров типа Atari пробуйте прибавлять по 1 байту (+1h/-1h). В большинстве случаев проще найти адрес вертикальной координаты (Z, а также Y в двухмерных играх), и затем уже прибавлять к нему эти смещения. Или наоборот, есть игры, где проще найти адрес горизонтальной координаты, затем найти адреса остальных координат., прибавляя смещения. Также можно открыть редактор памяти на известном адресе координаты, затем скопировать близлежащие ячейки в правую таблицу и проверить перебором, есть ли среди них адреса других координат. 3.1 Если Вы нашли адреса координат неверным типом переменной, например 4 байта целое вместо 4 байта с точкой или 8 байт с точкой, то нужно открыть окно редактирования этого адреса и сменить тип на правильный, после чего пробовать нажимать мышью стрелки справа от поля "Адрес эмул." (для ПК игр и таблиц без настроек эмуляторов просто "Адрес"), один клик соответственно прибавляет/отнимает по одному байту. Таким образом, Вы получите верный адрес. Имеется в виду, что в трехмерных играх на консолях типа Nintendo 64, PS2 и т.п. для положения объектов и камеры используются типы 4 байта с точкой, 8 байт с точкой, но в ряде случаев можно найти такой адрес как 4 байт целое - целый тип в этом случае будет неверен. С другой стороны, есть очень много 2D игр - портов с других консолей/аркад/компьютеров и т. п. (к примеру, серия Metal Slug) - в них используется целый тип. Понятно, что переиздания игр с того же SNES на WiiWare используют целый тип. В современных 2D и 2,5D играх для хранения значений координат это обычно значения с точкой. Существует много игр, в которых при замороженном значении по адресу координаты объект не может двигаться по другой оси координат - т.е. Вы не сможете левитировать влево-вправо и вперед-назад кнопками направления (стрелками) при замороженном адресе вертикальной оси координат. На этот случай нужно назначить горячие клавиши для прибавления/уменьшения значнения по адресам остальных координат. Для примера - игра Kula World на PlayStation и Moon Crystal на Nes. Можно телепортировать игрока в какое-то место уровня. Проще всего это сделать, поставив в игре паузу, далее в ArtMoney заморозить адреса координат, изменить значения по этим адресам, далее снять паузу и в игре проверить эффект от изменений. 4. В случае если в игре меняются адреса. 4.1. Если адреса в игре меняются все вместе - используйте автоизменение адресов на всё, если не все - нужно предварительно разбить на группы, делать автоизменение на группу. ArtMoney также позволяет работать с эмуляторными указателями, действия поиска и отсеивания указателей подробно будут описаны ниже. Если Вы работали с указателями в играх под Windows, то в эмуляторах алгоритм тот же, только надо учесть некоторые особенности - отсеивать указатели нужно по эмуляторному адресу (открыть окно редактирования адреса - "Адрес эмул.", а не по адресу ПК. При поиске эмуляторных указателей нельзя отмечать "только статические адреса в модулях" и "модульная адресация". Бывает так, что эмулятор использует DMA, хотя сама приставка не использует - например, в эмуляторе GameBoyColor - ROM Player[rew.] всё фиксировано, а в VisualBoyAdvance адреса каждый раз меняются. В эмуляторе DreamCast под названием Demul блок WorkRAM фиксирован, а в Chankast и NullDC память выделяется динамически. В таких случаях нужно просто автоизменять все адреса по одному адресу 4.2. Пример. В первом уровне находим адреса различных параметров, сохраняемся средствами эмулятора. Выбираем один из адресов, к примеру, адрес жизней, допустим что он хранит жизни точным значением. Делаем по нему поиск указателя на начало блока памяти. Далее в левой таблице сохраняем отсеивание в файл. Переходим на другой уровень. Если адреса параметров в правой таблице стали нерабочими, то находим наш новый адрес жизней, по нему автоизменяем адреса. Делать это нужно так - в левой таблице выделяем новый адрес жизней, в правой - старый (нерабочий). Далее ПКМ - "Больше" - "Автоизменение адресов" - "Автоизменить адреса и скопировать в новую группу.". Задаем имя для новой группы (можно группы именовать по номерам уровней, к примеру). После этого таблицу сохраняем, причем адреса, найденные в первом уровне, также остаются в ней. Не забываем сделать быстрое сохранение в этом уровне. Далее загружаем файл отсеивания указателей. Делаем отсеивание указателей - сделать это можно либо по "Точное значение", вписав новое значение по адресу жизней, либо по "Указатель", вписав в поле новый адрес (ПКМ на адресе жизней - скопировать адрес из поля "Адрес эмул."), добавив h в конце. Если отсеивание прошло успешно, то в левой таблице сохраняем отсеивание указателей в файл. Далее переходим на следующий уровень, повторяем процедуру. - так же автоизменяем адреса, копируем в новую группу. Так же отсеиваем указатели, сохраняем отсеивание указателей. Далее, если указателей осталось мало, можно перейти на другой уровень, найти адрес жизней, автоизменить адреса и скопировать в новую группу (получается уже четвертая группа адресов). Поскольку мы имеем таблицу с четырьмя группами адресов для четырех уровней, то можно в любой момент загрузить быстрое сохранение в любом из уровней, для которого у нас есть адреса в таблице, и отсеять указатели по эмуляторному адресу жизней из группы, соответствующей этому уровню. Во многих случаях можно обойтись меньшим количеством уровней - можно просто возвращаться на предыдущие уровни, загружая быстрые сохранения, а также через меню игры, внутриигровые сохранения/эмулируемые карты памяти или даже пароли на выбор уровня. Главное, чтобы отсеивание указателей проходило правильно. После этого нужно сделать бэкап таблицы (обязательно), далее удалить из таблицы все группы адресов, кроме одной - это может быть любая на Ваше усмотрение, единственное условие - адреса в ней не должны быть рабочими перед установкой указателей, т.е. адреса в ней должны быть не для того уровня, в котором Вы в данный момент находитесь. Сохраняем таблицу под другим именем. После этого нужно загрузить последний сделанный файл отсеивания указателей, выделить в левой таблице указатель (тот, что идет с наименьшим смещением), в правой - адрес жизней (напомню, что он сейчас нерабочий), и выполнить команду "Больше" - "Действия с указателями" -"Установить указатель" и выбрать, устанавливать указатели на всё или на группу. Если Вы все сделали правильно, то получим таблица с адресами, которые будут всегда актуальны, для всех уровней. Обычно указатели (как эмуляторные, так и указатели в обычных ПК играх) инициализируются только в момент загрузки уровня. То есть в стартовых меню игры или просто между уровнями адреса с указателями в таблице будут иметь значение <НЕТ> - это совершенно нормально. Как только уровень будет загружен, адреса станут рабочими. Важно - GBA, Nintendo Wii, Sega Saturn и некоторые другие консоли используют два и более блока WorkRAM для хранения нужных Вам параметров - в таком случае нужно всегда разбивать адреса на группы, т.е. своя группа для адресов из каждого блока. Опять же, многие игры хранят значения различных параметров в разных блоках, то есть адреса меняются не все вместе, как написано выше, даже в случае с одним блоком WorkRAM - к примеру Contra 4 на NDS, Sonic The Hedgehog 4 Episode 1 на Wii (WiiWare). К примеру, игры серии CT Special Forces на PlayStation и Game Boy Advance хранят количество жизней, здоровье, оружие статично, а адреса координат игрока (положение персонажа в мире) и адрес неуязвимости (Invincibility) меняются в зависимости от уровня. Используются указатели первого уровня. Для этих игр (CT Special Forces 1-3) нужно статические адреса оставлять в основной группе, которую не нужно трогать вообще, а из динамических адресов найти все адреса для первого уровня, далее в следующих уровнях находить по одному эквивалентному адресу (лучше адрес координаты X или Y игрока, тип 4 байта целое, смещение между X и Y равно 4h) и по нему в следующих уровнях автоизменять адреса и копировать их в новую группу, каждый раз отсеивая указатели по этому новому адресу. Кроме того, в CT Special Forces есть миссии как за человека (горизонтальный скроллер), так и миссии на вертолете (вертикальный скроллер)- нужно находить адреса координат и неуязвимости отдельно для человека и вертолета, и указатели искать для человека и вертолета также отдельно. Миссии человека и вертолета чередуются, но, опять же, быстрые сохранения можно делать в любой момент игры, к тому же эмулятор Visual Boy Advance, PCSX-Reloaded и некоторые другие позволяют задавать произвольное имя для сохранения, не ограничиваясь стандартным количеством слотов. Важно - никогда не устанавливайте указатели на статику, оставляйте ее в основной группе. В справке ArtMoney читайте раздел "Использование указателей и автоизменение адресов". В случае, если в игре обращение к переменным происходит через указатели выше первого уровня - нужно при поиске выбирать "Искать" - "Указатель на указатель", и задавать максимальный уровень указателя и максимальное смещение. Потом сохранять указатели в файл отсеивания, после перехода на другой уровень для отсеивания выбирать отсеять по "Указатель на указатель" (не просто по "Указатель"). Более подробное описание поиска многоуровневых указателей будет добавлено в другой раз. 5. Нужно найти таймер. Если поиском точного значения не получилось найти, надо искать поиском неизвестного значения с условиями "уменьшилось на/увеличилось на".Если все равно ничего не найдено - поиском неизвестного значения с условиями "уменьшилось/увеличилось", тип переменной целое 2 байта, если не получилось - целое 4 байта. И проверить этот адрес, после того как он будет найден, например если время измеряется в секундах - нужно поставить две секунды, подождать в игре три, если время не кончилось, то адрес правильный. Рекомендуется начинать поиск, когда значение секунд на экране равно 59 или меньше. Допустим, у Вас на таймере 2:00 - дождитесь когда будет 1:59, ибо есть вероятность того, что таймер хранится по разным адресам для минут и секунд. То есть при 02:00 по адресу секунд будет значение 0, а если Вы сперва выполните поиск неизвестного значения при нулевом значении, а потом значение изменится на ненулевое (59 или ниже), то отсеивание по условию "уменьшилось" отбросит адрес секунд. А при 1:59 вполне вероятно что значение будет 9 или 59. Конечно, всё зависит от конкретной игры. Пример - игра Batman на PC Engine/Turbografx 16. Есть игры, которые хранят каждую цифру в отдельном адресе - всем известная игра Super Mario Brothers на Nes каждую цифру из трех хранит в отдельном адресе, тип 1 байт целое. При этом адреса эти идут друг за другом подряд без всяких смещений, то есть искать нужно последовательность значений целое 1 байт: если на экране значение Time 127, то ищите последовательность значений 1, 2 и 7, тип 1 байт целое. Точно так же хранится время в Nes игре Kabuki - Quantum Fighter и в многих других. Примеры формул: 1) Имеем четыре состояния, экранные значения таймера для них: Первое состояние (M1) - экранное значение 27 Второе (M2) - экранное значение 24 Третье (M3) - экранное значение 19 Четвертое (M4) - экранное значение 17 Варианты формул: Первый вариант - поиск точного значения: (M1=27)and(M2=24)and(M3=19)and(M4=17) Второй вариант - поиск неизвестного значения: (M1>M[2,3,4])and(M2>M[3,4])and(M3>M4)and(M4>0) Третий вариант - отсеивание на интервал, таймер на уменьшение: (M1=M2+3)and(M2=M3+5)and(M3=M4+2) или (M1=M2+3)and(M1=M3+8)and(M1=M4+10) 2) Имеем два состояния, экранные значения таймера для них: Первое (M1) - экранное значение 224 Второе (M2) - экранное знаечние 222. Здесь можно использовать (M1=224)and(M2=222) (M1=M2+2) 6. При поиске надо выбирать эти типы: "Целое 1 байт - количество жизней, других предметов, когда их мало, число выигранных раундов, иногда жизнь, время в игре, неуязвимость, координаты. "Целое 2 байта - жизнь, другие значения, представленные графикой (полоска жизни), количество предметов, неуязвимость, время, координаты. "Целое 3 байта - деньги, наиболее часто используется в играх жанра RPG и стратегиях, также другие параметры. Пример - деньги и Exp. Points в Final Fantasy 5 на PSX. Если игрой предусмотрено количество больше 65535, а поиск по целое 4 байта результата не дал, то искать надо целое 3 байта. "Целое 4 байта - деньги, другие предметы, которых может быть больше 65535, лайфбары и другие параметры, отображающиеся графикой (обычно полоской) неуязвимость, время в игре, координаты. "С точкой 4 байта - этот тип используется в консолях Nintendo 64, DreamCast, Gamecube, PS2, NDS и выше (в т.ч. ПК игры). Таким типом часто хранятся значения координат, особенно в больших 3D играх. Также таймеры и другие значения. "С точкой 8 байт - также координаты и другие значения, например таймеры. Во всех современных коммерческих трехмерных играх для хранения значений координат используется тип с точкой. В любительских играх может использоваться целый тип. "Также может использоваться тип "Текст" для хранения имен персонажей, экранных значений и т.п. Примеры - яблоки в SMD игре Disney's Aladdin, имя игрока в игре Bloody Wolf на PC Engine/Turbografx, имена персонажей в различных играх жанра РПГ (Dragon Quest 8 на PS2). 7. Адреса, найденные для одной версии эмулятора, не подходят к другой версии. Нужно использовать настройки эмулятора - выбрать из списка нужную игровую систему и эмулятор. Версия эмулятора выбирается из списка автоматически, если контрольная сумма (MD5) файла запуска Вашего эмулятора совпадает с MD5 из списка. Если в списке этой версии эмулятора нет - нужно найти самостоятельно нулевой адрес эмулятора (читайте соответствующий раздел в руководстве), и указатель на него (если блок WorkRAM не фиксирован). 8. При сохранении в таблицу крайне желательно записывать, отличается ли значение в памяти от экранного, и насколько. (+1) - если в памяти значение на единицу больше, (-1) - если наоборот — на единицу меньше, и т.д. если значение меняется в случае смены персонажа (оружия, транспорта) или версии игры (рома или образа) - в комментарии. Эти значения надо проверять в игре, предварительно сохранившись в месте, где они сменяются - на экране выбора игрока и т.п. (начиная от этого места). 8.1. Кроме того, это помогает находить нулевые адреса в эмуляторах по известному адресу параметра. К примеру, есть адрес таймера отсчета времени на экране выбора игрока в игре Captain Commando на CPS1. Время на экране выбора игрока хранится в памяти точным значением, адрес в RAM (эмуляторный адрес) равен 00FF9275. RAM начинается с адреса 00FF0000. Когда выходит новая версия эмулятора (к примеру, эмулятор Final Burn Alpha), то можно запустить эту игру в эмуляторе, дождаться экрана выбора игрока, сделать паузу эмуляции, выполнить поиск значения таймера по всей памяти эмулятора, снять паузу на какое-то время, снова поставить паузу, отсеять на новое значение, после чего получим адрес таймера (у меня на 32 бит версиях эмулятора адрес находится после первого отсеивания). После этого к этому адресу прибавляем смещение -9275h, получаем нулевой адрес эмуляции. На это адрес нужно будет найти указатель, получим настройку новой версии эмулятора. 8.2.Также существуют эмуляторы, в которых порядок байтов отличается от используемого в самой консоли. В таком случае адрес будет не совпадать с физическим. Например эмулятор Kega Fusion использует перевернутый порядок байтов, а сама приставка Megadrive/Genesis, ее аддон Sega 32X и консоль Sega Mega CD используют нормальный порядок байтов. Также перевернутый порядок байтов используют эмуляторы Mednafen (только в режиме эмуляции Genesis/SMD), и Gens Movie 11a/11b. Бывает и наоборот - приставка Sega Saturn и ее эмуляторы SSF и GiriGiri используют перевернутый порядок байтов, а эмулятор Yabause использует нормальный порядок байтов. Начиная с версии 7.39, ArtMoney автоматически выбирает порядок байтов для поиска в эмуляторе из базы. Вы можете увидеть примеры поиска нулевого адреса в различных эмуляторах в разделе статей на официальном сайте ArtMoney: https://www.artmoney.ru/r_articles.htm Автор: 2012 (c) iddqd (iddqd@tv-games.ru) |