TOP  改造コード  その他
トグルコード用のボタン押下フレームカウントアドレスの作り方

複数のボタンでいくつか値を切り替えるコードの発動条件を、ボタン値のアドレスではなくボタンの押下フレームをカウントしてくれるアドレスにすることで、1ボタンで値を切り替えられるようになります(要するにトグル式)。
該当ゲームにそのアドレスがあればいいんですが、ない場合は空きメモリに下のプログラムを組んで、毎フレームに1回通過する適当な関数からそこに飛ばしてやる必要があります。

アドレスを1か所だけ作る

こっちのやり方では一か所しか作れない代わりにL1+R1などの同時押しによるアドレスが作れます

1 lui r0,0xVVVV
2 lhu r0,0xWWWW(r0)
3 ori r0,0xXXXX
4 ori r1,zero,0xXXXX
5 bne r0,r1,11行目
6 lui r0,0xYYYY
7 lhu r1,0xZZZZ(r0)
8 addiu r1,0x1
9 beq zero,zero,12行目
10 nop
11 move r1,zero
12 sh r1,0xZZZZ(r1)

VVVVWWWW マイナス形式のボタン値アドレス(要符号拡張考慮)
XXXX 使用するマイナス形式のボタン値
YYYYZZZZ ボタン押下フレームカウントのストア先(空きメモリ推奨)
ボタン値アドレスがプラス形式の場合、3行目のoriをandiに変えてください。
64かPS2(多分PSPも)の場合、9行目をbnelにすると次のnopを省略できます。

全ボタンのアドレスを1か所ずつ作る

1 lui r0,0xWWWW
2 lbu r1,0xXXXX(r0)
3 lbu r0,0xXXXX+1(r0)
4 sll r1,r1,0x8
5 addu r0,r0,r1
6 xori r0,r0,0xFFFF
7 lui r1,0xYYYY
8 ori r1,r1,0xZZZZ
9 sll r2,zero,0x0
10 addu r3,r2,r1
11 andi r4,r0,0x1
12 beq r4,zero,17行目
13 lhu r4,(r3)
14 addiu r4,r4,0x1
15 beq zero,zero,18行目
16 sh r4,(r3)
17 sh zero,(r3)
18 sra r0,r0,0x1
19 addiu r2,r2,0x2
20 sltiu r3,r2,0x20
21 bne r3,zero,10行目

WWWWXXXX マイナス形式のボタン値アドレス(要符号拡張考慮)
YYYYZZZZ ボタン押下フレームカウントのストア先(空きメモリ推奨)
ボタン値アドレスがプラス形式の場合、2行目をlhuにしたうえで3~6行目を省略しなさい。レジスタも直してね。
20行目の0x20のとこはコントローラーのボタンの数×2を入れてください(0x20はPS1、2での値です)
PS2では4行目をpextlb r0,r1,r0にすると次のadduを省略できます。

実際にトグル形式のコードを作る場合、複数の条件を重ね掛けすることになるのでDコードではなくまた空きメモリにプログラムを組んでそこで条件判定する必要があります。
PS1とN64のDコード重ね掛けやPS2のEコードでは上手く動かないので注意。
ちなみに、DuckStationであればD7コードとF5コードを使えば↑のプログラムを組まなくても同じことができます。詳しくはこちら

一番上に戻る