過去、何度かパッドアドレスを求める方法を紹介しましたが こんな方法もあるんだという事を紹介します。 この方法は自分でパッドアドレスを決める事が出来 さらに形式もマイナスかプラスかを自由に選択できます ただし簡単なプログラムが組める程度の知識がないと これを使うのは難しいと思いますので注意して下さい 侍道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 数値はプラス形式で管理されます