過去、何度かパッドアドレスを求める方法を紹介しましたが
こんな方法もあるんだという事を紹介します。

この方法は自分でパッドアドレスを決める事が出来
さらに形式もマイナスかプラスかを自由に選択できます
ただし簡単なプログラムが組める程度の知識がないと
これを使うのは難しいと思いますので注意して下さい
侍道2を題材にどういう方法か見て行きましょう。

まず、PadInfoが張られているアドレスを調べます
侍道2では002EE410に存在します。

次に、毎フレームコールされている関数を探します
「VSync」や「scePadRead」などがありますが
常に呼ばれてる関数は結構あるので他の場所でも良いでしょう
形式4マスターコードのフックに使ってみて
フラッシュコードの効果が続いていれば候補になります。

上記2つが見つかったら、プログラムを組みます
今回はアドレス000F0000からを使用します。


まず、PadInfoに格納されている数値を読み込みます
「PadInfoに入っている数値+2h」がパッドアドレスになるので
その数値を利用して新しいパッドアドレスを作るからです
そのためにこのようにプログラムを組みます
lui t0, $002f
lw t1, $e410(t0) 
この2行でt1レジスタにPadInfoの数値が格納されます

次にt1の値に+2hしてパッドデータを読み込みます
これは一行だけで済みます
lhu t2, $0002(t1)

次に自分だけの(新しい)パッドアドレスを作ります
仮に、000F4500にしたい場合はこうプログラムを組みます
lui t0, $000f
sh t2, $4500(t0)

これで、マイナス形式のパッドデータが
000F4500にも格納されるようになり
バイトコピーなどを使用しなくてもパッドアドレスが求められ
さらに自分だけのパッドアドレスとして使う事が出来ます。

最後に、この自作パッドプログラムを実行させる為に
毎フレームコールされているプログラムの最後から(jr ra命令)
000F0000へjal命令で処理が回るようにして
自作プログラムの最後にjr ra命令を置いて完成です。


実際にコード化するとこんな感じになります

空きメモリの「000F4500」もパッドアドレスになる
9C885D7C 0C53A7A5
9C9A8328 204EE7BC
9C9A832C 8F4DCBB5
9C9A8330 872CE7A7
9C9A8334 204EE79C
9C9A8338 B74C2AA5
9C9A833C 15F6E79D
数値はマイナス形式で管理されます



ちなみに、上のコードではマイナス形式のデータが格納されますが
lhu命令でパッドデータを読み込む部分を
lbu t2, $0002(t1)
lbu t3, $0003(t1)
sll t2, t2, 8
or t3, t2, t3
xori t2, t3, $ffff
の5行の命令に書き換えれば
データをプラス形式で扱うことも出来ます
これをコード化した場合はこちらです。

空きメモリの「000F4500」もパッドアドレスになる
9C885D7C 0C53A7A5
9C9A8328 204EE7BC
9C9A832C 8F4DCBB5
9C9A8330 832CE7A7
9C9A8334 832BE7A8
9C9A8338 144C15A5
9C9A833C 138B0FC2
9C9A8340 1B6CB00C
9C9A8344 204EE79C
9C9A8348 B74C2AA5
9C9A834C 15F6E79D
数値はプラス形式で管理されます