Разработка и ромхакинг > Ромхакинг и программирование
Перевод Digimon World PSX (PAL)
<< < (2/3) > >>
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:
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии