では前回にて自作プログラムを配置するエリアを確保できましたので今回はパッドコードのひな型を作っていきたいと思います。
パッドアドレス自体は前回サーチしましたね。
0x006c3540です。
まず、プログラミング言語的な所を想定します。大体こんな感じでしょうかね?
function 自作プログラム()
if(パッドアドレスの値 = 特定のキー)then
なんか処理させる
endif
return memcopy
前回までではreturn memcopyだけ作ってある感じです。
jの位置を000F0040へ移動しましたが、これがreturn memcopyの事です。
パッドコードを作るにあたって今回のやる事リストは以下のとおりです。
- レジスタにパッドアドレスの値を代入
- レジスタにキー入力データの代入
- beqまたはbneで値を比較し分岐処理をする
- 自作処理を作る
(雑談)レジスタで注意しないといけないこと
唐突にレジスタという言葉が出てきましたが、レジスタってのはCPUの中にある超高速なメモリと思ってください。
PCSX2のデバッガやPS2DISとかを見ていると、a0とかs1とかt0とか出てくるのがレジスタです。
そして注意しないと行けないのは、使ってはダメっぽいレジスタがあることです。
それぞれの役割は以下のとおり
aレジスタ:引数用
vレジスタ:戻り値用
tレジスタ:一時作業用
sレジスタ:退避の必要な数値用
と言うことで、基本的には文字通りtレジスタを自作処理では使ってください。まぁ動かしてみて壊れなければ何でも良いですが、aとsレジスタは使わないのが無難でしょう。vは使っても何とかなるかもしれません。
レジスタにパッドアドレスの値を代入をする
まずはアドレスの値を作る必要があり、32ビットのアドレスを作るには、luiとoriの2行で作るのが定番とのことです。 詳しくはR5900命令表を見ましょう
パッドアドレスが 0x006c3540なので、こんな感じ。
lui t0,0x006c
ori t0,t0,0x3540
これでt0レジスタに 0x006c3540 と言う値を作れます。
レジスタにキー入力データの代入
lb,lh,lwなどデータサイズに応じてロード。unsignedならu付
lhu t1,0x02(t0)
これでt1レジスタにキー情報が入ります。何もキー入力がなければ0xFFFFという値が入っているはずです。なお、読み込みアドレスはt0+2hex先のデータを読み込んでいますが、「padinfo」がそういう構造だからです。
beqまたはbneで値を比較し分岐処理をする
beqとbneどっちを使うのがセオリーなんでしょうか?
beq比較した値がイコールならジャンプ
bne比較した値がノットイコールならジャンプ
やりたい事的にはbneかな?
まずはパッド比較用の値を作り、bneの下にやりたい処理を作ります
ori t2,zero,0xFFDF ←最後の値(0xXXXX)はパッドのマイナス型を参考のこと
bne t1,t2,0x000F0040
これでt1(パッドアドレスの値)とt2(こちらが判定したいキー)が一致の時はbne以下の処理を実施し、一致しないときは0x000F0040(復帰処理)へ飛ぶという感じになります。
自作処理を作る
何でも良いのとりあえず何か書き込んでみる
lui t3,0x000F
ori t3,t3,0x0080
sw t0,0x0(t3)
これで?キーを押したときに0x000F0080に0x006c4630と言う値を書き込むことになります。
では、これをPCSX2へ反映しました。
なお、000F0014に命令が入っていないのはジャンプ系の命令の直後の命令はジャンプのついでに実行されるという、遅延スロットの概念により念のため空けております。
では、RUNを押して処理を戻す前に、000F0000のブレークポイントは解除し、000F0018へブレークポイントを設定しておきましょう。
ではおもむろにRUNを押してPCSX2へ処理を戻します。
今は分岐を通らないのでプレークポイントをヒットせず、PCSX2が普通に動いているだけだと思いますが、この状態でパッドを一つずつ押していきますと、そのうちブレークポイントで処理が止まると思います。
十字キーの左を押したときに止まりましたか?
luiの左の■が次に実行されるコードです。t1とt2の値が一致したので、000f0018へ処理が回りました。
0xFFDFは十字キーの左ボタンを押した状態みたいですね。
では、このままStep Overで000F0020を通った際の処理を見たいと思います。
まずデバッガのメモリビューを出しておきます。今000F0080は00 00 00 00になっていますね
今Step Overを何度か押して000f0024まで来ましたが、 000F0080が40 35 6c 00になりました。
ンギモチイー
これでパッドコードの器が出来たことになります。
あとは、自分の希望した書き込み先(t3レジスタ)や値(新たにt4などを使う)を決めればよいですね
コメント