PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   Русификация игр и софта для PSP (https://www.pspx.ru/forum/forumdisplay.php?f=190)
-   -   Ищу программера для помощи в модификации PSP-движка (Never7, Ever17, Remember11 и тп) (https://www.pspx.ru/forum/showthread.php?t=105110)

ErikPshat 04.02.2015 01:12

Цитата:

Сообщение от riku.kh3 (Сообщение 1093193)
Ага, вроде того. Полоски только еще останутся, 512 байт каждые 16384 или около того.

Если учесть, что одна полоса в ширину, высотой в 1 пиксель, имеет 512 байт, то убрав по 2 пикселя каждые 32 байта, получим полосу, шириной 480.
Таким образом мы убираем исривление пока только по вертикали. Но есть ещё горизонтальные смещённые линии. Поэтому нужно убирать ещё каждые 32 блока по 2 блока, первый и последний, если учесть, что один блок - теперь уже 480 байт - одна горизонтальная линия. Тогда должно быть всё выровнено. ИМХО.

Цитата:

Сообщение от riku.kh3 (Сообщение 1093193)
Кнопки O/X в игре поменять местами так и неполучилось, кстати. Все '00400000' в эльфе перебрал, а крестик в игре по прежнему работает(

Кстати, не всегда может быть u32(dword) формат 00400000. Вполне возможно, что данные записаны в u16(word), например 0040243C. А если крупные компании, то у них может быть модифицированный SDK, так там могут записать вообще извращённо, либо присвоить этим цифрам свои переменные, например b = 00004000; d = 00002000, таким образом получаем в компилированном коде 0b27100C 0d27100C.
Но я больше склоняюсь, что используется u16, как привёл пример Scorpeg.

Scorpeg 04.02.2015 01:34

У него в игре вообще какой-то адский изврат используется, я вообще не воткнул, как оно работает. Какие-то множественный шифты с ксорками, и в итоге анализатор этого всего выставляет в нужное место раскодированное значение. Сам скачай с нитроромов например, посмотри, я адрес написал с опросом клавиш. А то я в этих ассемблерах шарю на уровне "могу поменять левое с правым и посмотреть что будет".

ErikPshat 04.02.2015 01:59

Цитата:

Сообщение от riku.kh3 (Сообщение 1093208)
Scorpeg, я в ассамблере ноль, для меня все это лес дремучий. :) Если кто поможет - буду рад, конечно, но в противном случае как есть придется оставить.

Да и не надо знать. Всё логически исчисляется. Если тебе нужно просчитать дизассемблерный код, нужно знать размер заголовка ELF-файла, который записан по спецификации в позиции 0х38, и который ессно отсекается и в коде программы не учитывается. Например, у обычных PRX заголовок ELF имеет размер 0х60, а у Ever17 заголовок имеет размер 0хA0 (160 байт), поэтому нужно учитывать этот размер.
Если имеем такой код
Код:

pos_08872D28:

        beq        v0,zero,pos_08872D40
        andi        v0,a2,0x4000
        lw        v0,0x4(s0)
        ori        v0,v0,0x2000 - нажали кружок // меняем на 4000 (крестик)
        sw        v0,0x4(s0)
        andi        v0,a2,0x4000

pos_08872D40:

        beq        v0,zero,pos_08872D58
        andi        v0,a2,0x8000
        lw        v0,0x4(s0)
        ori        v0,v0,0x4000 - нажали крестик // меняем на 2000 (кружок)
        sw        v0,0x4(s0)
        andi        v0,a2,0x8000

Значит в pos_08872D28 прибавляем отсечённый заголовок 0хA0, получаем позицию 08872DC8.
Идём в файле EBOOT.BIN по этому адресу и меняем там 0020 на 0040.
Аналогично pos_08872D40 + A0 = 08872DE0.

Цитата:

Сообщение от riku.kh3 (Сообщение 1093208)
А так все полным ходом идет, сегодня с видео разобрался вон)
http://rghost.net/8mz5vR8JC

Шикарный перевод!!!

Scorpeg 04.02.2015 02:19

Эээ... Какая еще позиция 8872DC8 :) Программа начинается с 8804000, а не с нуля.

ErikPshat 04.02.2015 02:39

Цитата:

Сообщение от Scorpeg (Сообщение 1093237)
Программа начинается с 8804000, а не с нуля.

Эмм, EBOOT.BIN начинается с нуля. И размер заголовка ELF у него 0хA0. Я дебажу через PRXTool.
Если ты используешь другой виндовый дизассемблер, например JPSP, тогда у тебя адресация конечно может начинаться с другого места. Прога обычно указывает в начале адресацию первого байта. Щас скачаю, там посмотрим.

Цитата:

Сообщение от Scorpeg (Сообщение 1093233)
Сам скачай с нитроромов например

Да уж, похоже нигде больше и не найдёшь, все сидеры с торрентов молчат.
Нашел ещё русификатор на PC версию: http://enthusiasts-ts.ucoz.ru/load/s..._v1_0/5-1-0-23 (взято отсюда)

