なるほどえたきちのブログじゃねーの

チラ裏雑記帳

ポケモン過去作の解析とか乱数調整とかそこら辺。不定期更新。

【FRLG,Em】CartRAMの取り扱いメモ

メモ記事です

ポケモン等のGBAソフトのセーブデータは基本的にCartRAMに保存されますが、このRAMは通常のWorkRAMとは読み書きの方法が異なるので愚直に弄ろうとしてもまず上手くいきません。
この記事ではポケモンで使用されているFRAM(1Mbit)の扱い方について記します。

↓FRLG/Emで使用されているらしいFRAMのデータシート
f:id:BZL:20190922061033p:plain

但しこのデータシートには1MbitのFRAMを扱う上で肝となっているバンクの切り替えについて記述されていません。(見落としてるだけかもしれないけど)
今回はよく使われるデータ書き込みとバンク切り替えについてのみ解説したいと思います。

バンク切り替えについて



CartRAMは基本的に0x0E000000-0x0E00FFFFのアドレス空間を持っています。
しかし1MbitのFRAMの場合、このアドレス空間だけではメモリの全領域を参照させることができません。
ここで使用するのがバンク切り替えです。
メモリ内のアドレス0x00000-0x0FFFFをバンク0、アドレス0x10000-0x1FFFFをバンク1として扱うことで実質的に0x0E000000-0x0E01FFFFのアドレス空間を使用することができるようになります。
しかしこのバンク切り替えは使用するアドレスが0x0E00FFFFまでの範囲を超えていれば自動的に行われる訳ではなく、プログラムを組むユーザー側で適宜切り替える必要があります。
また、アドレス空間はあくまで0x0E000000-0x0E00FFFFの範囲なので、メモリ内アドレス0x10000以降を参照させる場合はバンク1に切り替えた後に0x10000を始点としたアドレス指定を行う必要があります。
(例:0x0E01C000を参照させたい場合はバンク1に切り替えた後に0x0E00C000を参照させる)

バンク切り替え処理は以下のコードの通りです。

/*バンク切り替えサンプルコード*/
.thumb
 
/*r0 = バンクID*/
 
/*コマンド操作にstrb命令を使用しているが実際にデータは書き込まれない*/
ldr r1, =0x0e005555
ldr r2, =0x0e002aaa
ldr r3, =0x0e000000
mov r4, #0xb0
strb r2, [r1] /*0x5555 <- 0xAA*/
strb r1, [r2] /*0x2AAA <- 0x55*/
strb r4, [r1] /*0x5555 <- 0xB0*/
strb r0, [r3] /*0x0000 <- バンクID*/


データ書き込みについて



次はFRAMへのデータ書き込みの方法について解説します。
前述のバンク切り替えと同じく、strb命令を使用したコマンド操作が必要なのでWorkRAMと同じように扱っても書き換えることができません。
また、1byte書き込む度に再度コマンド操作を挟む必要があります。
データの読み込みに関してはバンク合わせてから普通にldrbで読み込むだけです。

書き込み処理は以下のコードの通りです。

/*データ書き込みサンプルコード*/
.thumb
 
/*r0 = 任意のデータ(1byte)*/
/*r1 = 書き込み先アドレス*/
 
ldr r2, =0x0e005555
ldr r3, =0x0e002aaa
mov r4, #0xa0
strb r3, [r2] /*0x5555 <- 0xAA*/
strb r2, [r3] /*0x2AAA <- 0x55*/
strb r4, [r2] /*0x5555 <- 0xA0*/
 
/*データ書き込み*/
/*この書き込み処理以外はCartRAM上には反映されない*/
strb r0, [r1]

【FRLG】任意コード実行による色違いデオキシスの動的生成

色違い固定のエンカウント処理を走らせてみたくなったので作りました。

デバッグ環境はFR前期ROMですが呼び出し元を調整すればFRLG前期後期の4バージョンで動くと思います。
FRLGにおいてバグ技持ちの個体を入手していることを前提とします。

色個体生成の原理は以前投稿したこの記事のものとほぼ同じです。
bzl.hatenablog.com

以前のものと違う点は個体検索処理を全て任意コード側に任せていることです。
そのため、任意コードを打ち込んで実行するだけで任意の種族のポケモンとの色違い固定エンカウントが行えるようになります。

任意コードが長くなってしまっているので本来はバイナリエディタ起動環境を整えた後に実行する方が望ましいのですが、興味のある方は是非試してみてください。

・ボックス配置ポケモン



スクリプト呼び出し用ポケモン
TNの変更が面倒な場合はNNのみで充分です。
NNのみの場合バグ技の成功率は1/8から1/16に下がります。
へ(平仮名)と(カタカナ)の区別が付き辛いのでカタカナのみ赤字で記述しています。

FR 0x38C9用
ボックス12/22:NN『てムにうい』TN『てナにうい』
ボックス12/23:NN『てむにうい』TN『てなにうい』

LG 0x21BE用
ボックス12/23:NN『てにうい』TN『てチにうい』
ボックス12/24:NN『てへにうい』TN『てちにうい』


プログラム用ポケモン(ボックス13/12からスタート)
かなり数が多くなっているので、作業の簡略化のため容量度外視でNNのみ使用する形式にしています。

ボックス13/12:NN『てぺぷl』
ボックス13/13:NN『 Vうい』
ボックス13/14:NN『てぶぷl』
ボックス13/15:NN『7せ う』
ボックス13/16:NN『 むゆl』
ボックス13/17:NN『あミゆl』
ボックス13/18:NN『Gタゆl』
ボックス13/19:NN『かチゆl』
ボックス13/20:NN『あむゆl』
ボックス13/21:NN『あメゆl』
ボックス13/22:NN『いむゆl』
ボックス13/23:NN『だメゆl』
ボックス13/24:NN『てぶぷl』
ボックス13/25:NN『にえィボ』
ボックス13/26:NN『てべぷl』
ボックス13/27:NN『あにおィ』
ボックス13/28:NN『てぼぷl』
ボックス13/29:NN『ほ にか』
ボックス13/30:NN『てぱぷl』

ボックス14/1:NN『ィ  も』
ボックス14/2:NN『てぴぷl』
ボックス14/3:NN『へVうい』
ボックス14/4:NN『てぷぷl』
ボックス14/5:NN『ゆAあゆ』
ボックス14/6:NN『てぽぷl』
ボックス14/7:NN『ぎあい 』
ボックス14/8:NN『ELゆl』
ボックス14/9:NN『てぶぷl』
ボックス14/10:NN『ミ♂すぱ』
ボックス14/11:NN『てべぷl』
ボックス14/12:NN『hネ わ』
ボックス14/13:NN『てぼぷl』
ボックス14/14:NN『あWッぉ』
ボックス14/15:NN『てぱぷl』
ボックス14/16:NN『hネタグ』
ボックス14/17:NN『てぴぷl』
ボックス14/18:NN『3グでぞ』
ボックス14/19:NN『まLゆl』
ボックス14/20:NN『nぶゆl』
ボックス14/21:NN『Uべゆl』
ボックス14/22:NN『Cぼゆl』
ボックス14/23:NN『!ぱゆl』
ボックス14/24:NN『ぴゆl』
ボックス14/25:NN『ガぷゆl』
ボックス14/26:NN『ヤぽゆl』
ボックス14/27:NN『ELゆl』
ボックス14/28:NN『ぺぶレl』
ボックス14/29:空欄
ボックス14/30:空欄

・ボックス名



ボックス1:『リばレらァあFひ』
ボックス2:『アしぎガば』
ボックス3:『つべてぼなぱなぴ』
ボックス4:『アまLミBィC』
ボックス5:『へネリばくぼんふ』
ボックス6:『アアアくべぷづ』
ボックス7:『アア。ねノづ』
ボックス8:『アグねノぞ』
ボックス9:『けしチぞきる e』
ボックス10:『アアアガばほタ』
ボックス11:『アアミC  』
ボックス12:『アッぽ う』
ボックス13:『モタ  ぺLだ』
ボックス14:『うダなういィ く』

上記の打ち込みが終了したら、適当な野生ポケモン相手にバグ技を使用します。
技成功後に逃げるを選択し、戦闘を終了させるとイベントスクリプトが実行され、色違いデオキシス(フラグ付き)lv30が出現します。
f:id:BZL:20190923100219p:plain

使用したコードは以下の通りです。
このコードをSpecial0x1BB(固定シンボル個体生成処理)の前に挟んでSeed値を書き換えることにより、実行したROMに適合した色違いPIDを生成させています。
但し、この処理とPID生成処理の間に割り込みが入って乱数値が更新されてしまう可能性もあるので完全な100%出現ではありません。(所謂メソズレ)

.thumb
	
