<PadInfoのラベルがつくアドレスの特定方法>

ラベルを移植しなくてもいいのでCtrl+Gでラベルのリストを出し、
以下の内のどちらかを見つけて下さい
"libpad: buffer addr is not 64 byte align. %08x\n"
"libpad2: buffer addr is not 64 byte align. %08x\n"
上だとpad1、下だとpad2のもの。
それぞれpadinfoを特定するだけならば簡単にできます。

先程のラベルのへジャンプした後その先頭をスペースでマークし、
F3で参照箇所へ行くとそこがscePadPortOpenの処理となります。
ちなみにここからいくつか下の処理にscePadReadらしきものがありますので
移植できるものと比べて確認してみて下さい。

後はpad1である場合

addiu  a0, zero, $001c
addiu  v1, zero, $0070
mult1  v1, s3, v1
mult  a0, s2, a0
lui   fp, $xxxx
addiu  a1, zero, $0001
addiu  v0, fp, $yyyy
このxxxxyyyyがPadInfoラベルがつくアドレスになり、

pad2である場合

lui   v1, $xxxx
addiu  v0, zero, $0334
mult  v0, s0, v0
addiu  v1, v1, $yyyy
このxxxxyyyyがPadInfoラベルがつくアドレスになります。

以上の様にpad1の方はレジスタも完全に一致する筈ですが、pad2の方はレジスタと
lui,addiu(1,2行目)が反対になる等多少の違いが出ます。(ワイルドアームズ4、龍が如くで確認)
$0334とのmult命令を目安にするといいかと思います。
pad2で実際にscePadPortOpen、PadInfoであるかは対応するシンボル残りのソフトを所持していない為
絶対とは言い切れません。但し龍が如く、ワイルドアームズ4、キングダムハーツ2では
パッドアドレスができたので的はずれではない様です

これだけでpadアドレスができそうですが、pad2の場合padinfoがあるアドレスには
パッドアドレスが入っていません。
この辺りは自然さんの掲示板でshinさんが情報提供をされていましたが
ログが見付からないので自分なりに探ってみたpad2のパッドアドレス特定方法を以下に記載します


<pad2ライブラリソフトのパッドアドレス特定方法 暫定版>

先程見つけたPadInfoのアドレスをスペースでマーク、F3で参照箇所を探していき、
次のようなものを見つけます(これはWA4のもの)

00143a40 addiu  sp, sp, $ffc0
00143a44 sd   s1, $0010(sp)
00143a48 sd   s2, $0020(sp)
00143a4c daddu  s1, a0, zero
00143a50 sd   ra, $0030(sp)
00143a54 daddu  s2, a1, zero
00143a58 jal   $00143b10
00143a5c sd   s0, $0000(sp)
00143a60 addiu  v1, zero, $0334     v1=$00000334
00143a64 lui   v0, $0055        v0=$00550000
00143a68 mult  v1, s1, v1
00143a6c addiu  v0, v0, $4cc8      v0=$00554cc8 padinfo
00143a70 addu  v0, v0, v1
00143a74 lw   a0, $0004(v0)
00143a78 bne   a0, zero, $00143a90
00143a7c nop
00143a80 jal   $00143da8
00143a84 daddu  a0, s1, zero
00143a88 bltz  v0, $00143af4
00143a8c addiu  v0, zero, $ffff     v0=$ffffffff
00143a90 jal   $00143e68              
00143a94 daddu  a0, s1, zero
00143a98 daddu  s0, v0, zero
00143a9c lbu   a2, $0003(s0)            
00143aa0 beq   a2, zero, $00143ae4
00143aa4 addiu  v0, s0, $001c
00143aa8 beq   v0, zero, $00143ae4
00143aac daddu  a0, s2, zero
00143ab0 lbu   a1, $0002(s0)
00143ab4 addu  a1, a1, s0
00143ab8 jal   $0023e7e0
00143abc addiu  a1, a1, $001c
00143ac0 addiu  v1, zero, $0334     v1=$00000334
00143ac4 lbu   a0, $0002(s0)
00143ac8 mult  v1, s1, v1
00143acc lui   a1, $0055        a1=$00550000
00143ad0 addiu  a0, a0, $001c
00143ad4 addiu  a1, a1, $4cdc      a1=$00554cdc
00143ad8 addu  a0, s0, a0
00143adc jal   $00143f30
00143ae0 addu  a1, v1, a1
00143ae4 lw   v0, $0004(s0)
00143ae8 bnel  v0, zero, $00143af4
00143aec lbu   v0, $0003(s0)
00143af0 addiu  v0, zero, $ffff     v0=$ffffffff
00143af4 ld   ra, $0030(sp)
00143af8 ld   s2, $0020(sp)
00143afc ld   s1, $0010(sp)
00143b00 ld   s0, $0000(sp)
00143b04 jr   ra
00143b08 addiu  sp, sp, $0040