riku.kh3 04.02.2015 03:01

ErikPshat, это то понятно, в Ever17 все красиво все работает. Как самому с нуля это провернуть в другой игре для меня лес дремучий. :scratch_one-s_head: Двухбайтное значение а-ля '0040' тут уже тупым перебором не найдешь
Цитата:

Сообщение от ErikPshat (Сообщение 1093244)
Нашел ещё русификатор на PC версию

Так да, я его и вставляю.. вставил уже все что было можно, вернее сказать. Отформатировать, переносы слов расставить и недостающие куски доперевести осталось.

Scorpeg 04.02.2015 03:21

Erik, Мды. Ликбез короче. От нуба (меня) для профи (тебя).

ELF это сложная конструкция. Хедер там статический. А то, что ты посчитал хедером - не хедер, а таблица оффсетов программы.
Код:

ELF entry point is 0x108
Header size is 0x34

Program header table starts at 0x34
Program header table entry size is 0x20
Number of entries in the program header table: 3

Section header table. starts at 0x19039c
Section header table entry size is 0x28
Section header table names index is 0x25
Number of entries in the section header table: 39

iType: 1 // iOffset: a0 // iVaddr: 0 // iPaddr: ce9f4 // iFilesz: 1279bc // iMemsz: 1279bc // iFlags: 7 // iAlign: 10 //
iType: 1 // iOffset: 127a80 // iVaddr: 127a00 // iPaddr: 0 // iFilesz: 1dbb4 // iMemsz: 14fc14c // iFlags: 6 // iAlign: 80 //
iType: 700000a0 // iOffset: 145640 // iVaddr: 0 // iPaddr: 0 // iFilesz: 4aae0 // iMemsz: 0 // iFlags: 0 // iAlign: 10 //

Программный кусок 1 начинается с оффсета a0. Размер у всего файла EBOOT.BIN 1909B4 байт со всеми-всеми табличками, так что никак не может "получаем позицию 08872DC8", как ты написал, если оно начинается с адреса 0. Вот если программа начинается с адреса 8804000 - тогда да. А если с нуля - тогда 8872D34-8804000+A0=6EDD4 адрес будет. Понятно рассказал или опять китайская грамота?

Scorpeg добавил 04.02.2015 в 03:21
Цитата:

Сообщение от riku.kh3 (Сообщение 1093245)
Так да, я его и вставляю.. вставил уже все что было можно, вернее сказать. Отформатировать, переносы слов расставить и недостающие куски доперевести осталось.

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

---------------

Чем покадрово редактировать pmf, чтобы потом аудио не убежало?

riku.kh3 04.02.2015 03:47

Цитата:

Сообщение от Scorpeg (Сообщение 1093246)
Даешь автопереносы :) Я в Ever17 встроил (типа похвастался, да, хотя вроде уже и говорил где-то), точнее переписал таблицу оригинальных непереносимых глифов и изменил начало строчки (а то пробелы перли в каждой новой строке).

Я хз, если честно, как это сделать, буду прогонять скрипты через прогу, которая будет все высчитывать и вставлять опкоды с переходом строки. Места с нестандартным выводом текста тока еще есть - их придется вручную все проверять :scratch_one-s_head:
Цитата:

Сообщение от Scorpeg (Сообщение 1093246)
Чем покадрово редактировать pmf, чтобы потом аудио не убежало?

Так не pmf редактируй, а в несжатый перегони и с ним уже работай, я в VirtualDub'е делаю, там свободно с фреймами работать - удалять/вставлять куда захочется можно.

ErikPshat 04.02.2015 04:07

Вложений: 1
Цитата:

Сообщение от Scorpeg (Сообщение 1093246)
ELF это сложная конструкция. Хедер там статический. А то, что ты посчитал хедером - не хедер, а таблица оффсетов программы.

Ну ты как-то сложно всё воспринимаешь :) Я же прекрасно знаю формат ELF в PSP. Это не таблица оффсетов, а самый настоящий Хедер, который при исполнении в память отбрасывается и остаётся только программный код, естессна со всеми указателями на смещения. Если интересно, то я тебе скину быстрый набросок структуры ELF в HBK для HexWorkshop: Вложение 10632
Не поленись и посмотри.
Открой декриптованный EBOOT.BIN(BOOT.BIN) в Hex Workshop, открой мой HBK и увидишь все позиции и смещения с описаниями.

Если ты используешь декомпилятор JPCSP, то конечно тебе не нужно прибавлять A0, т.к. он ведёт отсчёт от виндовых смещений. Обычно в Винде идёт адресация памяти в экзешниках от 0х4000, но не факт, тут ещё прибавки памяти самой сторонней программы, через которую открывается другая программа. Собсно декомпилятор сам показывает, откуда идёт отсчёт.

Цитата:

Сообщение от Scorpeg (Сообщение 1093246)
Чем покадрово редактировать pmf, чтобы потом аудио не убежало?

Инструментария предостаточно:
  1. https://www.pspx.ru/forum/showthread.php?t=101184
  2. https://www.pspx.ru/forum/showthread.php?t=103400
  3. https://www.pspx.ru/forum/showthread.php?t=85538