shinyseed_get:
	push {r4-r6, lr}
	ldr r3, =0x03004fa0
	ldr r4, [r3, #0xc] /*後期ROM*/
	cmp r4, #0x0
	bne tidget
	add r3, #0xa0
	ldr r4, [r3, #0xc] /*前期ROM*/
	
tidget:
	ldrh r0, [r4, #0xa] /*TID*/
	ldrh r4, [r4, #0xc] /*SID*/
	eor r4, r0 /*TID xor SID -> TSV*/
	ldr r5, [r3] /*初期Seed取得*/
	mov r0, pc /*b命令が後ろに飛べないのでpc更新で代用*/
	ldr r2, =0x00006073
	
shinysearch:
	mov r6, r5
	ldr r1, =0x41c64e6d
	mul r5, r1
	add r5, r2 /*LID生成*/
	mul r1, r5
	add r1, r2 /*HID生成*/
	eor r1, r5 /*HID xor LID -> PSV*/
	lsr r1, #0x10
	eor r1, r4 /*PSV xor TSV*/
	cmp r1, #0x7
	bls setseed
	mov pc, r0
	
setseed:
	str r6, [r3]
	pop {r4-r6, pc}
	
/*
イベントスクリプト
	setvar 0x8004 0x019A
	setvar 0x8005 0x001E
	setvar 0x8006 0x0000
	callasm shinyseed_get+1
	special 0x1BB
	special 0x138
	end
*/

LG用任意コード実行に関するアレコレ

LG前期ROMでの任意コード実行法が割れていないようなので簡潔に纏めます。
任意コード実行バグ自体の原理としてはEm,FRで行ったものと全く同じですので細かい解説は省きます。
アセンブリやメモリ構造を理解しており、Emでの任意コード実行環境が整っている方向けです。

Emの0x2B5CやFRの0x38C9のような都合の良いバグ技が存在しなかったので幾つか候補となる技を挙げています。
それぞれ参照されるメモリアドレスが異なっている為、使用する技に合わせて各自でプログラムを調整するようにお願いします。

バグ技持ちの個体調達はEmで行うことを推奨します。
GBA同士の交換ではバグ技持ちが扱えないのでGC(Co,XD)経由で送ってください。

使用できるバグ技



0x2348

威力:37
命中:37
PP:37
参照メモリアドレス:0x02030400
効果は『ねむる』と同一。
HPが満タンの場合は失敗する。
f:id:BZL:20190916053758p:plain


0x21BE

威力:153
命中:153
PP:17
参照メモリアドレス:0x020300C0
効果は自分に対し『あくび』を使用するというもの。
使用後は基本的にすぐに戦闘離脱するのでほぼノーデメリット?
この記事の最後に紹介している任意コード実行ではこのバグ技を使用しています。
f:id:BZL:20190916054042p:plain


0x0259

威力:---
命中:96
PP:1
参照メモリアドレス:0x02030400
効果は通常攻撃。
PPが非常に少ない。ごく稀に外れる。
f:id:BZL:20190916060123p:plain


0x0506

威力:64
命中:11
PP:45
参照メモリアドレス:0x02030085
効果は『つるぎのまい』と同一。
参照アドレスが4の倍数ではないので注意。
f:id:BZL:20190916060452p:plain


0x20F9

威力:153
命中:153
PP:153
参照メモリアドレス:0x02030087
効果は『テレポート』と同一。
任意コード実行と戦闘離脱を同時に行ってくれるが、参照アドレスが4の倍数ではないのでスクリプトが記述しづらい。
f:id:BZL:20190916054228p:plain



実行するコードの例


0x21BE用たんじょうのしまワープ
技成功後にテレポートを使用するとたんじょうのしまにワープします。
f:id:BZL:20190916091650p:plain


.thumb

/*元のコード*/
ldr r0, =0x03005048 /*動的RAM制御ポインタ*/
ldr r0, [r0]
ldr r1, =0x00003802 /*マップ指定*/
str r1, [r0, #0x1c]
pop {r4-r7, pc}
/**/
/*===========================*/
/**/
/*ボックス名埋め込み用*/
/*Box1*/
box1:
ldr r0, var2
ldr r0, [r0]
ldr r1, var1
b box3

/*Box3*/
box3:
str r1, [r0, #0x1C]
pop {r4-r6}
pop {r7, pc}

/*Box5*/
var1:
.word 0x00003802

/*Box7*/
var2:
.word 0x03005048

box7:
b box1

ボックス内編集内容


ジャンプスクリプト

13 07 16 03 02 (12/23 NN:てきにうい)
13 01 16 03 02 (12/23 TN:てあにうい)
13 D5 15 03 02 (12/24 NN:てaなうい)


任意コード実行スクリプト

03 35 16 03 02 80 00 08 (Box2:うゅにういィ く)
03 ED 15 03 02 80 00 08 (Box4: うyなういィ く)
03 A9 15 03 02 80 00 08 (Box6:う8なういィ く)


任意コード部

0D 48 00 68 07 49 04 E0 (box1:すぶ ネきべえl)
C1 61 70 BC 80 BD (box3:GチミBィC)
02 38 00 00 (box5:いぎ  )
51 51 48 50 00 03 E0 E7 (box7:アアぶっ うls)


ボックス5の名前を書き換えることでワープ先を変更できます。
以下はその例になります。
[い   ]:へそのいわ
[あえ  ]:サント・アンヌごう桟橋
[あぜ  ]:サファリゾーン
[あっ  ]:殿堂入り部屋
[うゃ  ]:8ばんななしま
[うゅ  ]:9ばんななしま

任意コード実行によるセーブデータの複製

非常によくない記事なので削除する可能性があります

やったことはタイトルの通りです

↓動画

 

という訳で実践していきましょう。

先にこの記事で紹介しているバイナリエディタを導入する必要があります。

※この方法はGCゲームボーイプレイヤーでは実行できません。

 

複製元のROMで取り敢えずバイナリエディタを起動します。

f:id:BZL:20190720023604p:plain

 

以下の通りデータを書き込みます。

0203CF00 33
0203CF01 00
0203CF02 00
0203CF03 00
0203CF04 28
0203CF05 01
0203CF06 00
0203CF07 23
0203CF08 41
0203CF09 CF
0203CF0A 03
0203CF0B 02
0203CF0C 02
0203CF40 00
0203CF41 21
0203CF42 07
0203CF43 4B
0203CF44 1A
0203CF45 88
0203CF46 19
0203CF47 80
0203CF48 06
0203CF49 48
0203CF4A C9
0203CF4B 43
0203CF4C 49
0203CF4D 0A
0203CF4E 01
0203CF4F 60
0203CF50 01
0203CF51 68
0203CF52 01
0203CF53 39
0203CF54 01
0203CF55 60
0203CF56 00
0203CF57 29
0203CF58 FA
0203CF59 D1
0203CF5A 1A
0203CF5B 80
0203CF5C F7
0203CF5D 46
0203CF5E 00
0203CF5F 00
0203CF60 00
0203CF61 02
0203CF62 00
0203CF63 04
0203CF64 D0
0203CF65 D6
0203CF66 03
0203CF67 02
03000E40 01
03000E41 02
03000E44 00
03000E45 00
03000E46 00
03000E47 00
03000E48 00
03000E49 CF
03000E4A 03
03000E4B 02
03000E38 00

 

本体がノイズを立ててフリーズしますがプログラムは正常に実行されています。

すぐに複製先のカートリッジと交換して数秒待機しましょう。

ノイズが止んだら操作可能になっているのでレポートを書きます。

以上でセーブデータの複製は完了です。

はじめての乱数調整(物理)

あまりよくない記事なので消す可能性があります

 

「任意コード実行を利用して完全に任意の個体とエンカウントすることは可能なんですか?」

との質問を頂いたので適当に思い付いた手法を検証してみたいと思います。

今回は色陽気高個体のジラーチとのエンカウントを目標とします。

 

1)TIDの特定


色高個体とエンカウントすると言っておきながら私は自ROMのTIDを全く把握していません。

ニューゲームしてTID調整するのも面倒なのでバイナリエディタを利用して自ROMのTIDを確認します。

手持ち2匹目に自己産の適当なポケモンを入れた状態でバイナリエディタを起動し、0x020241F8からの4byteの値をチェックします。

f:id:BZL:20190717234908p:plain

f:id:BZL:20190717234925p:plain

f:id:BZL:20190717234940p:plain

f:id:BZL:20190717234953p:plain

という訳でこのROMのTIDは0x5696A7DFであることが判明しました。

表ID、裏IDに変換すると42975、22166となります。

この値を色違い個体検索に利用します。

 

2)個体の呼び出し


某ツールを起動し固定乱数の個体検索で適当に検索してみます。

Methodは1です。

f:id:BZL:20190718005613p:plain

なんかそれっぽい個体がヒットしました。

今回はこの個体とエンカウントしてみたいと思います。

実際に765055043Fも待機するのは現実的ではないのでリストの末尾にある乱数値を利用します。

 

起動中のバイナリエディタで以下のように操作します。

ここで打ち込むデータの詳細は3)に置いておきます。

※S1 乱数値の下から1Byte目
※S2 乱数値の下から2Byte目
※S3 乱数値の下から3Byte目
※S4 乱数値の下から4Byte目

0203CF80 01
0203CF81 48
0203CF82 02
0203CF83 49
0203CF84 01
0203CF85 60
0203CF86 70
0203CF87 47
0203CF88 E0
0203CF89 5A
0203CF8A 00
0203CF8B 03
0203CF8C S1
0203CF8D S2
0203CF8E S3
0203CF8F S4
0203CFA0 23
0203CFA1 81
0203CFA2 CF
0203CFA3 03
0203CFA4 02
0203CFA5 B6
0203CFA6 99
0203CFA7 01
0203CFA8 5A
0203CFA9 00
0203CFAA 00
0203CFAB B7
0203CFAC 02
03000E40 01
03000E41 02
03000E44 00
03000E45 00
03000E46 00
03000E47 00
03000E48 A0
03000E49 CF
03000E4A 03
03000E4B 02
03000E38 00

f:id:BZL:20190718002437p:plain

lv90の色違いジラーチとエンカウントします。

 

捕獲したジラーチのステータス

f:id:BZL:20190718004926p:plain

f:id:BZL:20190718004939p:plain

ただのチートと大差ないですね

 

3)おまけ


2)で打ち込んだデータの詳細

アセンブリスクリプトが理解できる方向けです。

理屈としては、シンボルエンカウントで使用されるスクリプトB6(setwild)の実行直前にスクリプト23(callasm)で呼び出した任意コードで乱数値レジスタの値を直接書き換えています。

 

アセンブリ

0x0203CF80:01 48 02 49 01 60 70 47 E0 5A 00 03 F5 EB B2 BF

ldr r0, =0x03005AE0 @乱数値レジスタ
ldr r1, =0xBFB2EBF5 @乱数値
str r1, [r0]
bx lr

 

スクリプト

0x0203CFA0:23 81 CF 03 02 B6 99 01 5A 00 00 B7 02

callasm 0x0203CF81
setwild 0x0199 0x5A 0x0000
wildbattle
end

日版エメラルド用任意コードのアレコレ

2019/9/30
バグポケ0x085Fの発見や導入コードの最適化等により、この記事で紹介している情報が古くなってきたので新しく導入手順を纏め直しています。
新しくバイナリエディタを導入したいという方はこちらの記事の手順で導入してください。
bzl.hatenablog.com

 

 

最近Emでの任意コード実行が話題になってるような気がするので便乗して少し遊んでみました。
コード載せてダラダラ語る前に何やったか見せた方が早そうなのでまずはこの動画を見てください。

 

大体察しはつくと思いますがバイナリエディタです。(挙動が怪しぎるが)
動画では単純なイベントスクリプトの実行程度で終わっていますが理論上はこんなこともできてしまいます。割と何でもありです。(音量注意)

今回はこのバイナリエディタの起動方法を解説したいと思います。
当たり前ですが3世代ポケモンのメモリ構造が頭に入っていないとこれが起動できても使い物にならないので有識者以外には推奨できません。

以下説明

 

1)バグ技0x2B5Cを習得したポケモンの生成


