ポケモン金銀にバイナリエディタを移植したお話 (ver.20220817)

この記事は旧バージョンです.新しいバージョンは以下のものとなります.
ポケモン金銀にバイナリエディタを移植したお話 - flag3833753

はじめに

以前,初代でバイナリエディタを導入する記事を出させていただきました.

このバイナリエディタポケモン金銀に移植しました.

そういうことで導入する方法について書こうと思います.

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

まずは簡易版バイナリエディタを導入します.
環境:ポケモン金銀での動作を確認しております.クリスタル版には非対応です.
準備:「たいせつポケット」の「わざマシン17」を用いた「最後に読んだメール」による任意コード実行環境*1

準備の詳細は次のブログ,動画にお任せします.Teraman64DD さんの動画だと Part.04 で導入しています.

以下の手順を踏むと簡易版バイナリエディタが起動します.

  1. ボックスの名前を表 1 の通りにする.
  2. 表 2 と表 3 のメールを用意する.
  3. 表 2 のメールを読んで「わざマシン17」を使用する.
  4. 表 3 のメールを読んで「わざマシン17」を使用する.

手順 3. の前にセーブすることをオススメします.

表 1

  1. ぼヂキづごョの空
  2. ヘォォグだ空どグ
  3. だガョベヘえリグ
  4. だグぼダぞヘえリ
  5. グわいリグリググ
  6. だ空ざグわかリぱ
  7. ヅまてヘぐまぴヘ
  8. まボぷヘぐまだつ
  9. がわぜにださ

表 2

がリぜたョぶづぜゃづよひぜすづ空
ぜゅひゼぼぐづの

表 3

ョぶゃよて4リなひだヘぞまちぼダ
メに0だガにだにだ空ボデの

簡易版バイナリエディタを起動するとこんな感じになると思います.

3 回目の記事になって今まで説明し忘れていたことに気付いたのですが
左 4 桁がアドレス,右 2 桁がその中身となっています.

見ての通り表示がおかしいのですが気にせず使いましょう.
■は A,▲は B,携帯マークは C だと思ってください.

注意

初期アドレスは DCC6 となっています.
これは 9 番目のボックスの 2 文字目「わ」と 4 文字目「に」に対応しています.
この 2 文字を変えることで初期アドレスを変更することができます.
初期アドレスを変えたくなった場合は 9 番目のボックスの名前を変更して表 3 のメールを実行すれば良いです.表 2 のメールを既に実行した場合再度実行しなくても良いです.

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

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

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

簡易版バイナリエディタを再度起動する場合は表 3 のメールを読んで「わざマシン17」を使用すれば良いです.表 2 のメールを読む必要はありません.

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

簡易版バイナリエディタを使ってアドレス DCC6 から DD92 の中身を後述のものに書き換えます.長いので一番下に載せています.

書き換えたら簡易版バイナリエディタを終了してセーブすることをオススメします.
その後「てにわ」と書かれたメールを読んで「わざマシン17」を使用するとバイナリエディタが起動できます.

二重線で囲まれた領域の左 4 桁がアドレス,右 2 桁がその中身となっています.
ゲーム画面の上部にも (16 進数で) 2 桁の数字があるのですが,これは SRAM バンクの数字が表示されています.アドレス A000 から BFFF の中身を扱う際に必要になってきます.

バイナリエディタの操作

初代でのバイナリエディタと殆ど同じですが「SELECT」のみ少し違います.

↓: アドレス+1
↑: アドレス-1
→: アドレス+10
←: アドレス-10
B+↓: アドレス+100
B+↑: アドレス-100
B+→: アドレス+1000
B+←: アドレス-1000
A+↓: 中身+1
A+↑: 中身-1
A+→: 中身+10
A+←: 中身-10
SELECT+↓: バンク+1
SELECT+↑: バンク-1
SELECT+→: バンク+10
SELECT+←: バンク-10
SELECT+A: 指しているアドレスを実行
START: 終了

「SELECT+A」は不用意に押すとフリーズする可能性が高いので気をつけましょう.

注意

DCC6 から DD92 のアドレスを用いてバイナリエディタを作成しているので,
この部分をバイナリエディタでいじると壊れるので注意してください.

またこの領域は敵トレーナーのポケモンが格納されている領域なので戦闘をするとバイナリエディタが壊れてしまいます.通信をしても壊れます.

戦闘をしても壊れないバイナリエディタの作り方

バイナリエディタをボックスに格納する

上記にもある通り戦闘をするとバイナリエディタが壊れます.戦闘をする度にバイナリエディタを作り直すのは面倒なので対策する必要があります.

まずバイナリエディタでアドレス DD93 から DDA7 の中身を

3E 03 01 CD 00 11 94 AA 21 C6 DC CD 9D 30 CD D6 30 CD AD 30 C9 

に書き換えてください.その後 DD93 で「Select+A」を押してください.
そうするとバンク 03 の AA94 から AB60 がバイナリエディタのコードに変化しています.確かめてみてください.
バンク 03 の AA94 から AB60 はボックス 9 のデータが格納されています.

実行用メールを作る

手持ちのポケモン 1 匹目に (任意コード実行などに) いらないメールを持たせてください.
その後バイナリエディタを起動して,バンクを 00 にしアドレス A600 から A616 の中身を

3E 03 01 CD 00 11 C6 DC 21 94 AA CD 9D 30 CD D6 30 CD AD 30 C3 C6 DC 

に書き換えてください.そうすると手持ちのポケモン 1 匹目が持っているメールが書き換えられます.このメールを読んで「わざマシン17」を使用するとバイナリエディタが起動されますが,このバイナリエディタは戦闘をしても壊れません.一度敵トレーナーと対戦してみて実際に壊れてないか確かめると良いです.

補足

アドレス A600 から A616 の中身を書き換えることでメールの中身を変えるという手法と取りましたが,他の手法としてはアドレス D8B2 から D8C8 の中身を

3E 03 01 CD 00 11 C6 DC 21 94 AA CD 9D 30 CD D6 30 CD AD 30 C3 C6 DC 

に書き換えて「ボックス 1 の名前」による任意コード実行を行うという手法があります.そうすると一々メールを読まなくてもバイナリエディタが起動できます.この手法のデメリットとして,簡易版バイナリエディタを壊してしまうので (バイナリエディタを作成してしまえば簡易版は不要になるのですが) 失敗した場合リカバリが面倒になります.(執筆者はどのアドレスに何が格納されているのかあまり詳しくないので) もしかするともっと格納するのにいいアドレスがあるかもしれません.

参考文献

今回のバイナリエディタを作るにあたって参考にした文献は次の 3 つです.日本語版のポケモン金銀バイナリエディタに関する動画,記事は (執筆者の調べた限りだと) 最初の 2 つぐらいしかない気がします.

pokemonbug @ ウィキさんの記事にもバイナリエディタのコードがあります.こちらは 344 バイトととても長くまた操作が初代でのバイナリエディタと異なります.そのため初代のバイナリエディタを移植するという形でポケモン金銀でもバイナリエディタを使えるようにしました.こちらは 205 バイトとなっています.
pokemonbug @ ウィキさんの記事にあるバイナリエディタは ROM バンクの切り替えもできるようですが,この機能は今回紹介するバイナリエディタの機能にはありません.

コード

WRA1:DCC6 11 B2 4E         ld   de,4EB2
WRA1:DCC9 21 00 90         ld   hl,9000
WRA1:DCCC 01 23 3E         ld   bc,3E23
WRA1:DCCF CD 76 0E         call 0E76
WRA1:DCD2 AF               xor  a
WRA1:DCD3 3C               inc  a
WRA1:DCD4 E0 D6            ld   (ff00+D6),a
WRA1:DCD6 21 00 DA         ld   hl,DA00
WRA1:DCD9 CD 2E DD         call DD2E
WRA1:DCDC E5               push hl
WRA1:DCDD 54               ld   d,h
WRA1:DCDE 5D               ld   e,l
WRA1:DCDF 3E F8            ld   a,F8
WRA1:DCE1 83               add  e
WRA1:DCE2 5F               ld   e,a
WRA1:DCE3 38 01            jr   c,DCE6
WRA1:DCE5 15               dec  d
WRA1:DCE6 06 12            ld   b,12
WRA1:DCE8 FA BD D1         ld   a,(D1BD)
WRA1:DCEB 21 A9 C3         ld   hl,C3A9
WRA1:DCEE CD 9D 30         call 309D
WRA1:DCF1 CD 21 DD         call DD21
WRA1:DCF4 3E 7C            ld   a,7C
WRA1:DCF6 22               ldi  (hl),a
WRA1:DCF7 7A               ld   a,d
WRA1:DCF8 CD 21 DD         call DD21
WRA1:DCFB 7B               ld   a,e
WRA1:DCFC CD 21 DD         call DD21
WRA1:DCFF 3E 7F            ld   a,7F
WRA1:DD01 22               ldi  (hl),a
WRA1:DD02 1A               ld   a,(de)
WRA1:DD03 CD 21 DD         call DD21
WRA1:DD06 36 7C            ld   (hl),7C
WRA1:DD08 3E 0C            ld   a,0C
WRA1:DD0A 85               add  l
WRA1:DD0B 6F               ld   l,a
WRA1:DD0C 30 01            jr   nc,DD0F
WRA1:DD0E 24               inc  h
WRA1:DD0F 1C               inc  e
WRA1:DD10 20 01            jr   nz,DD13
WRA1:DD12 14               inc  d
WRA1:DD13 05               dec  b
WRA1:DD14 20 DE            jr   nz,DCF4
WRA1:DD16 CD AD 30         call 30AD
WRA1:DD19 21 4B C4         ld   hl,C44B
WRA1:DD1C 36 ED            ld   (hl),ED
WRA1:DD1E E1               pop  hl
WRA1:DD1F 18 B8            jr   DCD9
WRA1:DD21 F5               push af
WRA1:DD22 CB 37            swap a
WRA1:DD24 CD 28 DD         call DD28
WRA1:DD27 F1               pop  af
WRA1:DD28 E6 0F            and  a,0F
WRA1:DD2A C6 F6            add  a,F6
WRA1:DD2C 22               ldi  (hl),a
WRA1:DD2D C9               ret  
WRA1:DD2E CD F4 36         call 36F4
WRA1:DD31 F0 AB            ld   a,(ff00+AB)
WRA1:DD33 5F               ld   e,a
WRA1:DD34 CB 5F            bit  3,a
WRA1:DD36 28 02            jr   z,DD3A
WRA1:DD38 C1               pop  bc
WRA1:DD39 C9               ret  
WRA1:DD3A CB 77            bit  6,a
WRA1:DD3C 28 04            jr   z,DD42
WRA1:DD3E 3E FF            ld   a,FF
WRA1:DD40 18 19            jr   DD5B
WRA1:DD42 CB 7F            bit  7,a
WRA1:DD44 28 04            jr   z,DD4A
WRA1:DD46 3E 01            ld   a,01
WRA1:DD48 18 11            jr   DD5B
WRA1:DD4A CB 67            bit  4,a
WRA1:DD4C 28 04            jr   z,DD52
WRA1:DD4E 3E 10            ld   a,10
WRA1:DD50 18 09            jr   DD5B
WRA1:DD52 CB 6F            bit  5,a
WRA1:DD54 28 04            jr   z,DD5A
WRA1:DD56 3E F0            ld   a,F0
WRA1:DD58 18 01            jr   DD5B
WRA1:DD5A AF               xor  a
WRA1:DD5B CB 53            bit  2,e
WRA1:DD5D 28 0D            jr   z,DD6C
WRA1:DD5F CB 43            bit  0,e
WRA1:DD61 28 01            jr   z,DD64
WRA1:DD63 E9               jp   hl
WRA1:DD64 E5               push hl
WRA1:DD65 21 BD D1         ld   hl,D1BD
WRA1:DD68 86               add  (hl)
WRA1:DD69 77               ld   (hl),a
WRA1:DD6A E1               pop  hl
WRA1:DD6B C9               ret  
WRA1:DD6C CB 43            bit  0,e
WRA1:DD6E 28 0E            jr   z,DD7E
WRA1:DD70 F5               push af
WRA1:DD71 FA BD D1         ld   a,(D1BD)
WRA1:DD74 CD 9D 30         call 309D
WRA1:DD77 F1               pop  af
WRA1:DD78 86               add  (hl)
WRA1:DD79 77               ld   (hl),a
WRA1:DD7A CD AD 30         call 30AD
WRA1:DD7D C9               ret  
WRA1:DD7E CB 4B            bit  1,e
WRA1:DD80 28 03            jr   z,DD85
WRA1:DD82 84               add  h
WRA1:DD83 67               ld   h,a
WRA1:DD84 C9               ret  
WRA1:DD85 CB 7F            bit  7,a
WRA1:DD87 28 05            jr   z,DD8E
WRA1:DD89 85               add  l
WRA1:DD8A 6F               ld   l,a
WRA1:DD8B D8               ret  c
WRA1:DD8C 25               dec  h
WRA1:DD8D C9               ret  
WRA1:DD8E 85               add  l
WRA1:DD8F 6F               ld   l,a
WRA1:DD90 D0               ret  nc
WRA1:DD91 24               inc  h
WRA1:DD92 C9               ret  

バイナリ

11 B2 4E 21 00 90 01 23 3E CD 76 0E AF 3C E0 D6
21 00 DA CD 2E DD E5 54 5D 3E F8 83 5F 38 01 15
06 12 FA BD D1 21 A9 C3 CD 9D 30 CD 21 DD 3E 7C
22 7A CD 21 DD 7B CD 21 DD 3E 7F 22 1A CD 21 DD
36 7C 3E 0C 85 6F 30 01 24 1C 20 01 14 05 20 DE
CD AD 30 21 4B C4 36 ED E1 18 B8 F5 CB 37 CD 28
DD F1 E6 0F C6 F6 22 C9 CD F4 36 F0 AB 5F CB 5F
28 02 C1 C9 CB 77 28 04 3E FF 18 19 CB 7F 28 04
3E 01 18 11 CB 67 28 04 3E 10 18 09 CB 6F 28 04
3E F0 18 01 AF CB 53 28 0D CB 43 28 01 E9 E5 21
BD D1 86 77 E1 C9 CB 43 28 0E F5 FA BD D1 CD 9D
30 F1 86 77 CD AD 30 C9 CB 4B 28 03 84 67 C9 CB
7F 28 05 85 6F D8 25 C9 85 6F D0 24 C9                                

*1:ポケットは「わざマシンポケット」でなければ良いです.アドレス CF21 が実行できれば「わざマシン17」である必要もありません.「わざマシン17」でない道具で任意コード実行環境を用意した場合は適宜読み替えてください.