ErikPshat 04.02.2015 05:47

Ever17
 
Вложений: 1
Цитата:

Сообщение от Scorpeg (Сообщение 1093200)
Собсна элементарно меняем ori v0,v0,0x4000 на ori v0,v0,0x2000 и наоборот - и готово.

Попробую по другому объяснить...
Вот твой код
Код:

z_un_08872be0:

        addiu        sp,sp,-0x70
        sw        s0,0x60(sp)
        li        a1,0x6
        move        s0,a0
        sw        ra,0x64(sp)
        jal        zz_sceCtrlReadBufferPositive - собственно ты сюда должен вывалиться из дебуггера
        move        a0,sp
---

тут скипнуто

---

pos_08872D28:

        beq        v0,zero,pos_08872D40
        andi        v0,a2,0x4000
        lw        v0,0x4(s0)
        ori        v0,v0,0x2000 - нажали кружок // меняем на 4000 (крестик)
        sw        v0,0x4(s0)
        andi        v0,a2,0x4000

pos_08872D40:

        beq        v0,zero,pos_08872D58
        andi        v0,a2,0x8000
        lw        v0,0x4(s0)
        ori        v0,v0,0x4000 - нажали крестик // меняем на 2000 (кружок)
        sw        v0,0x4(s0)
        andi        v0,a2,0x8000

Вот мой код (PRXTool v1.1)
Код:

; ======================================================
; Subroutine sub_0006EBE0 - Address 0x0006EBE0
sub_0006EBE0:                ; Refs: 0x0006F014
        0x0006EBE0: 0x27BDFF90 '...'' - addiu      $sp, $sp, -112
        0x0006EBE4: 0xAFB00060 '`...' - sw        $s0, 96($sp)
        0x0006EBE8: 0x24050006 '...$' - li        $a1, 6
        0x0006EBEC: 0x00808021 '!...' - move      $s0, $a0
        0x0006EBF0: 0xAFBF0064 'd...' - sw        $ra, 100($sp)
        0x0006EBF4: 0x0C03395E '^9..' - jal        sceCtrlReadBufferPositive  - собственно ты сюда должен вывалиться из дебуггера
        0x0006EBF8: 0x03A02021 '! ..' - move      $a0, $sp

---

тут скипнуто

---

loc_0006EC50:                ; Refs: 0x0006EC30
        0x0006EC50: 0x10400005 '..@.' - beqz      $v0, loc_0006EC68
        0x0006EC54: 0x30C20008 '...0' - andi      $v0, $a2, 0x8
        0x0006EC58: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006EC5C: 0x34420001 '..B4' - ori        $v0, $v0, 0x1
        0x0006EC60: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006EC64: 0x30C20008 '...0' - andi      $v0, $a2, 0x8

loc_0006EC68:                ; Refs: 0x0006EC50
        0x0006EC68: 0x10400005 '..@.' - beqz      $v0, loc_0006EC80
        0x0006EC6C: 0x30C20010 '...0' - andi      $v0, $a2, 0x10
        0x0006EC70: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006EC74: 0x34420008 '..B4' - ori        $v0, $v0, 0x8
        0x0006EC78: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006EC7C: 0x30C20010 '...0' - andi      $v0, $a2, 0x10

loc_0006EC80:                ; Refs: 0x0006EC68
        0x0006EC80: 0x10400005 '..@.' - beqz      $v0, loc_0006EC98
        0x0006EC84: 0x30C20020 ' ..0' - andi      $v0, $a2, 0x20
        0x0006EC88: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006EC8C: 0x34420010 '..B4' - ori        $v0, $v0, 0x10
        0x0006EC90: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006EC94: 0x30C20020 ' ..0' - andi      $v0, $a2, 0x20

loc_0006EC98:                ; Refs: 0x0006EC80
        0x0006EC98: 0x10400005 '..@.' - beqz      $v0, loc_0006ECB0
        0x0006EC9C: 0x30C20040 '@..0' - andi      $v0, $a2, 0x40
        0x0006ECA0: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ECA4: 0x34420020 ' .B4' - ori        $v0, $v0, 0x20
        0x0006ECA8: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ECAC: 0x30C20040 '@..0' - andi      $v0, $a2, 0x40

loc_0006ECB0:                ; Refs: 0x0006EC98
        0x0006ECB0: 0x10400005 '..@.' - beqz      $v0, loc_0006ECC8
        0x0006ECB4: 0x30C20080 '...0' - andi      $v0, $a2, 0x80
        0x0006ECB8: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ECBC: 0x34420040 '@.B4' - ori        $v0, $v0, 0x40
        0x0006ECC0: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ECC4: 0x30C20080 '...0' - andi      $v0, $a2, 0x80

loc_0006ECC8:                ; Refs: 0x0006ECB0
        0x0006ECC8: 0x10400005 '..@.' - beqz      $v0, loc_0006ECE0
        0x0006ECCC: 0x30C20100 '...0' - andi      $v0, $a2, 0x100
        0x0006ECD0: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ECD4: 0x34420080 '..B4' - ori        $v0, $v0, 0x80
        0x0006ECD8: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ECDC: 0x30C20100 '...0' - andi      $v0, $a2, 0x100