バグ技0x2B5Cより簡単な任意コード実行方法が解析できたので新しく導入する方はこちらを参考にした方が安定すると思います。
バグポケ0x085Fの生成とボックスの配置調整が完了したら、ボックス1のボックス名を『うl』に変更してこの記事の手順3)に移ってください。

bzl.hatenablog.com

既に0x2B5Cを使用できるポケモンがいる場合はこの手順を踏む必要はありません。

f:id:BZL:20190716052527p:plain

まずは適当にバルビートを入手します。

f:id:BZL:20190716052800p:plain

ヒワマキシティ左上の民家にいる子供に話しかけます。

f:id:BZL:20190716053006p:plain

プラスル(NN:プラプラ)と交換して貰います。
習得している技を鳴き声のみにし、努力値をH92 A43に調整します。
以下の振り方が個人的には楽だと思います。

マックスアップ×9

タウリン×4

ゴニョニョ×2

ポチエナ×3

 

努力値の調整が終わったらこのプラスルを材料にダブルコラプションを行います。
(タマゴバグは殆どやったことないので詳しい解説は他サイトに投げます)
成功すると以下の画像のようにlv0のラフレシアが生成されます。
このラフレシアは技0x2B5C(べべべべべべ)と技0x0505(読めん)を習得しています。

