F0F条件コードの作成について[3DS改造解析]
ASM分岐値計算装置(ルーチン作成用)
D5000001 XXXXXXXX
D5000002 YYYYYYYY
F0F00000 0000001C
E59F0010 E5962000
E5973000 E0422003
E5802000 E12FFF1E
ZZZZZZZZ 00000000
D9000000 ZZZZZZZZ
F5000000 00000004
D4000000 FFFFFFFE
D6000000 ZZZZZZZZ
D2000000 00000000
使い方 :
①XXXXXXXX には分岐先アドレスを指定してください。
②YYYYYYYY には分岐前アドレスを指定してください。
③ZZZZZZZZ には空きアドレスを指定してください。
コードを実行 :
XXXXXXXX と YYYYYYYY が減算され ÷4 された結果 -2 = 分岐値が
ZZZZZZZZ の 指定アドレス に 書き出されます。
ZZZZZZZZ を HexEditor で確認してください。
コードの仕組み :
XXXXXXXX - YYYYYYYY = Data1;
Data1 / 4 = Data2;
Data2 - 2 = Data3(分岐値)
本題に入る前に
※上記のコードを元にF0F条件コードの解説をしていきます。
※ASMの知識が少ししかない方でも簡単に作れます。
※F0F条件コードは指定レジスタで組み立てます。
※F0F条件コードで主に使う命令一覧をご紹介します。
Gateway条件コード一覧 :
https://github.com/JourneyOver/CTRPF-AR-CHEAT-CODES/blob/master/ActionReplayCodeTypes.txt
命令一覧 :
STR(ストアレジスタ, 書き出し)命令 /W, H, B
MOV(ムーヴ, コピー(代入))命令
ADD(アディション, 加算)命令
SUB(サブトラクション, 減算)命令
MUL(ムルティプリケーション, 乗算)命令
レジスタ一覧 :
r0 = 汎用レジスタ, 第一引数
r1 = 汎用レジスタ, 第二引数
r2 = 汎用レジスタ, 第三引数
r3 = 汎用レジスタ, 第四引数
r4 = オフセット#1
r5 = オフセット#2
r6 = データ#1
r7 = データ#2
r8 = ストレージ#1
r9 = ストレージ#2
r10 = 共有メモリページ(0x01E81000 - 0x01E82000)
r11 = 多分汎用レジスタ(わからない)
r12 = 多分汎用レジスタ(わからない)
r13(sp) = 利用可能な0x1000バイトのスタック
r14(lr) = コードを終了するために戻るアドレス
r15(pc) = 現在値からレジスタエリアまたは即値で分岐
F0F条件コードの作り方(上記のコードの解説)
第一 :
D5000000 XXXXXXXX = r6
D5000001 YYYYYYYY = r7
を定義します。
第二 :
F0F00000 0000UUUU
SSSSSSSS SSSSSSSSS
UUUU は コードサイズ(バイト数)を指定します。
SSSSSSSSS は ASM命令(ARM32)、ARコードに埋め込まれたASM命令を実行します。
第三 :
D9000000 ZZZZZZZZ
F5000000 00000004
D4000000 FFFFFFFE
D6000000 ZZZZZZZZ
D2000000 00000000
D9 は ZZZZZZZZ(指定アドレス) を読み込みます。
F5 は 割り算を行います( /= 4 )。
D4 は 最終結果を減算をします( -2 )。
D6 は 結果を ZZZZZZZZ(指定アドレス) に書き出します。
第二 : の F0F条件コード(上記のコード解説)
F0F00000 0000001C
E59F0010 E5962000
E5973000 E0422003
E5802000 E12FFF1E
ZZZZZZZZ 00000000
UUUU は 1C = 28サイズ です。
E59F0010 = LDR r0, [pc, + #0x10] つまりこの位置{#0x-4}から{#0x10}した位置(ZZZZZZZZの指定アドレス)に分岐されたデータを r0 へ 読み込みます。
E5962000 = LDR r2, [r6] は r6 のデータを r2 へ 読み込みます。
E5973000 = LDR r3, [r7] は r7 のデータを r3 へ 読み込みます。
E0422003 = SUB r2, r2, r3 は r2(XXXXXXXXの指定値) - r3(YYYYYYYYの指定値) の減算された結果を r2 へ格納します。
E5802000 = STR r2, [r0] は 先程減算結果を受け取った r2 を [r0(ZZZZZZZZの指定アドレス)] に 書き出します。
E12FFF1E = BX LR は プログラム終了(D2000000 00000000の役割)
ZZZZZZZZ = E59F0010 で分岐された位置に指定アドレスを入力します。
お疲れさまでした(^^♪