loc_0006ECE0:                ; Refs: 0x0006ECC8
        0x0006ECE0: 0x10400005 '..@.' - beqz      $v0, loc_0006ECF8
        0x0006ECE4: 0x30C20200 '...0' - andi      $v0, $a2, 0x200
        0x0006ECE8: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ECEC: 0x34420400 '..B4' - ori        $v0, $v0, 0x400
        0x0006ECF0: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ECF4: 0x30C20200 '...0' - andi      $v0, $a2, 0x200

loc_0006ECF8:                ; Refs: 0x0006ECE0
        0x0006ECF8: 0x10400005 '..@.' - beqz      $v0, loc_0006ED10
        0x0006ECFC: 0x30C21000 '...0' - andi      $v0, $a2, 0x1000
        0x0006ED00: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ED04: 0x34420800 '..B4' - ori        $v0, $v0, 0x800
        0x0006ED08: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ED0C: 0x30C21000 '...0' - andi      $v0, $a2, 0x1000

loc_0006ED10:                ; Refs: 0x0006ECF8
        0x0006ED10: 0x10400005 '..@.' - beqz      $v0, loc_0006ED28
        0x0006ED14: 0x30C22000 '. .0' - andi      $v0, $a2, 0x2000
        0x0006ED18: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ED1C: 0x34421000 '..B4' - ori        $v0, $v0, 0x1000
        0x0006ED20: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ED24: 0x30C22000 '. .0' - andi      $v0, $a2, 0x2000

loc_0006ED28:                ; Refs: 0x0006ED10
        0x0006ED28: 0x10400005 '..@.' - beqz      $v0, loc_0006ED40
        0x0006ED2C: 0x30C24000 '.@.0' - andi      $v0, $a2, 0x4000
        0x0006ED30: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ED34: 0x34422000 '. B4' - ori        $v0, $v0, 0x2000
        0x0006ED38: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ED3C: 0x30C24000 '.@.0' - andi      $v0, $a2, 0x4000

loc_0006ED40:                ; Refs: 0x0006ED28
        0x0006ED40: 0x10400005 '..@.' - beqz      $v0, loc_0006ED58
        0x0006ED44: 0x30C28000 '...0' - andi      $v0, $a2, 0x8000
        0x0006ED48: 0x8E020004 '....' - lw        $v0, 4($s0)
        0x0006ED4C: 0x34424000 '.@B4' - ori        $v0, $v0, 0x4000
        0x0006ED50: 0xAE020004 '....' - sw        $v0, 4($s0)
        0x0006ED54: 0x30C28000 '...0' - andi      $v0, $a2, 0x8000


Теперь разберём мой код...
Код:

0x0006EC5C: 0x34420001 '..B4' - ori        $v0, $v0, 0x1    - кнопка "SELECT"
0x0006EC74: 0x34420008 '..B4' - ori        $v0, $v0, 0x8    - кнопка "START"
0x0006EC8C: 0x34420010 '..B4' - ori        $v0, $v0, 0x10  - кнопка "Вверх"
0x0006ECA4: 0x34420020 ' .B4' - ori        $v0, $v0, 0x20  - кнопка "Вправо"
0x0006ECBC: 0x34420040 '@.B4' - ori        $v0, $v0, 0x40  - кнопка "Вниз"
0x0006ECD4: 0x34420080 '..B4' - ori        $v0, $v0, 0x80  - кнопка "Влево"
0x0006ECEC: 0x34420400 '..B4' - ori        $v0, $v0, 0x400  - ?
0x0006ED04: 0x34420800 '..B4' - ori        $v0, $v0, 0x800  - ?
0x0006ED1C: 0x34421000 '..B4' - ori        $v0, $v0, 0x1000 - кнопка "Треугольник"
0x0006ED34: 0x34422000 '. B4' - ori        $v0, $v0, 0x2000 - кнопка "Круг"
0x0006ED4C: 0x34424000 '.@B4' - ori        $v0, $v0, 0x4000 - кнопка "Крест"

Теперь по поводу смещения в файле EBOOT.BIN (BOOT.BIN), поясню на примере искомой кнопки "Круг" и "Крест":

Цитата:

0x0006ED34: 0x34422000 '. B4' - ori $v0, $v0, 0x2000 - кнопка :circle:
0x0006ED4C: 0x34424000 '.@B4' - ori $v0, $v0, 0x4000 - кнопка :cross:
На первом месте указано смещение (задом наперёд)
  • Смещение: 0x0006ED34 + A0 = 0x0006EDD4
  • Смещение: 0x0006ED4C + A0 = 0x0006EDEC
На втором месте код в этих смещениях: 0x34422000 и 0x34424000, где 0x3442 - идентификатор этой функции.
Вложение 10638

Scorpeg 04.02.2015 11:05

Не, ori это в Ever17. И там я проверил, у меня работает (я ж написал про это).

