Все абсолютные адреса в роме, независимо от инструкции.
В итоге очередной провал, нужного не добился. Хотел сделать, чтобы в UMK3 при старте игры начинался не выбор режима боя, а Галага. Когда-то ковырял ром в отладчике и запомнилось, что легко перенаправлял экраны в друг друга меняя адреса прыжков.
Алгоритм поиска кандидатов в адреса был такой - проходим по чётным байтам рома и если этот байт - ноль, то смотрим следующие 3 байта.
Если это трёхбайтное число больше размера рома или меньше 512 (первые байты рома - векторы прерываний, прыжки на них не интересуют) - то пропускаем.
Сначала хотел собирать и перекрывающиеся кандидаты, но в итоге решил, что в любом случае повредим оба варианта и увидим результат на экране, поэтому оставил алгоритм простым.
Сначала искал момент прыжка в экран выбора режима боя. Заменял все кандидаты адресом самой первой инструкции игры. Ожидалось, что однажды нажму Start и игра покажет не экран выбора режима, а логотип Сеги. Это случилось уже примерно через 50 попыток, адрес прыжка найден? Но оказалось, что в логотип уходит и при выходе из настроек, и ещё где-то. Как так то? Я ж менял адрес только в одном месте... Выходит, что все эти экраны прыгают не на начало игры, а на код до места, где я изменил адрес.
Ок, всё равно проверим-ка изначальную идею. Теперь решил искать адрес прыжка на Галагу, нашёл быстро. Вставил этот адрес вместо прыжка на логотип Сеги и в итоге при старте происходит синий экран смерти
Тут пришла идея, что кандидатов лучше портить сразу адресом прыжка на Галагу, а не на логотип. Начал новый поиск и... ничего.
Видимо, перед прыжком на Галагу происходят всякие инициализации, которые пропускаются в случае старта из меню основной игры.
Впервые с начала разработки Глитчера заглянул в отладчик - а возможно ли вообще легко сделать то, что я хочу? Увидел спагетти кода UMK3 в этом месте, приуныл и решил оставить эту идею.
Далее решил искать числа в роме. Например, в Streets of Rage в начале даются 3 жизни - найти это число. Альтернатива поиску в памяти, т.е.
Не нашёл, зато нашёл континиусы, их тоже оказалось 3.
Решил снова глянуть в отладчик. Оказалось, что игра зачем-то формирует это число на ходу - вносит 1 в регистр, потом прибавляет это число на себя, добавляет ещё один 1 и раздаёт эту тройку обоим игрокам. Кто знает - что это? Защита от Game Genie?
В настройках можно выбрать уровень сложности, но это не влияет на количество жизней.
В итоге на эту идею тоже пока забил.
Добавлено позже:Пока писал это, вдруг дошло, что я забыл проверять кандидаты на адреса - на чётность
100308 -> 65787 (отсеялось 35% кандидатов)
Вряд ли это изменит ситуацию, конечно.