PS2 Ninattayo Dokuro Chan и эмулятор.

  • Автор темы Автор темы Zidane
  • Дата начала Дата начала

Zidane

Well-Known Member
Регистрация
24 Янв 2009
Сообщения
3
Реакции
0
Захотелось помучать эту визуалку на эмуляторе, но столкнулся с проблемой - эмулятор не хочет грузить игру.
Сначало проходит прогрузка модулей:
sifcmd sceSifRegisterRpc (42a00): rpc_id 80000592
sifcmd sceSifRegisterRpc (42a00): rpc_id 8000059a
sifcmd sceSifRegisterRpc (42a00): rpc_id 80000593
sifcmd sceSifRegisterRpc (42a00): rpc_id 80000597
sifcmd sceSifRegisterRpc (42a00): rpc_id 80000595
sifcmd sceSifRegisterRpc (42a00): rpc_id 8000059c
Load File service.(99/11/05)
sifcmd sceSifRegisterRpc (21ed8): rpc_id 80000006
Multi Threaded Fileio module.(99/11/15)
sifcmd sceSifRegisterRpc (46fe4): rpc_id 80000001
iop heap service (99/11/03)
sifcmd sceSifRegisterRpc (46fe4): rpc_id 80000003
intrman RegisterIntrHandler (2e7e4): intr INT_CDROM, handler 267b8
intrman RegisterIntrHandler (2e7e4): intr INT_dmaCD, handler 287a0
loadmodule: fname cdrom0:\MODULES\SIO2MAN.IRX;1 args 0 arg
CDGetToc Param[0]=0, Param[1]=1
loadcore RegisterLibraryEntries (4c7d0): sio2man
intrman RegisterIntrHandler (4c7f4): intr INT_SIO2, handler 4c0b4
loadmodule: id 25, ret 0
loadmodule: fname cdrom0:\MODULES\MEDIA.IRX;1 args 0 arg
sifcmd sceSifRegisterRpc (50f5c): rpc_id 11
sifcmd sceSifRegisterRpc (50f5c): rpc_id 12
sifcmd sceSifRegisterRpc (50f5c): rpc_id 14
sifcmd sceSifRegisterRpc (50f5c): rpc_id 18
loadmodule: id 26, ret 0
loadmodule: fname cdrom0:\MODULES2\LIBSD.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (af8d8): libsd
loadmodule: id 27, ret 0
loadmodule: fname cdrom0:\MODULES2\SDRDRV.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (b1d48): sdrdrv
SDR driver version 4.0.1 (C) SCEI
Exit rsd_main
sifcmd sceSifRegisterRpc (b1d8c): rpc_id 80000701
loadmodule: id 28, ret 2
loadmodule: fname cdrom0:\MODULES2\MODHSYN.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (bdf4c): modhsyn
loadmodule: id 29, ret 0
loadmodule: fname cdrom0:\MODULES2\MODMSIN.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (c29c8): modmsin
loadmodule: id 30, ret 0
loadmodule: fname cdrom0:\MODULES2\SKSOUND.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (c4004): sksound
intrman RegisterIntrHandler (af87c): intr INT_dmaSPU, handler ad8e8
intrman RegisterIntrHandler (af87c): intr INT_dmaSPU2, handler ad8e8
intrman RegisterIntrHandler (af87c): intr INT_SPU, handler af010
intrman RegisterIntrHandler (8fb0): intr INT_RTC4, handler 89a8
loadmodule: id 31, ret 0
loadmodule: fname cdrom0:\MODULES2\SKHSYNTH.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (c5814): skhsynth
loadmodule: id 32, ret 0
loadmodule: fname cdrom0:\MODULES2\SKMSIN.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (dba20): skmsin
loadmodule: id 33, ret 0
SDR callback thread created
loadmodule: fname cdrom0:\MODULES2\STRADPCM.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (df80c): stradpcm
loadmodule: id 34, ret 0
loadmodule: fname cdrom0:\MODULES2\SKSADPCM.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (e20d4): sksadpcm
sifcmd sceSifRegisterRpc (e2100): rpc_id 80000780
loadmodule: id 35, ret 0
MFC0 Breakpoint debug Registers code = 0
MTC0 Breakpoint debug Registers code = 0
MTC0 Breakpoint debug Registers code = 0
MovieWork size(5147Kb)
MFC0 Breakpoint debug Registers code = 0
MTC0 Breakpoint debug Registers code = 0
MTC0 Breakpoint debug Registers code = 0
loadmodule: fname cdrom0:\MODULES\CDVDSTM.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (11acc0): cdvdstm
loadmodule: id 36, ret 2
loadmodule: fname cdrom0:\MODULES\PADMAN.IRX;1 args 0 arg
loadcore RegisterLibraryEntries (129e30): padman
sifcmd sceSifRegisterRpc (12a08c): rpc_id 80000100
sifcmd sceSifRegisterRpc (12a08c): rpc_id 80000101
loadmodule: id 37, ret 0