А в этой Sharin вообще хитрейший план, как я тут написал: https://www.pspx.ru/forum/showpost.ph...1&postcount=67

А те данные что ты нашел - вообще непонятно что. Как я уже говорил, он туда никогда не попадает, значит это 90% что-то левое.

riku.kh3 04.02.2015 11:14

Цитата:

Сообщение от ErikPshat (Сообщение 1093272)
Потома игра большая и там много в каких местах есть входы и выходы, например в опции настроек, в системных сообщениях и т.п., поэтому не может быть код кнопок только в одном месте.

В Ever17 вообще все красиво в этом плане. :) Один раз заменил - и во всей игре, менюшках, диалогах сохранений и т.п. они местами меняются.

Scorpeg 04.02.2015 11:45

В Ever17 вообще как по учебнику :) А у тебя ровно так же - одна процедура на всех, не переживай. Быть бы мне еще поопытней, чтобы код раскурить без хаков - вообще была бы радость. Но ни опыта ни времени нет :( Поэтому если Erik ничего не придумает - сделаю хак на хаке в какую-нибудь текстовую область eboot и посмотрим, взлетит ли.

Вообще тут Yoti какой-то план тебе в личку хотел предложить. Есть кстати еще более хитрый план - написать обертку, которая будет делать свап кнопок и сделать хук на вызов sceCtrlRead. Только я под PSP никогда ничего не писал, и вот это для меня точно совсем темный лес. Но чисто теоретически это должно работать.

riku.kh3 04.02.2015 12:23

Цитата:

Сообщение от Scorpeg (Сообщение 1093278)
В Ever17 вообще как по учебнику :) А у тебя ровно так же - одна процедура на всех, не переживай. Быть бы мне еще поопытней, чтобы код раскурить без хаков - вообще была бы радость. Но ни опыта ни времени нет :( Поэтому если Erik ничего не придумает - сделаю хак на хаке в какую-нибудь текстовую область eboot и посмотрим, взлетит ли.

Вообще тут Yoti какой-то план тебе в личку хотел предложить. Есть кстати еще более хитрый план - написать обертку, которая будет делать свап кнопок и сделать хук на вызов sceCtrlRead. Только я под PSP никогда ничего не писал, и вот это для меня точно совсем темный лес. Но чисто теоретически это должно работать.

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

Scorpeg 04.02.2015 12:34

Как не используется? Есть же в списке функций.

riku.kh3 04.02.2015 12:36

Цитата:

Сообщение от Scorpeg (Сообщение 1093281)
Как не используется? Есть же в списке функций.

Может эмуль ее грузит? В ибуте NID'а на нее не находится. :scratch_one-s_head:

Scorpeg 04.02.2015 12:58

Не, эмуль ничего не грузит. Вызов лежит по адресу 088107D4 (ну или если прямо в eboot в хекс-редакторе смотреть, то по смещению C874).

Код:

        jal        zz_sceImposeSetLanguageMode

riku.kh3 04.02.2015 13:27

Не похоже, тогда, чтобы она на что-то влияла. Если занулить ничего не меняется.

ErikPshat 04.02.2015 13:41

riku.kh3, ну она есть в ибуте. Вот она вся функция:
Код:

; Data ref 0x00115130 "Total free memory 0x%08X.\nMax free memory 0x%08X.\n"
        0x0000C7CC: 0x24845130 '0Q.$' - addiu      $a0, $a0, 20784
        0x0000C7D0: 0x00002025 '% ..' - move      $a0, $zr
        0x0000C7D4: 0x0C045016 '.P..' - jal        sceImposeSetLanguageMode
        0x0000C7D8: 0x00002825 '%(..' - move      $a1, $zr
        0x0000C7DC: 0x3C040011 '...<' - lui        $a0, 0x11
        0x0000C7E0: 0x3C050001 '...<' - lui        $a1, 0x1
        0x0000C7E4: 0x00003025 '%0..' - move      $a2, $zr

Код:

; Subroutine sceImposeSetLanguageMode - Address 0x00114058
; Imported from sceImpose
sceImposeSetLanguageMode:                ; Refs: 0x0011408C 0x0000C7D4
        0x00114058: 0x03E00008 '....' - jr        $ra
        0x0011405C: 0x00000000 '....' - nop

Только язык японский какой код имеет? Думаю 0х1

Scorpeg 04.02.2015 13:41

А чего должно меняться, если по умолчанию японская раскладка всунута и язык?

Я думаю 0 у японского языка. Нам зачем вообще японский? Английский надо. И где параметры передаются? По стеку же поди.

ErikPshat 04.02.2015 13:51

Если в файле не находятся коды кнопок (скорее они завуалированы), то вполне возможно, что игра использует языковые нормы. Если выставлено на японию, то и кнопки будут браться в соответствии с японской раскладкой.
Можно попробовать наобум поменять региональность. Возможно япония - это 0х1, а россия 0х8
Код:

0x0000C7E0: 0x3C050001 '...<' - lui        $a1, 0x1
Попробовать по адресу 0х0000C880 сменить 1 на 8.

riku.kh3 04.02.2015 14:03

http://bbs.blacklabel-translations.c...?tid=35&pid=84

Не факт, короче, что в самой игре используется, скорее в HOME-менюшке только.

ErikPshat 04.02.2015 14:38

Хотя проверил, не канает.

Тогда получается, что нужно здесь перед и после сменить регистр $zr (zero) на 1.
Код:

0x0000C7D0: 0x00002025 '% ..' - move      $a0, $zr
0x0000C7D4: 0x0C045016 '.P..' - jal        sceImposeSetLanguageMode
0x0000C7D8: 0x00002825 '%(..' - move      $a1, $zr

Нет, так тоже не катит.

А-ха-ха :D, при нажатии на кнопку :home: раньше на японском предлагалось выйти по кнопке :circle:
А теперь написано по-русски "Выйти из игры" - "Да - Нет" и выходит по :cross:
Но в самой игре кнопки так и остались.

riku.kh3 04.02.2015 14:54

ErikPshat, выпиши, пожалуйста, какие там точно оффсеты в EBOOT'е поменять, пригодится, однозначно. У меня просто самой PSP нет, даже не проверить что там по нажатию HOME выскакивает. Не то может чего поменяю и даже не пойму получилось или нет :)

ErikPshat 04.02.2015 15:01

Может нужно выполнить ещё 2-ой шаг инструкции:
Цитата:

Код:

li    $a0, <number from 0 to 11>
jal    sceImposeSetLanguageMode()
li    $a1, <number 0 or 1>

to change the move instruction to li instruction, open the file with hex editor and patch the values as follows:

$a0: 2120 xxxx -> xxxx 0424
$a1: 2128 xxxx -> xxxx 0524

where xxxx is the value you want (it's 0000 ($zero) for japanese settings)
to set the language to english and X as OK button, change them to

$a0: 0100 0424
$a1: 0100 0524

the 0424 and 0524 will change the move instruction to li instruction, and the xxxx are the desired value.
А у нас этот код лежит здесь
Код:

0x0000C7DC: 0x3C040011 '...<' - lui        $a0, 0x11
0x0000C7E0: 0x3C050001 '...<' - lui        $a1, 0x1

Правда номера функций у нас не сходятся.



Цитата:

Сообщение от riku.kh3 (Сообщение 1093293)
выпиши, пожалуйста, какие там точно оффсеты в EBOOT'е поменять, пригодится, однозначно

Ну так к адресу нужно прибавить размер ELF-заголовка A0
Код:

0x0000C7D0: 0x00002025 '% ..' - move      $a0, $zr
0x0000C7D8: 0x00002825 '%(..' - move      $a1, $zr

  • 0x0000C7D0 + A0 = 0x0000C870 - по этому адресу меняем на значение 25200001
  • 0x0000C7D8 + A0 = 0x0000C878 - по этому адресу меняем на значение 25280001

Scorpeg 04.02.2015 15:22

Короче для игры таки придётся какой-то хитрый план реализовывать. Кто раскурит процедуру опроса кнопок для riku? :) Это ерунда с языком влияет только на экран выхода.

riku.kh3 04.02.2015 15:26

ErikPshat,
Как я понял, если просто '00' на '08' заменить, то li на move изменится, а если как там написано, то:
Нажмите для увеличения

Выглядит правильно? 'li a0,0x8' мы в итоге имеем и 'li a1,0x1' :scratch_one-s_head:

В ELF получается
Offset 0xC870: 25200000 --> 08000424
Offset 0xC878: 25280000 --> 01000524

Проверить возможности нет.

Цитата:

Сообщение от Scorpeg (Сообщение 1093297)
Короче для игры таки придётся какой-то хитрый план реализовывать. Кто раскурит процедуру опроса кнопок для riku? :) Это ерунда с языком влияет только на экран выхода.

Да, тут все грустно. Во многих других играх зато эта ерунда на все остальное тоже влияет, но тут не судьба :(

ErikPshat 04.02.2015 16:01

riku.kh3,
Эмм, странно. У меня так и осталось move. Только регистр сменился с $zr на $t0.
Это просто твой дебаггер по-своему коррелирует функцию, хотя мы меняем действительно сам номер функции, а не её значение.
Пользуйся лучше PRXTool, это же специально для PSP разработанный дебаггер, а то мы разговариваем на разных языках.
По идее у тебя адрес правильно указывает.
  • 0x0000C7D0 + 0x08804000 = 0x088107D0 - по этому адресу меняем на значение 25200001
  • 0x0000C7D8 + 0x08804000 = 0x088107D8 - по этому адресу меняем на значение 25280001
У меня теперь так показывает:
Код:

        0x0000C7D0: 0x01002025 '% ..' - move      $a0, $t0
        0x0000C7D4: 0x0C045016 '.P..' - jal        sceImposeSetLanguageMode
        0x0000C7D8: 0x01002825 '%(..' - move      $a1, $t0

Цитата:

Сообщение от Scorpeg (Сообщение 1093297)
Это ерунда с языком влияет только на экран выхода.

Ну это тоже нужный момент в плане русификации игры :)

