Разработка и ромхакинг > Переводы игр
[PS1] Digimon World (PAL)
Leprikon:
Вот, у меня на вин7х64 все работает. биос сам кидай.
ReeDeR:
Заставил я работать это дебаггер. :) Шиндовс дофига защищается. Вот окно после брейка диалога.
8015с108 - это адрес первого символа в диалоге на диске. В окне регистров v0 80158408 - это адрес куда записывается в память отображаемый диалог, точнее это заголовок диалога, имя того кто говорит. A0 80133a2b адрес хранения на диске имени того кто говорит. А еще в регистрах s0 80158458 - Это адрес записи самих слов диалога в памяти во время отображения его. КУда копать дальше? Если я введу в окне дизасамблера адрес первого символа строки 8015с108 то там высвечивается иструкция LB v0 8267 (t4). 8267 в иструкции я смотрю это сам код первого символа,в игре это буква H. Что это может значить? :neznayu:
Mefistotel:
Попробуй поменять байты в диапазоне h76090-7610F и посмотри, как это скажется на строке.
Похоже, на массив относительных указателей, но пока не ясен порядок вычисления.
Игры у меня нет и скачать не получится в ближайшее время. :(
Mefistotel:
Хотя это не то. Твои указатели идут в самом начале файла. Посмотри, явно видна арифметическая прогрессия старших частей пойнтеров.
ReeDeR:
--- Цитата: Mefistotel от 18 Июнь 2015, 15:58:11 ---Хотя это не то. Твои указатели идут в самом начале файла. Посмотри, явно видна арифметическая прогрессия старших частей пойнтеров.
--- Конец цитаты ---
Очень рад что ты тоже взял лопату со мной копать :lol: Может ты видел что каждый диалоговой блок персонажей разделен в хексе кодом типо FE00 1900 0100 5000 1800 8A16 1900 1C00 5000. Так вот! В самом диске файлов DG несколько. Потому что игра мультиязыковая. Там еще французкий и испанский язык есть. Я сравнил эти байты с фр. версией и всё было одинаково кроме байтов 8A16. Я менял эти байты на другие с аналогичных блоков сверху и игра мне выдавала диалог другого перса! Но всеравно не понятно как игра выбирает какой именно диалог выдавать. Потому что эти диалоги выводятся в разное игровое время.
Ну и как их искать? Нулями корруптить?
Mefistotel:
Надо бы спросить у кого-нибудь типо Vit-а или Lis-a/ Они на соньки хоть что-то переводят.
Я, честно говоря, только разбирал Ogre Battle, но там всё на поверхности лежит.
Mr2:
--- Цитата: ReeDeR от 18 Июнь 2015, 15:46:19 ---8015с108 - это адрес первого символа в диалоге на диске.
--- Конец цитаты ---
Тебе нужен адрес первого байта строки в оперативной памяти. Бряк должен сработать в момент вывода диалога в игре.
Судя по скрину бряк сработал на инструкции I>8000f19d0.(адрес инструкции написан под колонкой CP0)
$8000f19d0 = LW v1, 9360(gp) ; инструкция грузит поинтер из адреса $8014BF54
$80142bf4+9360 = $8014BF54 ;адрес поинтера строки диалога в оперативной памяти.
ReeDeR:
--- Цитата: Mr2 от 18 Июнь 2015, 17:05:49 ---Тебе нужен адрес первого байта строки в оперативной памяти. Бряк должен сработать в момент вывода диалога в игре.
Судя по скрину бряк сработал на инструкции I>8000f19d0.(адрес инструкции написан под колонкой CP0)
$8000f19d0 = LW v1, 9360(gp) ; инструкция грузит поинтер из адреса $8014BF54
$80142bf4+9360 = $8014BF54 ;адрес поинтера строки диалога в оперативной памяти.
--- Конец цитаты ---
По этому адресу в памяти 00 ff 00 00 07 и тд :-\
Mr2:
--- Цитата: ReeDeR от 18 Июнь 2015, 18:36:36 ---По этому адресу в памяти 00 ff 00 00 07 и тд :-\
--- Конец цитаты ---
Посмотри по адресу $8013BF54, если там тоже нет поинтера выкладывай дамп "ram.bin".(делай его во время срабатывания бряка)
Перед дампом сделай папку "dump" в папке эмулятора.
ReeDeR:
--- Цитата: Mr2 от 18 Июнь 2015, 20:30:05 ---Посмотри по адресу $8013BF54, если там тоже нет поинтера выкладывай дамп "ram.bin".(делай его во время срабатывания бряка)
Перед дампом сделай папку "dump" в папке эмулятора.
--- Конец цитаты ---
По 8013BF54 чтото есть. Там значения меняются даже в зависимости от диалога но изменения их никак не отобразились в игре. :wall: Хотя может не то менял. Вот дамп
https://yadi.sk/d/mPwFmsdzhLQzz
Mr2:
--- Цитата: ReeDeR от 18 Июнь 2015, 23:22:27 ---По 8013BF54 чтото есть.
--- Конец цитаты ---
Там то что ты искал. 0x04c11580 переворачиваем и получаем указатель который вызвал бряк 0x8015c104.(только у тебя там был $8015C108)
В любом случае, в дампе вобще нет строчки "Have you heard?".
По адресу $8015C108 какието другие данные.(.g.......@.......@)
ReeDeR:
--- Цитата: Mr2 от 19 Июнь 2015, 00:29:30 ---
Там то что ты искал. 0x04c11580 переворачиваем и получаем указатель который вызвал бряк 0x8015c104.(только у тебя там был $8015C108)
В любом случае, в дампе вобще нет строчки "Have you heard?".
По адресу $8015C108 какието другие данные.(.g.......@.......@)
--- Конец цитаты ---
Получается указатель в файле с диалогами указатель будет как с1 04? Ладно я завтра попроверяю всё это. А насчет строчки, ты таблицу то примени которую я вложил. Или поставь кодировку shift-jis , если есть в редакторе такая. И всё увидишь.
Mr2:
--- Цитата: ReeDeR от 19 Июнь 2015, 00:48:32 ---Получается указатель в файле с диалогами указатель будет как с1 04?
--- Конец цитаты ---
Указатель это полный адрес 0x8015c104, просто в дампе он перевёрнут. Читай про порядок байт.
--- Цитата: ReeDeR от 19 Июнь 2015, 00:48:32 --- А насчет строчки, ты таблицу то примени которую я вложил. Или поставь кодировку shift-jis , если есть в редакторе такая. И всё увидишь.
--- Конец цитаты ---
А-а-а, вон оно чё. Тогда указатель строки будет 0x8015c104 а не 0x8015c108, как ты писал ранее " [1ba0] [1a00] Текст диалога",
перед строкой 4 командных байта. Теперь тебе нужно узнать кто пишет указатель в адрес $8013BF54, для этого ставим бряк:
write $адрес =0x значение
write $8013BF54 =0x8015c104
Бряк сработает когда в наш адрес впишется поинтер строки, далее по коду отслеживаем откуда грузится поинтер перед записью.
В дампе что ты мне дал поинтер $8015c104 только один, скорее всего он создаётся а не копируется.
ReeDeR:
--- Цитата: Mr2 от 19 Июнь 2015, 01:41:27 ---
Указатель это полный адрес 0x8015c104, просто в дампе он перевёрнут. Читай про порядок байт.
А-а-а, вон оно чё. Тогда указатель строки будет 0x8015c104 а не 0x8015c108, как ты писал ранее " [1ba0] [1a00] Текст диалога",
перед строкой 4 командных байта. Теперь тебе нужно узнать кто пишет указатель в адрес $8013BF54, для этого ставим бряк:
write $адрес =0x значение
write $8013BF54 =0x8015c104
Бряк сработает когда в наш адрес впишется поинтер строки, далее по коду отслеживаем откуда грузится поинтер перед записью.
В дампе что ты мне дал поинтер $8015c104 только один, скорее всего он создаётся а не копируется.
--- Конец цитаты ---
Тю блин точно. Это же адрес начала строки получился :wacko: Короче поставил я запись на чтение значения в адресе 8013BF54. Сработало на инструкции 800ee5f0 SW v0, 9360 (gp) .Инструкция Store word как работает?
Если поинтер создаётся значит его не существует в постоянном виде? И игра его создаёт сама находу? Это же капец :'(
Mr2:
--- Цитата: ReeDeR от 19 Июнь 2015, 11:21:45 ---Короче поставил я запись на чтение значения в адресе 8013BF54. Сработало на инструкции 800ee5f0 SW v0, 9360 (gp) .Инструкция Store word как работает?
--- Конец цитаты ---
Сохраняет v0 по адресу 9360+gp. Для вычисления адресов - используй эту программу.(Операция: Get RAM adress from load/store instruction)
--- Цитата: ReeDeR от 19 Июнь 2015, 11:21:45 ---Если поинтер создаётся значит его не существует в постоянном виде? И игра его создаёт сама находу? Это же капец :'(
--- Конец цитаты ---
Всё просто, игра хранит базовый адрес, и смещение строк которое нужно прибавлять к базовому адресу чтобы получить реальный адрес.
Пример:
$80156140 базовый адрес.
0x5FC4 смещение первой строки
0x22FC смещение второй строки.....
Поинтер получаем путём сложение базового адреса и смещения.
$80156140 + 0x5FC4 = pointer $8015C104
-------------
Бряк сработал на этапе сохранения реального поинтера 800ee5f0 SW v0, 9360 (gp), твоя задача отследить код, в каком месте в регистре v0 получается реальный поинтер.
Можно поставить бряк на регистр v0:
В разделе set breakpoints в выпадающем меню "Reg" выбери v0, напротив впиши адрес $8015C104, нажми кнопку "set".
Когда сработает бряк, анализируй код.
ReeDeR:
А он не сработал. 80142bf4 это gp , v0 же не будет равен gp. :neznayu: V0 может равен 8015с104?
Mr2:
--- Цитата: ReeDeR от 19 Июнь 2015, 18:23:37 --- V0 может равен 8015с104?
--- Конец цитаты ---
Да, поинтер строки $8015C104 = "Have you heard?".
ReeDeR:
--- Цитата: Mr2 от 19 Июнь 2015, 19:46:50 ---Да, поинтер строки $8015C104 = "Have you heard?".
--- Конец цитаты ---
Ну вот.Поставил я бряк на V0=8015C104. Теперь тут сработало на новой инструкции. Я такой еще не видел ^_^ 800ee5f0 ADDI v0,v0 0002 Я так понял она складывает 8015C104 +0002? и записывает это в 8013bf54. Да теперь по этому адресу адрес 80 15 C1 02.
Mr2:
--- Цитата: ReeDeR от 19 Июнь 2015, 19:56:13 ---Теперь тут сработало на новой инструкции. Я такой еще не видел ^_^
--- Конец цитаты ---
Не имеет смыла дебажить код, если ты не знаешь инструкций R3000A.
Вся тема превратится в Санта Барбару. ;)
--- Цитата: ReeDeR от 19 Июнь 2015, 19:56:13 ---800ee5f0 ADDI v0,v0 0002 Я так понял она складывает 8015C104 +0002?
--- Конец цитаты ---
Да. Но тебе нужна не она, а инструкции перед ней, чтобы понять как в v0 получился адрес 8015C104.
В общем суть поиска поинтеров через дебаггер я разжевал, а дальше эксперементы и подъём скила на новый уровень, удачи. :debile:
ReeDeR:
--- Цитата: Mr2 от 19 Июнь 2015, 20:03:23 ---Не имеет смыла дебажить код, если ты не знаешь инструкций R3000A.
Вся тема превратится в Санта Барбару. ;)
Да. Но тебе нужна не она, а инструкции перед ней, чтобы понять как в v0 получился адрес 8015C104.
--- Конец цитаты ---
Ну вот теперь несколько знаю. В будущем может кому пригодится эта тема. ^_^
Добавлено позже:
--- Цитата: Mr2 от 19 Июнь 2015, 20:03:23 ---Не имеет смыла дебажить код, если ты не знаешь инструкций R3000A.
Вся тема превратится в Санта Барбару. ;)
Да. Но тебе нужна не она, а инструкции перед ней, чтобы понять как в v0 получился адрес 8015C104.
В общем суть поиска поинтеров через дебаггер я разжевал, а дальше эксперементы и подъём скила на новый уровень, удачи. :debile:
--- Конец цитаты ---
Погоди мы поитер то нашли? :blush:
Навигация
Перейти к полной версии