妖怪ウォッチバスターズ ASMコード解説

必殺技無限
00632B40 E5980000
00632B44 E92D400F
00632B48 E59F001C
00632B4C E59F101C
00632B50 E5900000
00632B54 EBEC6F81
00632B58 E3500000
00632B5C 08BD800F
00632B60 E3A01000
00632B64 E5801178
00632B68 E8BD800F
00632B6C 0068F3A8
00632B70 F64BEC60
003FAD04 EB08DF8D

Code by 改造博物館

 

今回は上記のコードを解説していきます。

細かく書くのが面倒なのでアセンブラの詳細は割愛させていただきます。

 

では、解説をさせていただきます。

 

 

必殺技無限
00632B40 E5980000
00632B44 E92D400F
00632B48 E59F001C
00632B4C E59F101C
00632B50 E5900000
00632B54 EBEC6F81
00632B58 E3500000
00632B5C 08BD800F
00632B60 E3A01000
00632B64 E5801178
00632B68 E8BD800F
00632B6C 0068F3A8
00632B70 F64BEC60
003FAD04 EB08DF8D

 

RAM: 必殺技無限

0C8E3A34 00000000

 

初期値:003FAD04の値はE5980000で、00632B40に分岐しています。

当然ながら、分岐するためには003FAD04には00632B40への分岐値を、

00632B40には003FAD04の初期値を。

 

今回、r0とr1を主に使用するので、stmfd(00632B44 E92D400F)命令の拡張レジスタはr0-r3にあらかじめアウトプットさせます。

00632B48 E59F001C
00632B4C E59F101C

この二つは指定値(

00632B6C 0068F3A8
00632B70 F64BEC60

)をr0に0068F3A8を、r1にF64BEC60を代入しています。

 

00632B50 E5900000←これを宣言した後、00632B54 EBEC6F81(0014E960)へ分岐します。そうすることで、r0とr1の値(0068F3A8, F64BEC60)は0014E960で使われるようになります。

0014E960は必殺技のROMアドレスになります。

 

00632B58 E3500000

ここで、分岐先(0014E960)のr0を取得します。

よって、r0の中身は、0068F3A8ではなく0C8E38BC(New版)に更新されます。

(00632B58 E3500000
00632B5C 08BD800F) は cmpの値0とr0の値を判別し、08BD800F(ldmeqfd)によって比較され、等しい場合は、ブレークさせます。

つまり、0C8E38BC ==(eq) 0ならbreak;

 

ブレークせずシステムが始動続けたら、

(00632B60 E3A01000
00632B64 E5801178)  r1 は 分岐先(0014E960)によってレジスタが更新されています。

しかし、更新された r1 は不要なので、E3A01000によってr1を初期化します。

E5801178で初期化したr1をメモリに置いたr0(0C8E38BC) + 178加算した場所に書き換えします。

↑の転送アドレスは、0C8E3A34(New版)。

 

なぜ r1 を初期化したかは、0C8E3A34の値が、1ならば必殺技無効状態、0ならば必殺技有効状態だからです。

 

終わりに

00632B68 E8BD800Fを置いて(アウトプットさせた拡張レジスタr0-r3をインプットさせる)プログラムは完成です。

今回の場合は、stmfd, ldmfdなので、E12FFF1E(bx lr)は不要です。

 

最後に

00632B70 F64BEC60はどういうこと?とは下記のアドレスを元に。

CA3B0C4 F64BEC60。

00632B54 EBEC6F81で分岐させれば、r0とr1は分岐先に転送され、システム始動時は元のr0とr1は003FAD04~では初期化されます。

ここは、多分わかりづらいと思うので興味ある方は独自で研究してみてください。