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

 

命令一覧 :

LDR(ロードレジスタ, 読み込み)命令 /W, H, B

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 で分岐された位置に指定アドレスを入力します。

 

 

お疲れさまでした(^^♪