Далее игра пытается считывать(присоединять ???) игровые файлы, и это у нее не получается, потому она уходит в бесконечный цикл:

seg000:00108CC8 jal sub_10B960 # <--- загрузка модулей CDVDSTM.IRX и PADMAN.IRX
seg000:00108CCC nop
seg000:00108CD0 jal sub_12B168
seg000:00108CD4 nop
seg000:00108CD8 daddu $a0, $0, $0
seg000:00108CDC jal sub_10F460
seg000:00108CE0 nop
seg000:00108CE4 sw $0, 0x1549928
seg000:00108CEC sw $0, 0x154992C
seg000:00108CF4 li $v0, 7
seg000:00108CF8 sw $v0, 0x1549924
seg000:00108D00 li $a0, 0x1549800
seg000:00108D08 daddu $a1, $0, $0
seg000:00108D0C jal sub_10F360
seg000:00108D10 nop
seg000:00108D14 nop
seg000:00108D18
seg000:00108D18 loc_108D18: # CODE XREF: sub_108B70+1C0j
seg000:00108D18 li $a0, 2
seg000:00108D1C la $a1, aCdrom0UnionSys # "cdrom0:\\UNION\\SYSTEM.UNI"
seg000:00108D24 jal sub_157510 # <--- встает раком !!!!!!!!!!!!!!!
seg000:00108D28 nop
seg000:00108D2C li $v1, 0xFFFFFFFF
seg000:00108D30 beq $v0, $v1, loc_108D18
seg000:00108D34 nop
seg000:00108D38
seg000:00108D38 loc_108D38: # CODE XREF: sub_108B70+1E0j
seg000:00108D38 li $a0, 3
seg000:00108D3C la $a1, aCdrom0UnionScr # "cdrom0:\\UNION\\SCRIPT.UNI"
seg000:00108D44 jal sub_157510
seg000:00108D48 nop
seg000:00108D4C li $v1, 0xFFFFFFFF
seg000:00108D50 beq $v0, $v1, loc_108D38
seg000:00108D54 nop

При этом считывание с дивидюка не происходит(4 мб кэш вырублен)

Не знаю даже что и делать, толи сидеть и мучать функции загрузки этих UNI, или же мучать модули DVD...
 
Вот "exe"
SLPM_661.rar

Точнее так - оно не выходит из функции sub_157510
которая уходит в бесконечный цикл на таком участке
seg000:00157598 jal sub_157070
seg000:0015759C nop
seg000:001575A0
seg000:001575A0 loc_1575A0: # CODE XREF: sub_157510+74j
seg000:001575A0 daddu $a0, $s1, $0
seg000:001575A4 jal sub_156200
seg000:001575A8 nop
seg000:001575AC blez $v0, loc_157598


где sub_156200

seg000:00156200 sub_156200: # CODE XREF: sub_157510+94p
seg000:00156200 # sub_1580D0+94p
seg000:00156200 daddu $a1, $0, $0
seg000:00156204 b loc_156258
seg000:00156208 nop
seg000:00156208 # ---------------------------------------------------------------------------
seg000:0015620C .align 4
seg000:00156210
seg000:00156210 loc_156210: # CODE XREF: sub_156200+5Cj
seg000:00156210 sll $v0, $a1, 4
seg000:00156214 addu $v0, $a1
seg000:00156218 sll $v1, $v0, 4
seg000:0015621C li $v0, 0x157E440
seg000:00156224 addu $v0, $v1
seg000:00156228 lw $v0, 0($v0)
seg000:0015622C bne $a0, $v0, loc_156250
seg000:00156230 nop
seg000:00156234 li $v0, 0x157E444
seg000:0015623C addu $v0, $v1
seg000:00156240 lw $v0, 0($v0)
seg000:00156244 b locret_156268
seg000:00156248 nop
seg000:00156248 # ---------------------------------------------------------------------------
seg000:0015624C .align 4
seg000:00156250
seg000:00156250 loc_156250: # CODE XREF: sub_156200+2Cj
seg000:00156250 addiu $a1, 1
seg000:00156254 nop
seg000:00156258
seg000:00156258 loc_156258: # CODE XREF: sub_156200+4j
seg000:00156258 slti $v0, $a1, 0x10
seg000:0015625C bnez $v0, loc_156210
seg000:00156260 nop
seg000:00156264 li $v0, 0xFFFFFFFE
seg000:00156268
seg000:00156268 locret_156268: # CODE XREF: sub_156200+44j
seg000:00156268 jr $ra
seg000:0015626C nop