f:id:BZL:20190716053815p:plain

f:id:BZL:20190716053931p:plain

技0x0505を残したままにしておくと戦闘時にフリーズしてしまうので技1と技4を入れ替えた後に育て屋に預けます。

f:id:BZL:20190716054358p:plain

適当に走り回ってから受け取るとこのような技構成に変化していると思います。

以上で技0x2B5Cの生成は完了です。

 

2)ボックスRAMの編集


今後の作業にあたってバグ技0x2B5Cの成功率(1/32)が障壁になるのでボックスのメモリを改竄して成功率を底上げします。
ボックスの状態を以下の通りに編集します。

 

2019/9/21
コードの最適化、成功率の向上(1/32→3/32)を行いました。

 

 

スクリプト呼び出し用ポケモン

TNの変更が面倒な場合はNNのみで充分です。

NNのみの場合バグ技の成功率は3/32から2/32に下がります。

 

ボックス12/26:NN『てンねうい』TN『てメねうい』

ボックス12/27:NN『てんねうい』

ボックス14/29:空欄

ボックス14/30:空欄

 

ボックス名を以下の通りに変更

ボックス ボックス名
ボックス1 『ワば2らァあmひ』
ボックス2 『アたぐょみ l』
ボックス3 『リでおめつかみぇ』
ボックス4 『アすふさk l』
ボックス5 『ィゅくべるタおべ』
ボックス6 『アノタミBィC』
ボックス7 『うyぬういィ く』
ボックス8 『アいィ く』
ボックス9 『うyぬうは は 』

 

戦闘アニメを『みる』に設定してから戦闘に入り、フリーズせず技が正常終了するまでバグ技0x2B5Cを使用し続けます。
技が成功したらすぐに戦闘終了し、ボックスの内容を確認します。
ボックス12の26-27匹目にダメタマゴが配置されていたら、ボックス1のボックス名を『うl』に変更します。

ボックス14の29-30匹目は常に空欄にするようにしてください。

 

