russian ROMhacking
[ Новые сообщения · Участники · Правила форума · Поиск ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Ромхакинг для новичков. основы на примере Сеги.
Ti_Дата: Четверг, 20.08.2009, 17:31 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 58
Статус: Оффлайн
это лишь попытка объяснить базовые принципы что такое РОМ и как оно работает.
в случае если гайд получится неудачным, то лучше удалить. (так как я не читал мануалы, пишу как представляю сам)

Надеюсь, ты новичок, читающий сей гайд , представляешь примерно что такое компьютер(ПК), байт(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-ричном)-виде.
совсем не обязательно знать/учить программирование, чтобы что-то изменить.
однако команды нельзя заменять нулями, нельзя заменять непойми чем. иначе процессор Сеги зависнет и игра остановится или полезут баги из под крышки картриджа happy .
однако команды можно вырезать, например если команда 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/неноль)

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

Удачного ромхакинга!

 
CARIДата: Четверг, 20.08.2009, 19:01 | Сообщение # 2
Полковник
Группа: Заблокированные
Сообщений: 152
Статус: Оффлайн
Quote (Ti_)
кажись некоторые из них называют еще поинторами, я лично сделал хак RRR, и никаких поинтеров не видел. и естественно искать их не надо, и никаких программ для их поиска ненужно, это всё выдумки ромхакеров чтобы всех нас запутать, хотя может на денди какие поинтеры и есть (ну вообщем сами смотрите как вам удобней).

Для их поиска и так некаких прог ненужно, только мозг (и того немного). И как раз поентеры в Сеге есть ненужно запутывать начинаюших ромхакиров.
Quote (Ti_)
И ещё, если вы вдруг всё поняли(может и такое быть!), и хотите что-то добавить помните что размер РОМа для бол-ва эмуляторов Сеги не должен быть выше 4мб . (для реальной Сеги - 10мб). недавно миф о лимите в 4метра был рассеян KABAL'ом- самым крутым ромхакером.

А это где ты такое вычитал, ссылку в студию. что то я сильно сомневаюсь по этому поваду. Он на сеге запускал свой хак?
P.S. Извине если мои слова могут выглядить грубо, ведь ты делаешь очень полезное дело up


 
Ti_Дата: Четверг, 20.08.2009, 19:30 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 58
Статус: Оффлайн
http://www.emu-land.net/forum/index.php/topic,20778.1635.html
Quote (KABAL)

Игра идёт на всех Сегах, СЕГИ без проблем видят 10 МЕГАБАЙТ, ничего в этой зоне от 4 до 10 МЕГАБАЙТА НЕ ГЛЮЧИТ - ТЕПЕРЬ ВОПРОС, А КТО СОЗДАЁТ ВЫСОКОТОЧНЫЙ ЭМУЛЯТОР СЕГИ, ОНИ ЧТО, НЕ ЗНАЮТ, ЧТО СЕГА ВИДИТ 10 МЕГАБАЙТ - КАКИЕ-ТО НИХРЕНА НЕ ЗНАЮЩИЕ ЛЮДИ ВЗЯЛИСЬ ЗА РАЗРАБОТКУ ЭМУЛЯТОРА, НАДО АВТОРУ ЭМУЛЯТОРА ВИДЕО ПОСЛАТЬ, ЧТО 10-МЕГАБАЙТОВЫЙ КАРТРИДЖ НА СЕГЕ БЕЗ ПРОБЛЕМ РАБОТАЕТ !!!!!!!!!!!!!!!!! СТИВ СНЕЙК, КОТОРЫЙ КЕГУ FUSION РАЗРАБОТАЛ, ТОЖЕ СЕГУ ДО КОНЦА НЕ ЗНАЛ, УЧИЛИСЬ, НАВЕРНОЕ, ЭМУЛЯТОРЫ ПИСАТЬ, И НА ПАЛЁНЫХ ДОКАХ СЕГУ ИЗУЧАЛИ, А ДОКИ КАКОЙ-ТО НИХРЕНА НЕ ЗНАЮЩИЙ О ВОЗМОЖНОСТЯХ КАРТРИДЖЕЙ СЕГИ ЧЕЛОВЕК ПИСАЛ. ДО СИХ ПОР НА ВИКИПЕДИИ КТО-ТО ТАКУЮ ХРЕНЬ ПИШЕТ, ТИПА СЕГА 10 МЕГАБАЙТ НЕ ВИДИТ