このlbu x,$0003(s0)の直前のjalへジャンプ。ジャンプ先の復帰直前でlw v0, $0000(v1)と
なっているのでこの一つ下のjr raをjに変えて空きメモリへ飛ばし、所持金等にv0の値をストアさせます。
コードを使用しゲームを始めて見ると複数(確認できたのは2種類)表示される場合がありますが、
小さい方でまず次の事を試し、できなかった場合は別の値で試して下さい

出た値をアドレスとしてバイトコピーで値を調べ、パッド情報でなければアドレスにプラスしていきます
「龍が如く」での例
v0=01B90A40,所持金のワークアドレス=00165D40
所持金へコピー
51B90A40 00000004
00165D40 00000000
+4h
51B90A44 00000004
00165D40 00000000
+4h
51B90A48 00000004
00165D40 00000000
以下同様

パッドを押しながら画面を切り換える事で所持金等が変わればそこがマイナス形式の
パッドアドレスとなるようです
龍が如く、KH2ではv0+1Chがパッドアドレスになり、WA4ではv0がそのままパッドアドレスになりましたが、
WA4は記録先を頻繁に読み込む為数字の変動して判別しづらいという場合も出てしまいます
この結果からv0かv0+1Chがパッドアドレスとならない場合にアドレスをずらしていくという方法が
今のところより確実性のある特定方だと思います

長くなりましたがこれが今分かる範囲の特定方です。但しpad2のライブラリソフト3つでしか確認していない為
うまくいかない場合も出るかと思います

07.07.29 追記
ラベル"libpad2: buffer addr is not 64 byte align. %08x\n"へジャンプし、スペースでマーク、
F3で参照元へ行きます
この処理に入った段階でのa1に格納されている値+1Chした値が
pad2のパッドコードマイナス形式のアドレスになるかも
この処理に入る2〜3つ前まで処理を遡ればa1に格納されている値がわかる?
ワイルドアームズ4、幻想水滸伝X、マナケミア、キングダムハーツU ファイナルミックス+では
この方法で作成可能であると確認済み。しかしたまたまできただけかも
キングダムハーツU ファイナルミックス+が2つ前まで戻ると他が1つ前の処理でa1値の確認が可能

<pad2の形式4Mコードの作り方>

まずmemcpyを移植できるシンボル残りのソフトを用意します。
memcpyはどのソフトでも移植できるようです。pad関係と違い、更新されていないのかもしれません
関数ラベルの移植を行った後、上にあるように"libpad2: buffer addr is not 64 byte align. %08x\n"の
ラベルへジャンプ、そこからスペース、F3で参照箇所へ行きます。
あとはその処理から2つ目の処理でmemcpyへのjalがあるのでそのアドレスに+3hしたものが形式4のMコードの
データ部となります

<pad1の形式4Mコードの作り方>

ついでに最近のpad1の形式4Mコードも追加しておきます
DIntrが移植できるシンボル残りのソフトを用意します。
これもシンボル残りのソフトであればどのソフトでもかまいません
まずはscePadPortOpenのラベルに飛びます。もし移植されなければ上と同様
"libpad: buffer addr is not 64 byte align. %08x\n"の
ラベルから参照箇所へ行った先がscePadPortOpenの処理となります。
後はその処理から2つ程下の処理でDIntrへのjalがあるのでそのアドレスに+3hしたものが形式4のMコードの
データ部となります

戻る