これ以降はバグ技0x2B5Cがほぼ確実に成功するようになります。

 

3)バイナリエディタのデータ書き込み


恐らく一番時間のかかる作業になります。
バグ技0x2B5Cから呼び出される任意コードを使用してバイナリエディタのデータをボックスのRAMに書き込みます。
書き込まれる位置はボックス1の2-13匹目になります。

 

まず以下の通りにボックス名を編集します。 

ボックス ボックス名
ボックス2 『アォめリば l』
ボックス4 『アやめコづ l』
ボックス5 『グねワNゃG l』
ボックス6 『アワNエG l』
ボックス7 『ワNクGミBィC』

 

コード1回の実行につき0x24byteがコピーされます。
バイナリエディタのサイズは0x3C0byteなので合計27回のコード実行が必要になります。
ボックス3、8-14のボックス名は任意コードの実行毎に変更してください。
27回のコード実行が完了したらこのステップは終了です。

 

1回目

ボックス ボックス名
ボックス3 『ついゥはぇぃ も』
ボックス8 『アィ♂ミ」』
ボックス9 『fぶYぴァばおが』
ボックス10 『アアアDばルl』
ボックス11 『アア l99』
ボックス12 『アおふVぴ』
ボックス13 『ァばおがDばムl』
ボックス14 『アアア みUぴ』

 

2回目

ボックス ボックス名
ボックス3 『ついゥはぇぃあも』
ボックス8 『ア l99』
ボックス9 『ァばおがDばノl』
ボックス10 『アアア l99』
ボックス11 『アアくむUぶ』
ボックス12 『アPぴァば』
ボックス13 『 l99けがDば』
ボックス14 『アアアセlOべ』

 

3回目

ボックス ボックス名
ボックス3 『ついゥはぇぃいも』
ボックス8 『ア l99』
ボックス9 『すメSぶくタ リ』
ボックス10 『アアアくム み』
ボックス11 『アアべムミB』
ボックス12 『アィCPぶ』
ボックス13 『 l99たむけい』
ボックス14 『アアアぞね め』

 

4回目

ボックス ボックス名
ボックス3 『ついゥはぇぃうも』
ボックス8 『アMべあィ』
ボックス9 『あぅあも l99』
ボックス10 『アアアあもあも』
ボックス11 『アアあもあも』
ボックス12 『ア l99』
ボックス13 『あもあもあもいぃ』
ボックス14 『アアア l99』

 

5回目

ボックス ボックス名
ボックス3 『ついゥはぇぃえも』
ボックス8 『アあィあぇ』
ボックス9 『せれxW l99』
ボックス10 『アアアあぅあィ』
ボックス11 『アアあぅAぶ』
ボックス12 『アぞもため』
ボックス13 『ついィねあィGイ』
ボックス14 『アアア l99』

 

6回目

ボックス ボックス名
ボックス3 『ついゥはぇぃおも』
ボックス8 『アいぅふぃ』
ボックス9 『あィGイあぅ♀ぶ』
ボックス10 『アアアためつい』
ボックス11 『アア l99』
ボックス12 『アィねあィ』
ボックス13 『あぅ め l99』
ボックス14 『アアアあもあも』

 

7回目

ボックス ボックス名
ボックス3 『ついゥはぇぃかも』
ボックス8 『アあもあも』
ボックス9 『 l99あもあも』
ボックス10 『アアアあもあも』
ボックス11 『アア l99』
ボックス12 『アあもあも』
ボックス13 『いぃあィあぇせれ』
ボックス14 『アアアxWあぅ』

 

8回目

ボックス ボックス名
ボックス3 『ついゥはぇぃきも』
ボックス8 『アあィミび』
ボックス9 『 l996ばFば』
ボックス10 『アアアィ♂ミ」』
ボックス11 『アアャ…ビぷ』
ボックス12 『アりレちむ』
ボックス13 『 l99ッぴァば』
ボックス14 『アアアけがDば』

 

9回目

ボックス ボックス名
ボックス3 『ついゥはぇぃくも』
ボックス8 『ア l99』
ボックス9 『ヲl やんふりリ』
ボックス10 『アアア l99』
ボックス11 『アアあけける』
ボックス12 『アいeたぅ』
ボックス13 『 l990ぅぅヤ』
ボックス14 『アアアそむあぞ』

 

10回目

ボックス ボックス名
ボックス3 『ついゥはぇぃけも』
ボックス8 『アける e』
ボックス9 『たぅ0ぅムヤあゅ』
ボックス10 『アアア l99』
ボックス11 『アアいょあゃ』
ボックス12 『アおわおV』
ボックス13 『えわpWあょns』
ボックス14 『アアア l99』

 

11回目

ボックス ボックス名
ボックス3 『ついゥはぇぃこも』
ボックス8 『アィぷんふ』
ボックス9 『ぇふたゲ l99』
ボックス10 『アアアWゲVェ』
ボックス11 『アアちェっゲ』
ボックス12 『ア l99』
ボックス13 『ダゲゾェアェ み』
ボックス14 『アアア l99』

 