Quote (CARI)
поентеры в Сеге есть ненужно запутывать начинаюших ромхакиров.

команда LEA, что означает load effective adress - это команда ассемблера!, это команда а не слово с непонятным названием "поентер". я же говорю каждый понимает по-своему(я там в скобках специально написал).
"поентерами" можно назвать разве что адреса типа offsets_ (но логичнее назвать их оффсет?),
а lea - это часть кода,программа. вы сами запутали новичков.


Сообщение отредактировал Ti_ - Четверг, 20.08.2009, 19:44
 
SmokeДата: Четверг, 20.08.2009, 19:55 | Сообщение # 4
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
Вообще честно говоря не верится, что доки левые. Оффициальный документ о SMD переведенный впоследствии HardWareMan'ом даже говорит о том, что при обращении к адресам после $3FFFFF процессор просто останавливается и ждет ресета. Может просто флеш карт какой волшебный??? Интересно где он его надыбал

Ti_, дока стоящая, хоть и написана немного непрофессиально, но это даже к лучшему -- как раз для новичков. А поинтеры это что-то типа указателей. Идут массивами, как например указатели на трассы, звуки, машины в RRR(по сути это тоже поинтеры, только могут указывать не только на текст) и загружается весь массив этих указателей обычно инструкцией LEA. Так что поинтеры есть smile

Сообщение отредактировал Smoke - Четверг, 20.08.2009, 19:57
 
Ti_Дата: Четверг, 20.08.2009, 20:05 | Сообщение # 5
Лейтенант
Группа: Проверенные
Сообщений: 58
Статус: Оффлайн
Quote (Smoke)
Ti_, дока стоящая, хоть и написана немного непрофессиально, но это даже к лучшему -- как раз для новичков.
если ляпы есть думаю исправить не проблема.

Quote (Smoke)
загружается весь массив этих указателей обычно инструкцией LEA.

но сама команда LEA поинтер или нет? потому что как-то давно когда я спросил про адреса RRR в роме, н-ко адресов в роме подсказал Evgeny. в т.ч. была фраза:
поинтер на палитры (т.е. указатель на блок данных цветов).
а палитры грузятся командой LEA. , т.е. получается что сама команда LEA тоже поинтер. так что путаница есть, определенно.


Сообщение отредактировал Ti_ - Четверг, 20.08.2009, 21:19
 
CARIДата: Четверг, 20.08.2009, 21:48 | Сообщение # 6
Полковник
Группа: Заблокированные
Сообщений: 152
Статус: Оффлайн
Я думаю поентер это то что указывает любой адрес будь это 00 00 22 33 или 00 ff ff ff даже в C++ есть такое понятие

 
SmokeДата: Четверг, 20.08.2009, 22:00 | Сообщение # 7
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
Quote (Ti_)
но сама команда LEA поинтер или нет?

Ну хз, видимо у каждого свои понятия. Для меня это не поинтер, и аргумент LEA тоже. Для меня поинтеры это число(либо word, либо longword), указывающее на что-либо(данные или же код). И обычно они записываются в массивах. Вижу массив таких указателей -- думаю: "О, поинтеры(указатели) какие-то. Поставить бряк на чтение чтоль, проверить за что они отвечают".


Сообщение отредактировал Smoke - Четверг, 20.08.2009, 22:01
 
TLTДата: Четверг, 20.08.2009, 22:30 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 2365
Статус: Оффлайн
Quote (Ti_)
недавно миф о лимите в 4метра был рассеян KABAL'ом- самым крутым ромхакером.

