это лишь попытка объяснить базовые принципы что такое РОМ и как оно работает.
в случае если гайд получится неудачным, то лучше удалить. (так как я не читал мануалы, пишу как представляю сам) Надеюсь, ты новичок, читающий сей гайд , представляешь примерно что такое компьютер(ПК), байт(byte), озу(RAM), 16-ричная система чисел. если нет, лучше не читать.
Итак, мы решили изменить/хакнуть игру, т.е. РОМ-файл. в отличии от обычной ПиСи-шной игры, в РОМЕ нет никаких файлов, а всё можно сказать монолитно., хотя конечно сами данные не в перемешку расположены, а по очереди.
все данные можно представить в виде 1байт(byte), 2байта(WORD), 4байта(LongWord).
Ром содержит КОД игры (т.е. EXE-шник как было бы на ПК), графику, музыку, палитры(наборы цветов), данные(например уровни,хар-ки и всё остальное что не код)
КОД это команды для процессора Сеги. то есть exe-шник, то есть программа самой игры. В сеге есть 2процессора - MC68 (основной) и Z80(дополнительный).
нас интересует первый.
команды процессора это коды, которые можно перевести в коды языка программирования ассемблер.
могут быть 2байт, 4 байта, 6 байт, и т.д. (1,3,5 не бывает, во всяком случае я не видел).
теперь откроем Hex-редактор'ом (напр. WinHEX,) наш РОМ, чтобы посмотреть на них. располжены они как правило вначале РОМА где-то с адреса 00000210 ($210 ).
пример самых популярных кодов :
4E 75 - что в ассемблере значит RTS.(возврат)
4E 71 - NOP (ничего не делать, т.е. полезно когда надо что-то вырезать)
4E B9 00 00 07 B4 - JSR переход на адрес 000007B4 в роме.
зайдем в WINHEX search-find hex values - 4e75 и посмотрим на них. вот это они и есть.
теперь нужно на них посмотреть в более понятном виде. для этого есть программа IDAPro. открываем ей РОМ Сеги, нажимаем OK(должен быть загрузчик для Сеги, в котором уже указаны настройки)
1-ая вкладка (IDA-view-A), переводим в текстовый вид(правая кнопка-text view). увидим что-то вроде:
ROM:00000A5C move.b (a2,d0.w),d1
ROM:00000A60 addq.b #2,d1
ROM:00000A62 cmpi.b #$28,d1
ROM:00000A66 bne.s loc_0_A6A
ROM:00000A68 clr.b d1
вот это и есть коды ассемблера. самое лево адрес в роме , addq.b-команда, #2,d1 - то,что она делает.
теперь выделим мышкой любую команду, и откроем вторую вкладку в IDA (hex view-A). зеленым будет как раз обведена эта команда в HEX(16-ричном)-виде.
совсем не обязательно знать/учить программирование, чтобы что-то изменить.
однако команды нельзя заменять нулями, нельзя заменять непойми чем. иначе процессор Сеги зависнет и игра остановится или полезут баги из под крышки картриджа .
однако команды можно вырезать, например если команда 2 байта - написать заместо нее(winhex'ом) 4e 71, если 4байта - 4e 71 4e 71.; можно заменить числа в командах, сmpi.b #$28,d1 например 0C 01 00 28 - заменить на 0C 01 00 01, получится сmpi.b #$1,d1 , т.е. сравнения с числов 1, вместо 28. и получить какие-то прикольные (и не очень эффекты)
участки кода разделяются на функции (в IDA- sub_0_10A и т.д.), разлены такой надписью.
; =============== S U B R O U T I N E =======================================
можно вырезать всю функцию (в самом её начале написать 4e75 (RTS- т.е. возврат обратно в тот участок где код выполнялся до этого)., и потом посмотреть изменилось ли что в игре.
однако никогда не заменяйте 4e75 на 4e71, т.к. после кода могут идти какие-то данные., а сега прочитает их как код, процессор не поймет и повиснет.
Как раз наша самая главная задача (как и IDЫPro) отделить весь код от данных, а данные от кода.
тогда даже если мы не понимаем код, мы сможем поменять данные.(пример RRR- хар-ки игроков, хар-ки машин, уровни сложности,наборы трасс, цены апгрейдов.)
как я уже говорил данные могут быть dc.b -1байт, dc.w. -2байта, dc.l - 4байта., в иде можно можно менять тип данных (правая кнопка на адресс), очень хорошо если вы правильно их обозначите, так как будет гораздно понятнее.
как правило IDA находит часть данных и помечает их unk_1c6c. , или byte_1c6c. нажмем на эту надпись правой кнопкой мыши, найдем надпись Jump to Xref to Operand. (вот там будет показан переход на участок/участки КОДА - каким эти данные используются /куда эти данные загружаются).
самая частая команда которой они грузятся - LEA(load effective adress) , а также move.b (10 29 xx xx). / move.w / move.l.
очевидно что-то по move.b загруж данные типа 1байт, move.w (т.е.) -2байта , move.l -4. впринципе IDA и сама их должна правильно обозначить. в случае с LEA надо смотреть самому.
обращаю внимание что адресса откуда грузить данные могут быть относительные и абсолютные. чаще используются относительные. пример:
10 29 1c 6c - move.b c 1с6с (откуда - от текущего адреса+1c6c+длина самой команды+2) , считается на виндновом калькуляторе(инженерный- HEX).
41fa 8a 4c - lea (текущ+8a4c+2)
41f9 00 00 01 F0 - lea данных с (асболютный адресс - 000001F0 ($1F0) )
кажись некоторые из них называют еще поинторами, я лично сделал хак RRR, и никаких поинтеров не видел. и естественно искать их не надо, и никаких программ для их поиска ненужно, это всё выдумки ромхакеров чтобы всех нас запутать, хотя может на денди какие поинтеры и есть (ну вообщем сами смотрите как вам удобней).
так как IDA отделяет далеко не весь код от данных, нужно доделывать за нее. конечно новичку это крайне трудно,так как ваще ниче не понятно, однако дам пару советов.
код с данными обычно расположен вначале РОМА (т.е. до графики и музыки), 4e75 - это на 99% код и конец функции., не может быть ничего похожего на полную чушь(типа повторерния однотипных и непохожих на других команды)., код не может быть разорван. (т.е. обычно фунция кончается на команду RTS или JMP),
если сомневаетесь что это код или данные запустите GENSVKNTrace(от Виктора Яковлева) поставьте галочку "установить брейкпоинт" на адресс который вас интересует (на чтение и PC), если это будет код- он покажет адресс и его код (этот ГЕНС также отображает коды ассемблера- но те что,выполняются в данный момент времени) , если число(данные) - покажет код в другом месте.
Сам преобразование данных в код в IDE нужно делать нажав на "C" на месте которое не изучено, а на "u" -undefine- то есть отмена(то есть если это явно не код).
можно выделить какой-то участок мышкой , и потом в меню правой кнопки выбрать analyze selected area.
Если планируете сделать хак, и что-то начинает получатся, обязательно переименовывайте SUB_0000 , UNK_0000 в свои выдуманные названия. (они будут в 3-ей вкладке в NAMES), остальные вкладки я закрыл ,советую и вам.
например нашли за что, отвечает функция или данные, называем. (пример функция CHAR_STATS , данные char_top_speed), не пишите название длинее 14символов в подписях к данным(к фунциям можно), а то пропадают XREFS'ы , не знаю может такой глюк в ИДЕ.
когда отделите код от всего остального, советую начать изучение рома именно с данных(не трогая код) , заменяя WINHEX-ом отдельные куски данных нулями 00. таким образом можно найти где у нас музыка,звуки, графика и всё остальное (уровни например).
еще некоторые другие типа данных: offsets off_0_000(dc.l) - ссылки на адреса. выглядят как ( 00009816 000098A8)
ROM:00009802 off_0_9802: dc.l sub_0_9816 ; DATA XREF: sub_0_97DA+1Eo
ROM:00009806 dc.l sub_0_98A8
Палитры - это значения типа dc.w выглядят как ( 0EEE 0CCC 0C84)., т.е. цветовая гамма, где 0BGR, то есть blue green red , синий зеленый красный цвет. (0000-черный, 0EEE-белый, 0E00-синий) - это самое простое что можно сменить (хакнуть).
Запакованные данные- фактически как архивы на ПК. внутри может быть что угодно(чаще графика). такие данные заменить нельзя без специальных программ распаковщиков. (хотя в коде игры программы - алгоритмы распаковки безусловно есть)
RAM(Озу) Сеги - загрузчик для IDЫ от HardWareMan'а создает специальный сегмент. адресов 00FF0000 - 00FFFFFF- это оперативная память Сеги. память можно менять в бол-ве эмуляторов (через Gamegenie например), если знаете какие-то значения которые за что отвечают подписывайте эти адреса и в IDE.
И ещё, если вы вдруг всё поняли(может и такое быть!), и хотите что-то добавить помните что размер РОМа для бол-ва эмуляторов Сеги не должен быть выше 4мб . (для реальной Сеги - 10мб). недавно миф о лимите в 4метра был рассеян KABAL'ом- самым крутым ромхакером.
Все остальные силы лучше бросить на изучение ассемблера МК68. (я могу лишь вкратце объяснить, что у нас есть регистры d0-d7 - тут числа, a1-a7 - тут видимо адреса. (можно в GensVKNTrace посмотреть как они меняются).
PC- program counter- место где в данный момент находится программа.,выполняемый код.
команда add- добавить, cmp - сравнить, move-поместить значение, clr -очистить., tst-проверка значения (0/неноль)
ну а как графику и звуки заменять ты, юный ромхакер, уже знаешь без меня, просто гораздно приятнее когда знаешь где точно, что у тебя в роме находится. (и можешь не только заменить, но и добавить) да и на мой взгляд основы знать важнее, прежде чем начинать юзать непонятный специализированный софт.
Удачного ромхакинга!