12回目

ボックス ボックス名
ボックス3 『ついゥはぇぃさも』
ボックス8 『アぃツミツ』
ボックス9 『…ツミルえりきV』
ボックス10 『アアアぞ たぃ』
ボックス11 『アアぅコたぃ』
ボックス12 『ア l99』
ボックス13 『ぅイきlミンるむ』
ボックス14 『アアアミエ…ン』

 

13回目

ボックス ボックス名
ボックス3 『ついゥはぇぃしも』
ボックス8 『アれむミエ』
ボックス9 『 l99ァみィぃ』
ボックス10 『アアアぃラ…ュ』
ボックス11 『アア l99』
ボックス12 『アたょいバ』
ボックス13 『 みあゾ l99』
ボックス14 『アアアノぶ ゾ』

 

14回目

ボックス ボックス名
ボックス3 『ついゥはぇぃすも』
ボックス8 『アりレ む』
ボックス9 『 l99 め も』
ボックス10 『アアアミぴィゃ』
ボックス11 『アアァばおが』
ボックス12 『アDばはl』
ボックス13 『たょいバ l99』
ボックス14 『アアア みあゾ』

 

15回目

ボックス ボックス名
ボックス3 『ついゥはぇぃせも』
ボックス8 『アタぶ ゾ』
ボックス9 『りレ む め も』
ボックス10 『アアア l99』
ボックス11 『アアニぴィゃ』
ボックス12 『アァばけが』
ボックス13 『 l99Dばえl』
ボックス14 『アアアえ…ミB』

 

16回目

ボックス ボックス名
ボックス3 『ついゥはぇぃそも』
ボックス8 『ア l99』
ボックス9 『ィC6ばィ♂ミ」』
ボックス10 『アアア l99』
ボックス11 『アアきふリば』
ボックス12 『アおぃョば』
ボックス13 『てsぷぷサぺょギ』
ボックス14 『アアアたみぃぞ』

 

17回目

ボックス ボックス名
ボックス3 『ついゥはぇぃたも』
ボックス8 『ア l99』
ボックス9 『おVネルえりヤV』
ボックス10 『アアアあぃネム
ボックス11 『アアヒlみみ』
ボックス12 『ア l99』
ボックス13 『ぃぞけVネル り』
ボックス14 『アアア l99』

 

18回目

ボックス ボックス名
ボックス3 『ついゥはぇぃちも』
ボックス8 『アヌVあぎ』
ボックス9 ネムセl l99』
ボックス10 『アアアぞみぃぞ』
ボックス11 『アアつVネル』
ボックス12 『ア l99』
ボックス13 『えりいVFづうむ』
ボックス14 『アアアくぞるシ』

 

19回目

ボックス ボックス名
ボックス3 『ついゥはぇぃつも』
ボックス8 『アあぅるエ』
ボックス9 『えりぴV l99』
ボックス10 『アアアりネ リ』
ボックス11 『アアりムばl』
ボックス12 『アィみぃぞ』
ボックス13 『そVネル l99』
ボックス14 『アアアえりえV』

 

20回目

ボックス ボックス名
ボックス3 『ついゥはぇぃても』
ボックス8 『アFづうむ』
ボックス9 『 l99くぞるシ』
ボックス10 『アアアあぐ ぐ』
ボックス11 『アア l99』
ボックス12 『アosネル』
ボックス13 『えりとW l99』
ボックス14 『アアアたみ あ』

 

21回目

ボックス ボックス名
ボックス3 『ついゥはぇぃとも』
ボックス8 『アぃぞうV』
ボックス9 『るルたぅるムよl』
ボックス10 『アアアみみ あ』
ボックス11 『アア l99』
ボックス12 『アぃぞえV』
ボックス13 『えみるルたぐるム』
ボックス14 『アアアひlあみ』

 

22回目

ボックス ボックス名
ボックス3 『ついゥはぇぃなも』
ボックス8 『ア l99』
ボックス9 『ぃぞおVりネるル』
ボックス10 『アアア l99』
ボックス11 『アアあミたl』
ボックス12 『アいみぃぞ』
ボックス13 『 l99ちVぎふ』
ボックス14 『アアアよぴァば』

 

23回目

ボックス ボックス名
ボックス3 『ついゥはぇぃにも』
ボックス8 『ア l99』
ボックス9 『けがDばァsやぶ』
ボックス10 『アアア むあミ』
ボックス11 『アアおlァば』
ボックス12 『アけがDば』
ボックス13 『 l99trミB』
ボックス14 『アアアィCFば』

 

24回目