га га =)

1 - На железе больше 4х метров (32MB) нельзя.
2. Он не самый =)



Вот так.
 
Ti_Дата: Четверг, 20.08.2009, 22:50 | Сообщение # 9
Лейтенант
Группа: Проверенные
Сообщений: 58
Статус: Оффлайн
Quote (TLT)
1 - На железе больше 4х метров (32MB) нельзя.

однако у КАБАЛа работает на 5разных сегах. я верю ему :)) , не будет же он просто так это всё придумывать!! раз реально запустилось значит возможно.

Quote (KABAL)
Да, и на NTSC MEGA DRIVE 1 версии работает, и на PAL MEGA DRIVE 2 работает, и на моей MEGA DRIVE X тоже работает
Добавлено позже:
И не нужно никаких модифицированных Сег


Сообщение отредактировал Ti_ - Четверг, 20.08.2009, 22:56
 
CARIДата: Четверг, 20.08.2009, 23:36 | Сообщение # 10
Полковник
Группа: Заблокированные
Сообщений: 152
Статус: Оффлайн
Я написать тоже что угодно могу, да и подобного наё.. было уже полно так что нужны доказательства: видео, свидетели и т.п. Пусть всех тогда научит запускать 10 мб игры на СЕГА.

 
zephyrДата: Пятница, 21.08.2009, 12:36 | Сообщение # 11
Сержант
Группа: Проверенные
Сообщений: 20
Статус: Оффлайн
Я свою позицию прямо там отписал.

Враки батенька. Все дело видимо в Вашем картридже.
Как доказательство есть игра "Street Fighter" размером в 5 Мб
работающая на собственном мапере...

Цитата от Totin

Quote
даже если взглянуть на сеговсую доку по железу, и заглянуть в раздел "карта памяти женесис" то будет видно что под ром там окно на 4 метра а дальше что то другое идет

щяс глянул в доку по сеге и после области рома идет аж до 0х800000 SEGA RESERVED а дальше z80, жойстики и/о

PS:
Но если мы не правы, то открой секрет как это возможно?
Нужно что-то большее чем простое работает и наезд на всех эмуляторных
разработчиков, дескать я самый умный.

PPS:
Цитата от KABAL

Quote
А под оригинальной Сегой что понимать?

Этим уже многое сказано.


coder
 
SmokeДата: Пятница, 21.08.2009, 12:46 | Сообщение # 12
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
Да я тоже думаю, что картридж с каким-нибудь bankswitching'ом. А видео кстати было где-то. Снято каким-то иностранцем Tomy, это он ему флэш-карт прислал
 
SmokeДата: Пятница, 21.08.2009, 13:00 | Сообщение # 13
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
Вот еще тема, советую почитать
 
МаратДата: Пятница, 21.08.2009, 23:12 | Сообщение # 14
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
Насколько я помню сега может адресовать только 8 мб адресного пространства, так как на разъем картриджа выведено только 23 из 24 адресных шин процессора. Другое дело, если там используются мапперы. Но в случае с мортал комбатом пришлось бы переписывать код игры, чтобы можно было подключать другую часть рома.
 
Ti_Дата: Суббота, 22.08.2009, 03:11 | Сообщение # 15
Лейтенант
Группа: Проверенные
Сообщений: 58
Статус: Оффлайн
Quote (TLT)
1 - На железе больше 4х метров (32MB) нельзя.
2. Он не самый =)

Quote (CARI)
Я написать тоже что угодно могу, да и подобного наё.. было уже полно так что нужны доказательства: видео, свидетели и т.п. Пусть всех тогда научит запускать 10 мб игры на СЕГА.

КАБАЛ записал видео:

Quote (KABAL)

Игра идёт на MEGA DRIVE 2:
http://ifolder.ru/13646256

Игра идёт на MEGA DRIVE X:
http://ifolder.ru/13646460

как ни крути - ЖЕЛЕЗО smile

 
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: