<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である場合
pad2である場合
以上の様にpad1の方はレジスタも完全に一致する筈ですが、pad2の方はレジスタと
lui,addiu(1,2行目)が反対になる等多少の違いが出ます。(ワイルドアームズ4、龍が如くで確認)
$0334とのmult命令を目安にするといいかと思います。
pad2で実際にscePadPortOpen、PadInfoであるかは対応するシンボル残りのソフトを所持していない為
絶対とは言い切れません。但し龍が如く、ワイルドアームズ4、キングダムハーツ2では
パッドアドレスができたので的はずれではない様です
これだけでpadアドレスができそうですが、pad2の場合padinfoがあるアドレスには
パッドアドレスが入っていません。
この辺りは自然さんの掲示板でshinさんが情報提供をされていましたが
ログが見付からないので自分なりに探ってみたpad2のパッドアドレス特定方法を以下に記載します
<pad2ライブラリソフトのパッドアドレス特定方法 暫定版>
先程見つけたPadInfoのアドレスをスペースでマーク、F3で参照箇所を探していき、
次のようなものを見つけます(これはWA4のもの)
この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コードも追加しておきます