ポケモン赤緑で簡易版バイナリエディタを作ったお話

バイナリエディタとは?

アドレスの中身を書き換えるアイテムとなっています.
エンディングを呼び出したりミュウを出したりポケモンの中でテトリスを作ったりとなんでもできます.

バイナリエディタをなるべく早く作るための先行研究

バイナリエディタをなるべく早く作ること自体は多くの人がやっています.
アイスさんの動画やてらろーしゃさんの動画が有名なのかと思います.

どちらの方法もおもしろい方法でバイナリエディタが作られています.
しかしどちらの方法もミスをした際のリカバリが難しいのではないかと考えました.

簡易版バイナリエディタ

そこでリカバリが簡単になるように,そしてお二方の動画よりもさらに早くバイナリエディタを導入することができるようにするため,僕とでぃぐさんで簡易版バイナリエディタを作りました.
(でぃぐさんはミニバイナリエディタと呼んでいます)


またでぃぐさんに記事で紹介していただきました.

以下に載せるニックネームは ver.220121 よりもさらに短縮したもので 23 匹のニックネームを用いて簡易版バイナリエディタを実行するものとなります.

簡易版バイナリエディタ導入の方法

環境:ポケモン赤緑の後期版のみ動作を確認しています.
赤緑の初期版と青版については後述します.

準備するもの

  • なかよしバッヂ

あると望ましいもの

  • 未使用のボックス

なかよしバッヂの入手方法は調べてください.
もし「さいしょからはじめる」でプレイするならありす*さんのチャートがオススメです.
【初代ポケモン】なかよしバッヂ導入チャート【任意コード実行】 - Wonderland Seeker
以下の手順を踏むと簡易版バイナリエディタが起動します.

  1. サファリボールの残り個数を 0 個にする.「さいしょからはじめる」の場合はサファリゾーンによらなければ大丈夫です.
  2. 育て屋にニックネーム「うるてぽん」のついたポケモンを預ける.このポケモンは預けっぱなしにしてください.
  3. 以下のニックネームをつけたポケモンを未使用のボックスに預ける.(ありす*さんのチャートで進めているのであれば「5.イーブイをプログラムにしよう」でニックネームをつけていくのが良いです)
  4. なかよしバッヂを使用する.

もし簡易版バイナリエディタが起動しない場合はニックネームを見直してみる.
もしくはボックスを未使用のものに切り換えましょう.
(または後で紹介する方法に進んでください)

がんぜクョ
ぶづぜンづ
よヅぜウづ
にぽづにぞ
づなゅへへ
ううグ空だ
どグだギョ
べへにんグ
だゲぼダぞ
空へにんグ
わとんヅー
グリググだ
ざグわねん
ぱへふんぴ
へふんボぷ
へふんだし
ぼヂキづご
ョのなひだ
へよんち空
ぼダメにぽ
にュだガに
にヂ空ギて
ボデの

注意

初期アドレスは D9B3 となっています.
これは育て屋に預けるポケモン「うるてぽん」の最初の 2 文字が初期アドレスとなっているためです.
この最初の 2 文字を変えることで初期アドレスを変更することができます.

簡易版バイナリエディタの操作方法

以下の操作方法でアドレスとその中身を書き換えることができます.
操作方法

A: アドレス+1h
B: アドレス-1h
↓: 中身+1h
↑: 中身-1h
→: 中身+10h
←: 中身-10h
Start: 終了

バイナリエディタを起動するまで

ぽけもんとか。さんのコードを使ってバイナリエディタを起動させましょう.
https://pkmn.tk/z80/files/binary.txt
簡易版バイナリエディタを使って D9B3 から DA52 のアドレスの中身をリンク先のものに書き換えます.
書き換えたら簡易版バイナリエディタを終了してセーブすることをオススメします.
そしてその後 D984 から D987 のアドレスの中身を

00 C3 B3 D9

に書き換えます.
書き換えたら終了してもう一度なかよしバッヂを起動するとバイナリエディタが起動します.
起動しなかった場合はリセットしてバイナリエディタのコードを確認しましょう.

未使用のボックスがない場合

ニックネーム「うるてぽん」の変わりに「うるてEん」を使ってください.
ニックネーム「うるてEん」は以下の手順で作れます.

  1. サファリボールの残り個数を 0 or 30 個にする.
  2. 育て屋にニックネーム「てウん」のついたポケモンを預ける.サファリボールの個数が 0 の場合は預けたポケモンを引き取ってください.
  3. 以下のニックネームをつけたポケモンボックスの 6 匹目から順番に配置する.
  4. ニックネーム「うるてぽん」のポケモンを手持ちの 6 匹目に配置する.
  5. なかよしバッヂを使用する.

ゾケゼひぢ
ギめなぼづ
ゅにづづの

注意 (2022/08/07 追記)

D9B3 から DA52 のアドレスを用いてバイナリエディタを作成しているので,
この部分をバイナリエディタでいじると壊れるので注意してください.
特に DA00 から始まるプログラムを公開している方が一定数 (?) いらっしゃるので
これらのプログラムを動かしたいのであれば DA53 からでも実行できるように調整するというのが一つあります.
もう一つの方法として詳細は省くのですが完成したバイナリエディタを使ってもう一度 DE64 からバイナリエディタを作るという方法があります.

余談

オーキドせんせい研究者さんが 12:45 でバイナリエディタを起動するという RTA を走っていました.

今回紹介した 23 匹のニックネームは

に手を加えたものですが,一部オーキドせんせい研究者さんのプログラムを拝借させていただきました.

赤緑版初期版と青版について (2022/08/07 追記)

上から 4, 5 匹目
にぽづにぞ
づなゅへへ
の部分を
にぽづにピ
づなゅへへ
に読み替えることで赤緑初期版に,
にぽづ空空
空なゅへタ
に読み替えることで青版に対応します.
なお執筆者はどちらも持っていなく実際にできるか確認していないので自己責任でお願いします.何か問題がありましたらお知らせいただけますと幸いです.

またバイナリエディタ作成の際は

WRA1:DA0A CD 67 38	call 3867

の部分を赤緑初期版では

WRA1:DA0A CD 79 38	call 3879

としてください.青版では

WRA1:DA0A CD 8F 38	call 388F

としてください.

バイナリエディタ導入チャート (2022/12/10 追記)

オーキドせんせい研究者さんがバイナリエディタを 20 分で作成するチャートを解説していました.
自分の記事を参考にされたようで紹介していただきありがとうございます.
【初代ポケモン】お手軽20分。バイナリエディタ作成チャート解説【バグ技 任意コード実行】 - YouTube
まだ見たことない方は是非 1 度見ておくことをおすすめします.

この動画の簡易版バイナリエディタでは DCE0 にジャンプする機能をつけていました.
自分もその機能をつけて作ってみたので以下の URL の miniatur_memory_editor_RGB(JP).asm を参考に試してみてください.
ボックスに預けるポケモン 21 匹 (上のものより 2 匹少ない!) で作ることができます.
オーキドせんせい研究者さんの動画のものとは操作方法が異なるので好みが分かれるかもしれません.
またバイナリエディタを 171 byte から短縮したので以下の URL の memory_editor.asm に置いておきます.
memory_editor.asm · GitHub

バイナリエディタ導入の動画 (2024/03/06 追記)

バイナリエディタを導入するだけの動画を作成しました.
以下の動画が 2024/03/06 現在における最新の導入方法かと思います.
上記ではパソコンに預けているポケモンの領域を使ってバイナリエディタを作成しているのですがこの方法では未使用領域を使ったバイナリエディタとなります.
www.youtube.com

コード

WRA1:DE64 26 DE            ld   h,DE
WRA1:DE66 2E 87            ld   l,87
WRA1:DE68 AF               xor  a
WRA1:DE69 50               ld   d,b
WRA1:DE6A 3C               inc  a
WRA1:DE6B 32               ldd  (hl),a
WRA1:DE6C 2E AB            ld   l,AB
WRA1:DE6E 32               ldd  (hl),a
WRA1:DE6F 50               ld   d,b
WRA1:DE70 D6 11            sub  a,11
WRA1:DE72 2E 82            ld   l,82
WRA1:DE74 32               ldd  (hl),a
WRA1:DE75 50               ld   d,b
WRA1:DE76 C6 48            add  a,48
WRA1:DE78 32               ldd  (hl),a
WRA1:DE79 C6 2F            add  a,2F
WRA1:DE7B 50               ld   d,b
WRA1:DE7C 32               ldd  (hl),a
WRA1:DE7D C5               push bc
WRA1:DE7E E1               pop  hl