riku.kh3 04.02.2015 16:15

ErikPshat,
Цитата:

Сообщение от ErikPshat (Сообщение 1093301)
Эмм, странно. У меня так и осталось move. Только регистр сменился с $zr на $t0.
Это просто твой дебаггер по-своему коррелирует функцию, хотя мы меняем действительно сам номер функции, а не её значение.
Пользуйся лучше PRXTool, это же специально для PSP разработанный дебаггер, а то мы разговариваем на разных языках.
По идее у тебя адрес правильно указывает.
  • 0x0000C7D0 + 0x08804000 = 0x088107D0 - по этому адресу меняем на значение 25200001
  • 0x0000C7D8 + 0x08804000 = 0x088107D8 - по этому адресу меняем на значение 25280001
У меня теперь так показывает:
Код:

        0x0000C7D0: 0x01002025 '% ..' - move      $a0, $t0
        0x0000C7D4: 0x0C045016 '.P..' - jal        sceImposeSetLanguageMode
        0x0000C7D8: 0x01002825 '%(..' - move      $a1, $t0


Насчет дебаггера ты прав, в нетронутом оригинале он у меня так показывает:
Нажмите для увеличения

Там явно $move должен стоять.

Но в посте по предыдущей ссылке написано, что с 'move $a1, $at' хоть и работает, но нестабильно и может проблемы вызывать:
Цитата:

now, you can patch it to english simply by navigating to the address of $a1 and setting it to 0100, however this method is prone to errors as it may conflict with previous instructions used elsewhere. This method patches the $zero value from register $a1 to $at and it just so happens that $at seems to nearly always have a value of 1. However this method causes some odd behavior as it patches both language and button mapping to 1 somehow overwriting the setting of register $a0.
Поэтому и решил сделать как там и заменить его на $li, ну и код языка, тоже, Русский вместо английского.

riku.kh3 04.02.2015 19:41

Вложений: 1
Сейчас посмотрел - процедура, в которой sceCtrlReadBufferPositive используется у Sharin no Kuni точно такая же, как в другой 5pb игре - Corpse Party BoS... но у той игры есть английская версия с крестиком в качестве выбора. Не знаю, может поможет если на различия посмотреть (в английской они есть).
Нажмите для увеличения

Scorpeg 04.02.2015 20:02

Может помочь, осталось только блин теперь скачать эту корпсе парти :) А еще проще скачать японскую и английскую корпсы и сравнить.

riku.kh3 04.02.2015 20:12

У меня обе японская и английская. В японской Corpse Party там все точно так же, как и в Sharin no Kuni, можно сразу с ней сравнивать.

Scorpeg 04.02.2015 20:19

Ну у тебя текст, а мне бы пощупать.

Из твоих данных понятно, что они заменили:

Код:

        0x000D2AA0: 0x9605000A '....' - lhu        $a1, 10($s0)
        0x000D2AA4: 0xAE000038 '8...' - sw        $zr, 56($s0)
        0x000D2AA8: 0x30A40001 '...0' - andi      $a0, $a1, 0x1
        0x000D2AAC: 0x10800033 '3...' - beqz      $a0, loc_000D2B7C
        0x000D2AB0: 0xA600003E '>...' - sh        $zr, 62($s0)

на вот это:

Код:

loc_000B3664:
        0x000B3664: 0xAE000038 '8...' - sw        $zr, 56($s0)
        0x000B3668: 0x8E040004 '....' - lw        $a0, 4($s0)
        0x000B366C: 0x10800010 '....' - beqz      $a0, loc_000B36B0
        0x000B3670: 0xA600003E '>...' - sh        $zr, 62($s0)
        0x000B3674: 0x0C024FBB '.O..' - jal        sub_00093EEC
        0x000B3678: 0x86040024 '$...' - lh        $a0, 36($s0)
        0x000B367C: 0x28440040 '@.D(' - slti      $a0, $v0, 64
        0x000B3680: 0x10800006 '....' - beqz      $a0, loc_000B369C
        0x000B3684: 0x00000000 '....' - nop       
        0x000B3688: 0x0C024FBB '.O..' - jal        sub_00093EEC
        0x000B368C: 0x86040026 '&...' - lh        $a0, 38($s0)
        0x000B3690: 0x28440040 '@.D(' - slti      $a0, $v0, 64
        0x000B3694: 0x54800007 '...T' - bnezl      $a0, loc_000B36B4
        0x000B3698: 0x9605000A '....' - lhu        $a1, 10($s0)

loc_000B369C:
        0x000B369C: 0x0C03AEE9 '....' - jal        sceKernelPowerTick
        0x000B36A0: 0x00002025 '% ..' - move      $a0, $zr
        0x000B36A4: 0x3C04000F '...<' - lui        $a0, 0xF
        0x000B36A8: 0x0C024BBC '.K..' - jal        sub_00092EF0
; Data ref 0x000F633C "backlight on.\n"
        0x000B36AC: 0x2484633C '<c.$' - addiu      $a0, $a0, 25404