возвращает ноль с прочтенного адреса 0x157E444 в памяти.
при чтении 0x157E440 - считывается 1.



аналогичная ситуация чуть ниже по коду
seg000:001575C0 jal sub_157070
seg000:001575C4 nop
seg000:001575C8
seg000:001575C8 loc_1575C8: # CODE XREF: sub_157510+A4j
seg000:001575C8 daddu $a0, $s1, $0
seg000:001575CC jal sub_156190
seg000:001575D0 nop
seg000:001575D4 beqz $v0, loc_1575C0


где функция sub_156190 абсолютно схожа с sub_156200, отличие только в адресе 0x157E444, здесь этот адрес 0x157E448

Да, возможно здесь косяк из-за того, что v1, равен 0, помойму. Во всяком случае, даже если занопить эти циклы, все равно не работает.
Есть подозрение что это все из-за модулей, подгружаемых игрой.

Это первая игра на PS2, с которой начал разбираться, так что ещё много по адресам и принципам работы PS2 не знаю.
 
Я поверхностно посмотрел, что там происходит и пришел к выводу, что приведенный код скорее всего взаимодействует с IRX через RPC. То есть я нашел там рядом набор вызовов пользовательского RPC-сервера (судя по логу в первом сообщении он находится в модуле MEDIA.IRX), но логику работы понять я сходу не смог.

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

Вложения

Т.е. получается что rpc-сервер работает некорректно, и должен оставлять данные по тем адресам, что читают функции в цикле? Если так, то становится интересна причина некорректной работы(не совсем корректная эмуляция вызовов, или способа подгрузки модулей, не соответствующая тому, как это происходит на PS2), или же тут возможна ситуация, когда на реальной железке какие-то части кода работают не так, как они описаны в документации.

Кстати, могу создать и выложить торрент, если будет интересно, т.к. без всех файлов и модулей, что-то конкретное сложно сделать.

Кстати, какой дебаг есть попродвинутей для ps2? Просто с PS1 было хороший дебаггер, в который ещё добавил всякие бряки по сидюку(сектору на диске) и т.п.
 
Т.е. получается что rpc-сервер работает некорректно, и должен оставлять данные по тем адресам, что читают функции в цикле? Если так, то становится интересна причина некорректной работы(не совсем корректная эмуляция вызовов, или способа подгрузки модулей, не соответствующая тому, как это происходит на PS2), или же тут возможна ситуация, когда на реальной железке какие-то части кода работают не так, как они описаны в документации.
RPC - это высокоуровневая надстройка на SIF (Serial InterFace) и DMA, которые предают данные между процессорами и двумя блоками памяти. RPC-сервер действительно может писать данные в тот участок памяти, который проверяется в цикле, но делает он это через DMA-канал. RPC-сервер (внутри IRX-модуля), также как и клиент использует лишь стандартный набор функций, а вся работа с "железом" происходит внутри биоса и модулей из файла IOPRP280.IMG.

Кстати, могу создать и выложить торрент, если будет интересно, т.к. без всех файлов и модулей, что-то конкретное сложно сделать.
Я врядли смогу особо помочь, так как свободного времени сейчас очень мало, и мне пришлось свернуть все свои исследования внутренностей PS2.


Кстати, какой дебаг есть попродвинутей для ps2? Просто с PS1 было хороший дебаггер, в который ещё добавил всякие бряки по сидюку(сектору на диске) и т.п.
Я им никогда не пользовался, так ps2-девкита у меня нет, а запустить эмулятор с нормальной скоростью я не могу, так как тормозит "графика".
 
Назад
Сверху