WRA1:DE7F CD (67) (38)     call 3867
WRA1:DE82 (F0) B3          ld   a,(ff00+B3)
WRA1:DE84 07               rlca 
WRA1:DE85 7F               ld   a,a
WRA1:DE86 30 (01)          jr   nc,DE89
WRA1:DE88 34               inc  (hl)
WRA1:DE89 07               rlca 
WRA1:DE8A 30 06            jr   nc,DE92
WRA1:DE8C AF               xor  a
WRA1:DE8D 50               ld   d,b
WRA1:DE8E 3D               dec  a
WRA1:DE8F CD C6 DE         call DEC6
WRA1:DE92 07               rlca 
WRA1:DE93 50               ld   d,b
WRA1:DE94 30 08            jr   nc,DE9E
WRA1:DE96 3E 0F            ld   a,0F
WRA1:DE98 2F               cpl  
WRA1:DE99 50               ld   d,b
WRA1:DE9A 7F               ld   a,a
WRA1:DE9B CD C6 DE         call DEC6
WRA1:DE9E 07               rlca 
WRA1:DE9F 50               ld   d,b
WRA1:DEA0 DC C4 DE         call c,DEC4
WRA1:DEA3 11 E3 50         ld   de,50E3
WRA1:DEA6 07               rlca 
WRA1:DEA7 D8               ret  c
WRA1:DEA8 07               rlca 
WRA1:DEA9 07               rlca 
WRA1:DEAA 30 (01)          jr   nc,DEAD
WRA1:DEAC 2B               dec  hl
WRA1:DEAD 07               rlca 
WRA1:DEAE DC C8 DE         call c,DEC8
WRA1:DEB1 50               ld   d,b
WRA1:DEB2 44               ld   b,h
WRA1:DEB3 CD CC DE         call DECC
WRA1:DEB6 45               ld   b,l
WRA1:DEB7 50               ld   d,b
WRA1:DEB8 CD CC DE         call DECC
WRA1:DEBB 1C               inc  e
WRA1:DEBC 46               ld   b,(hl)
WRA1:DEBD 50               ld   d,b
WRA1:DEBE CD CC DE         call DECC
WRA1:DEC1 30 BC            jr   nc,DE7F
WRA1:DEC3 50               ld   d,b

WRA1:DEC4 3E 10            ld   a,10

WRA1:DEC6 86               add  (hl)
WRA1:DEC7 32               ldd  (hl),a

WRA1:DEC8 2A               ldi  a,(hl)
WRA1:DEC9 50               ld   d,b
WRA1:DECA AF               xor  a
WRA1:DECB C9               ret  

WRA1:DECC C5               push bc
WRA1:DECD CB 30            swap b
WRA1:DECF 50               ld   d,b
WRA1:DED0 CD D6 DE         call DED6
WRA1:DED3 C1               pop  bc
WRA1:DED4 7F               ld   a,a
WRA1:DED5 50               ld   d,b
WRA1:DED6 3E 0F            ld   a,0F
WRA1:DED8 A0               and  b
WRA1:DED9 C6 48            add  a,48
WRA1:DEDB 50               ld   d,b
WRA1:DEDC C6 AE            add  a,AE
WRA1:DEDE 30 05            jr   nc,DEE5
WRA1:DEE0 C6 50            add  a,50
WRA1:DEE2 C6 10            add  a,10
WRA1:DEE4 7F               ld   a,a
WRA1:DEE5 06 C3            ld   b,C3
WRA1:DEE7 50               ld   d,b
WRA1:DEE8 1C               inc  e
WRA1:DEE9 12               ld   (de),a
WRA1:DEEA C9               ret  
WRA1:DEEB 50               ld   d,b

バイナリ

26 DE 2E 87 AF 50
3C 32 2E AB 32 50
D6 11 2E 82 32 50
C6 48 32 C6 2F 50
32 C5 E1 CD CD 50
B3 B3 07 7F 30 50
34 07 30 06 AF 50
3D CD C6 DE 07 50
30 08 3E 0F 2F 50
7F CD C6 DE 07 50
DC C4 DE 11 E3 50
07 D8 07 07 30 50
2B 07 DC C8 DE 50
44 CD CC DE 45 50
CD CC DE 1C 46 50
CD CC DE 30 BC 50
3E 10 86 32 2A 50
AF C9 C5 CB 30 50
CD D6 DE C1 7F 50
3E 0F A0 C6 48 50
C6 AE 30 05 C6 50
C6 10 7F 06 C3 50
1C 12 C9 50