loc_000B36B0:
        0x000B36B0: 0x9605000A '....' - lhu        $a1, 10($s0)

loc_000B36B4:
        0x000B36B4: 0x30A40001 '...0' - andi      $a0, $a1, 0x1
        0x000B36B8: 0x10800034 '4...' - beqz      $a0, loc_000B378C
        0x000B36BC: 0x30A40002 '...0' - andi      $a0, $a1, 0x2

Чето мне кажется, что это всё какая-то левая ненужная лабуда, к опросу клавиш не относящаяся. Экрану подсветку включают. Хотя есть одна идея...

riku.kh3 04.02.2015 20:42

Совсем не поможет, значит? :scratch_one-s_head:

Scorpeg 04.02.2015 21:05

Ну надо скачать эту корпсе парти, посмотреть. Качается с нитроромов, осталось 16 часов :)

Но эти изменения мне напоминают просто включение подсветки, если долго ничего не нажимаешь. Вот скачаю и точно скажу. Ну или сам всё занули, чтобы стало как в японской версии - если не начнет работать как японская, значит это не оно.

ErikPshat 05.02.2015 08:19

Вложений: 1
Похоже с кнопками труба. Читать массивы асма замучаешься, но при сильном желании можно :)

Что могу ещё предложить, так это подписать EBOOT.BIN оригинальной родной подписью (во вложении)
Ложим декриптованный EBOOT.prx, запускаем батник, получаем подписанный EBOOT.BIN

Scorpeg 05.02.2015 09:24

А что это дает?

Короче скачалась игра, эти изменения - это не оно. Если их занулить и сделать процедуру как в японской версии - ничего не меняется. Где-то в проверке считанных данных это всё устанавливается, в общем. А не в читалке (что в принципе логично). Это просто в Ever17 была тупая читалка, где можно было другое значение легко подсунуть. А тут приходит сразу битмаска. В принципе есть мысль, взять в j ra воткнуть j моя процедура, а там в процедуре уже сделать анализатор - если нажали кружок - выключаем бит кружка и включаем бит крестика и наоборот.

Блин, вот почему дебаггер не может мне в определенном диапазоне указать, какие ячейки памяти менялись во время процедуры :( Логирование же наше всё.

ErikPshat 05.02.2015 10:50

Цитата:

Сообщение от Scorpeg (Сообщение 1093340)
А что это дает?

Да просто, придаёт оригинальный заголовок, вид и размер экзешнику с официальной подписью.
Чтобы никто не догадался, что кто-то там поковырялся :)

Это хреново, что дебаггер не отлавливает нажатия клавиш. Может они в SYSTEM.CFG находятся?

Тут ещё нарыл несколько ссылок, думаю вы это всё давно видели

Yoti 05.02.2015 12:02

Заметка для меня:
e_ehsize + (e_phnum * e_phentsize) + (e_shnum * e_shentsize)

Scorpeg 05.02.2015 12:32

Yoti, могу тебе скрипт дать на php, который расширяет ELF-файлы и вставляет новые секции (иначе зачем тебе размеры хедеров?). Я правда только для Ever17 его тестировал. И он говнокод :) И я его решил не использовать в финальной версии, а досунуть свой код после шрифта просто. Он же всегда в памяти.

Erik, ну я все ссылки видел по Ever17. Как бы я с dsp (переводчик Ever17 и автор AE) общался как раз по поводу его перевода.

Scorpeg добавил 05.02.2015 в 12:11
Цитата:

Сообщение от ErikPshat (Сообщение 1093343)
Это хреново, что дебаггер не отлавливает нажатия клавиш. Может они в SYSTEM.CFG находятся?

Не, 99% что нет. Можешь для теста поменять от какой-нибудь игры сустем с сустем от этой - он вроде только на инфу в XMB влияет.

Scorpeg добавил 05.02.2015 в 12:32
Короче, план такой.

По адресу 088A1108 (сразу через 1 инструкцию после jal zz_sceCtrlReadBufferPositive) встраиваю j XXXX
По адресу XXXX размещаю чето типа:
Код:

        lw        a0,0x4(sp) - это в a0 битовая маска нажатых клавиш
        andi a1,a0,4000
        je a1,4000,x1 - прыгаем если 4000 (хз есть ли такая команда, я пишу из головы)
        andi a1,a0,2000
        je a1,4000,x2 - прыгаем если 2000 (4000 точно не нажат)
        j return

x1        // тут у нас значит установлен 4000, значит надо поставить 2000
        // однако 2000 тоже может быть установлен, поэтому надо сначала это проверить

        andi a1,a0,2000
        je a1,2000,return // это означает что оба два у нас установлены, поэтому менять нечего

        // иначе это значит, что 2000 не нажат, а 4000 нажат
        // убираем 4000 и ставим 2000

        xori a0,a0,4000
        ori a0,a0,2000

        j return

x2        // тут у нас значит 4000 не нажат, а нажат только 2000
        xori a0,a0,2000
        ori a0,a0,4000

        j return

Как план?


Текущее время: 02:37. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.