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