ボックス ボックス名
ボックス3 『ついゥはぇぃぬも』
ボックス8 『ア けけせ』
ボックス9 『いそゼ  l99』
ボックス10 『アアア いう 』
ボックス11 『アア えお 』
ボックス12 『ア l99』
ボックス13 『っぇ くシょ く』
ボックス14 『アアア l99』

 

25回目

ボックス ボックス名
ボックス3 『ついゥはぇぃねも』
ボックス8 『アぶめ く』
ボックス9 『リギこく l99』
ボックス10 『アアア bうい』
ボックス11 『アアシYうい』
ボックス12 『アどXうい』
ボックス13 『ネYういフYうい』
ボックス14 『アアア l99』

 

26回目

ボックス ボックス名
ボックス3 『ついゥはぇぃのも』
ボックス8 『ア   い』
ボックス9 『たv かとn  』
ボックス10 『アアアっv か』
ボックス11 『アア l99』
ボックス12 『アVv か』
ボックス13 『ねご く l99』
ボックス14 『アアアワボのく』

 

27回目

ボックス ボックス名
ボックス3 『ついゥはぇぃはも』
ボックス8 『アゾも う』
ボックス9 『 l99トグこく』
ボックス10 『アアアわそ う』
ボックス11 『アア l99』
ボックス12 『アアアアア』
ボックス13 『アアアアアアアア』
ボックス14 『アアアアアアア』

 

4)バイナリエディタ実行コードの設定


 

f:id:BZL:20190716073547p:plain

バイナリエディタを起動するためのコードになります。

このコードを呼び出した戦闘の終了直後にバイナリエディタが起動します。

ボックス ボックス名
ボックス2 『アォめリば l』
ボックス3 『ついィはちべみぅ』
ボックス4 『アリめヂ  l』
ボックス5 『さkすぶせべいふ』
ボックス6 『アむぇそぱ l』
ボックス7 『せFしぶ むあタ』
ボックス8 『アGタあむ l』
ボックス9 『あメあぅだメうべ』
ボックス10 『アあチミBィC』
ボックス11 『アア Vうい』
ボックス12 『アりぃ も』
ボックス13 『ぎせ うらい』

 

起動環境が整ったら後は好きなように遊んでください

 

おまけ


イベントスクリプトの実行


0x03000E40 <- 0x01
0x03000E41 <- 0x02
0x03000E44 <- 0x00000000(word)
0x03000E48 <- イベントスクリプトのアドレス(word)
0x03000E38 <- 0x00 ※このアドレスの上書きは必ず最後に行う

 

AGB_FIRMで3DSからGBAROMを起動する

必要なもの:

PC

CFW導入済み3ds

GBAのROMファイル

3DNUS

3DS GBA Footer Generator

3DS Simple GBA Converter

o3ds:Old3DS_AGB_FIRM_v3665_SignPatcher

n3ds:New3DS_AGB_FIRM_v4816_SignPatcher

 

GBAのVCを起動する方法について日本語で書かれた記事が見当たらないので適当に書き記しておきます

CFWやFBIを導入する方法については各自ggってください

英語読める方は素直に配布サイトの解説読んで進めた方がいいです

brickしても自己責任でお願いします

 

AGB_FIRMの導入

1.3DNUSを使用し以下のファイルをダウンロード(使用するファイルを誤るとbrickする危険性があります)

o3DS:0004013800000202 v3665

n3DS:0004013820000202 v4816

 

2.以下のツールでパッチ当て

o3DS:Old3DS_AGB_FIRM_v3665_SignPatcher

n3DS:New3DS_AGB_FIRM_v4816_SignPatcher

 

3.sysからFBIを起動してパッチ済みのciaをインストールします

f:id:BZL:20160316195555j:plain

destinationをNANDに指定します

インストールが完了すればAGB_FIRMの導入は成功です

 

自作VCの作成

ポケモンのROMを起動させたい方はROMの書き換えが必要になります

他のゲームを起動したい方は飛ばしてください

 

バイナリエディタでROMを開き「D0 88 8D 83 42」と検索

D0 88 8D 83 42 xx xx xx 24 10 49 10 68

または

D0 88 8D 83 42 xx xx xx xx 24 10 49 10 68

のような文字列が引っ掛かるはずです

 

この文字列の内「xx」の部分を全て「00」で埋めます

検索で引っ掛かった文字列には全てこの作業を行います

日本語不自由で上手く説明できてないと思うので参考サイトも読んでおいた方が良いかもしれません

参考サイト:https://gbatemp.net/threads/fixes-for-all-gba-pokemons-save-issue-with-agb_firm.390508/ 

 

1.3DS GBA Footer Generatorを使用してGBAのROMからftfファイルを作成

 

2.3DS Simple GBA Converterからciaを作成、使用する画像は同梱されているものでも構いません

パッケージやタイトルが気になる方は自作して、どうぞ

 

3.作成したciaをFBIからsys、emuの両方にインストール

f:id:BZL:20160316202206j:plain

ホーム画面に表示、起動できれば導入成功です

お疲れ様でした