Site cover image

🐾flag3

ポケットモンスター クリスタル バイナリエディタ

English version is here:

📄Arrow icon of a page linkRAM Writer in Pokémon Crystal (JP)

バイナリエディタは、元々初代ポケモンにおける任意コード実行の究極の到達点とも言えるツールで、今回紹介するバイナリエディタは第二世代用に移植されたものです。このエディタを使用すると、ゲーム内のあらゆるメモリの読み書きが可能になります。さらに、プログラムを記述し、実行させることもできます。

本記事は以下の動画の解説となります。

バイナリエディタ導入手順

環境

ポケットモンスター クリスタルの日本語版のみに対応しています。ポケットモンスター 金・銀や日本語版以外のバージョンには対応していません。またポケモンスタジアム金銀のGBビルや一部のエミュレータでは動作しません。

手順1: 手持ちのポケモンを2匹にする

さいしょからはじめる場合は、モンスターボールを入手するまで進める必要があります。主人公の性別,時間,主人公の名前,曜日、最初のポケモン、ライバルの名前はなんでも良いです。わざマシン17を使ってバイナリエディタを起動するまで手持ちのポケモンを3匹以上にしないでください

手順2: ボックスの名前を変更する

ボックスの名前を以下のようにしてください。

📦
ボックス1:ダだギョにヂだゾ

ボックス2:ダだゲムよダだガ

ボックス3:よノゥネろてエろ

ボックス4:にらヅノるひジデ

ボックス5:にテゥキリゅゅの

ボックス6:へブひひ はムろ

ボックス7:どダれアろダだや

ボックス8:ざダれむをダリ

ボックス9:だかがをぜジだを

手順3: 名前がバグったポケモンを入手

  1. セーブをする際に特定のタイミングで強制リセットをすることで、名前がバグったポケモンを入手します。
    1. さいしょからはじめた場合はボックス3に切り替えます。既存のセーブデータで行う際は一度も満タンにしたことのないボックスに切り替えます。一度も使用したことのないボックスにすることをお勧めします。ボックスの切り替えによるセーブを行うようにしてください。
    2. ポケモンを1匹預けます。「ボックスせいり/メールはずしてね」を選択し、レポートにうえからかいてもいいですか?に対して「はい」を押して、「でんげんをきらないでください」と完全に表示された直後に強制リセットをします。
    3. ゲームを再開させて、リュックを開いてから、ボックスの状態を確認します。
    4. 新しく預けたポケモンのニックネームが?からなる文字列になっていれば成功しています。そうでない場合はb.をやり直してください。ポケモンが預けられていない場合は、リセットが早すぎたことになります。ポケモンが正常に預けられている場合は、リセットが遅すぎたことになります。
  2. 名前がバグったポケモンを入手したらボックス3の一番上に配置してください。
  3. (既存のセーブデータを使っている場合は)ボックス3に切り替えてください。

手順4: 0x1500制御コードによる任意コード実行を行う

  1. 名前がバグったポケモンを入手したらどうぐの1番目を不要なアイテムにしてパソコンの前でセーブとリセットを行います
  2. ゲームを再開後、パソコンの前から左に1歩、下に1歩移動しポケモンずかんを開きます。この場所でポケモンずかんを開くようにしてください。
    Image in a image block
  3. ポケモンずかんでカーソルをオニスズメに合わせます。
    • ポッポ以外のポケモンに遭遇したことがない場合は「しんがたずかんモード」ではカーソルをオニスズメに合わせることができないので「ふるいずかんモード」に切り替えてカーソルをオニスズメに合わせるようにしてください。
    • しんがたずかんモードの並び方は以下のようになっているのでオニスズメに遭遇したことがない場合でもこれを目印にしてカーソルをオニスズメにすると良いです。
      🔍
      ワニノコ

      アリゲイツ

      オーダイル

      ポッポ

      ピジョン

      ピジョット

      オニスズメ

      オニドリル

      ホーホー

      ヨルノズク

      コラッタ

      ラッタ

      オタチ

  4. ポケモンずかんを閉じてから、右に1歩、上に1歩進んでパソコンを開き名前がバグったポケモンのニックネームを表示させます。ポケモンずかんを閉じてからはこの順番の通りに進んでください。この移動の順番を守らないと失敗します。

フリーズすることなく以下のようになれば成功となります。

  • ボックス6の名前が「へブばん どうろひ はムろ」に変化する。
  • どうぐの1番目がはながらメールに変化する。

手順5: 簡易版バイナリエディタ導入

ボックス3からボックス5までの名前を以下のようにしてください。ボックス6の名前は変更しないでください

📦
ボックス3:だじダムキづごぱ

ボックス4:ヅまとへゲみぴよ

ボックス5:へゲみボぷへゲみ

ボックスの名前を変更したらボックスの名前が以下のようになっていることを確認してください。

📦
ボックス1:ダだギョにヂだゾ

ボックス2:ダだゲムよダだガ

ボックス3:だじダムキづごぱ

ボックス4:ヅまとへゲみぴよ

ボックス5:へゲみボぷへゲみ

ボックス6:へブばん どうろひ はムろ

ボックス7:どダれアろダだや

ボックス8:ざダれむをダリ

ボックス9:だかがをぜジだを

下記の内容のメールをポケモンに持たせます。

✉️
へなづていろなひだへダみちぼダメ
に0ぞ?ムぞボデののののののだっ

メールの作成後はメールの中身を読みます。その後ずかんを開くことで簡易版バイナリエディタを起動することができます。

簡易版バイナリエディタ

これ以降、上記のメールを読んでからずかんを開くたびに簡易版バイナリエディタを起動することができます。

Image in a image block

左側のDD0Bが書き換えようとしているメモリのアドレスで、右の00がその中身です。この簡易版バイナリエディタではA、B、Cの表示が正常でないことに注意してください。Aがg、Bが横線、Cが電話マークとなっています。

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

B: アドレス-01

A: アドレス+01

↑: 中身-01

↓: 中身+01

←: 中身-10

→: 中身+10

START: 終了

SELECT: DDD1からのコードを実行(プログラム入力するまで押さないように注意)

手順6: バイナリエディタ導入

簡易版バイナリエディタを使用してバイナリエディタのプログラムを入力していきます。入力を終えたらセレクトボタンを押すことでバイナリエディタを起動することができます。バイナリエディタを起動する前に一旦スタートボタンを押して簡易版バイナリエディタを終了させてセーブすることをお勧めします。

アドレス中身
DD0BCD
DD0CC5
DD0D32
DD0ECD
DD0FC2
DD1031
DD11CD
DD123B
DD130E
DD14CD
DD1549
DD160E
DD1711
DD1800
DD1940
DD1A21
DD1B00
DD1C96
DD1D01
DD1E19
DD1F3E
DD20CD
DD21B3
DD220D
DD23F0
DD249D
DD25F5
DD2621
DD2700
DD28D0
DD29CD
DD2A5C
DD2BC8
DD2CE5
DD2D11
DD2EF8
DD2FFF
DD3019
DD31E5
DD32D1
DD3321
DD34A9
DD35C4
DD36F0
DD379D
DD38CD
DD399D
DD3A2F
DD3BCD
DD3CAB
DD3DC8
DD3E01
DD3F0C
DD4000
DD4136
DD427C
DD4323
DD447A
DD45CD
DD46AB
DD47C8
DD487B
DD49CD
DD4AAB
DD4BC8
DD4C36
DD4D7F
DD4E23
DD4F1A
DD50CD
DD51AB
DD52C8
DD5313
DD5436
DD557C
DD5609
DD577C
DD58FE
DD59C6
DD5A20
DD5BE5
DD5CCD
DD5DAD
DD5E2F
DD5F3E
DD60ED
DD61EA
DD624B
DD63C5
DD64E1
DD6518
DD66C2
DD67CD
DD681B
DD6935
DD6AF0
DD6BA9
DD6C5F
DD6D01
DD6E01
DD6F00
DD7007
DD7138
DD721E
DD730B
DD740B
DD7507
DD7638
DD7719
DD780E
DD79F0
DD7A07
DD7B38
DD7C14
DD7D01
DD7E10
DD7F00
DD8007
DD8138
DD820E
DD8348
DD8407
DD8530
DD860A
DD87E1
DD88F1
DD89D7
DD8A3E
DD8BF9
DD8CE0
DD8D70
DD8EC3
DD8FED
DD9021
DD917B
DD920F
DD9330
DD9410
DD950F
DD960F
DD9730
DD9801
DD99E9
DD9AF0
DD9B9D
DD9CCD
DD9D9D
DD9E2F
DD9F79
DDA086
DDA177
DDA2C3
DDA3AD
DDA42F
DDA50F
DDA638
DDA705
DDA80F
DDA938
DDAA06
DDAB09
DDACC9
DDAD79
DDAE84
DDAF67
DDB0C9
DDB1F0
DDB29D
DDB381
DDB4D7
DDB5C9
DDB6F5
DDB7CB
DDB837
DDB9CD
DDBAB2
DDBBC8
DDBCF1
DDBDE6
DDBE0F
DDBFC6
DDC0F6
DDC1F6
DDC260
DDC322
DDC4C9
DDD111
DDD2DE
DDD3AF
DDD4CD
DDD5DB
DDD6DD
DDD711
DDD800
DDD9C8
DDDAD5
DDDB3E
DDDC03
DDDD01
DDDEBA
DDDF00
DDE021
DDE10B
DDE2DD
DDE3CD
DDE49D
DDE52F
DDE6C3
DDE7F2
DDE82F

バイナリエディタ

これ以降、簡易版バイナリエディタを起動してからセレクトボタンを押すたびに、バイナリエディタを起動することができます。

Image in a image block

画面上部の10が現在のROMバンクとSRAMバンクとなります。

🎮
バイナリエディタ操作方法

↑: アドレス-01

↓: アドレス+01

←: アドレス-10

→: アドレス+10

B+↑: アドレス-100

B+↓: アドレス+100

B+←: アドレス-1000

B+→: アドレス+1000

A+↑: 中身-01

A+↓: 中身+01

A+←: 中身-10

A+→: 中身+10

START: 終了

SELECT+↑: バンク-01

SELECT+↓: バンク+01

SELECT+←: バンク-10

SELECT+→: バンク+10

SELECT+A: 現在のアドレスからのコードを実行(注意して使用してください)

バイナリエディタを使ってアドレスD300~D30B、DA47~DA55の中身を以下のように書き換えてください。

アドレス中身
D3003E
D301D0
D302EA
D303C6
D304D0
D3053E
D30603
D30721
D308D7
D30955
D30ACF
D30BC9
DA473E
DA4803
DA4901
DA4ABA
DA4B00
DA4C11
DA4D00
DA4EC8
DA4F21
DA50DE
DA51AF
DA52D5
DA53C3
DA548C
DA5568

書き変えたらカーソルをアドレスD300に合わせてSELECT+Aボタンを押すことでたいせつなものポケットにわざマシン17を入手することができます。このわざマシン17を使うたびにバイナリエディタを直接起動することができます。

Image in a image block

手順7: 通常の状態に戻す

バイナリエディタの導入で様々な副作用が発生しています。

  • ポケモンずかん
  • ボックス名
  • 名前がバグったポケモン
ポケモンずかん

アドレスD94Cの中身を00にすることでポケモンずかんを正常にすることができます。

ボックス名

わざマシン17によるバイナリエディタ導入後はボックス名を好きなように変えることができます。

バンクを01にしてカーソルをアドレス5C95に合わせてSELECT+Aボタンを押すことでボックスの名前をデフォルトの名前に戻すことができます。

名前がバグったポケモン

リュックを開いてからボックスを開いて名前がバグったポケモンを逃がしてください。

使用上の注意

SRAMバンク03のアドレスAFDE~B097及びアドレスC800~C8B9、DA47~DA55はバイナリエディタで編集しないようにしてください。

技術的補足

0x1500制御コードによる任意コード実行

0x1500制御コードによる任意コード実行はポケットモンスター クリスタルで発見された任意コード実行の手法でポケットモンスター 金・銀では実行できません。テキスト文字列内の0x15制御文字の後に0x00が続く組み合わせが関係しています。

0x15制御文字を読み込むことで次の文字を引数としてモバイルスクリプトが実行されます。次の文字の内部番号が0x01~0x0Fならばモバイル関数を実行し、0x10以上ならばモバイルスクリプトを終了する処理となっています。しかし0x00については適切に処理されずにアドレスCD46が実行されます。アドレスCD46は一部のモバイル関数で使用されるアドレスとなっています。したがって、テキストが0x15、0x00の組み合わせを見つけることでアドレスCD46を実行することができます。

アドレス機能
D05Bポケモンやアイテムの名前が一時的に格納されるアドレス
D0C8現在選択されているポケモンの種族が一時的に格納されるアドレス
D0C9現在選択されているポケモンが何番目かが一時的に格納されるアドレス
D0CEポケモンの情報を一時的に格納するアドレス
D296ポケモンの種族を一時的に格納するアドレス
D297戦闘から逃げることに失敗したときに関連するアドレス

ゲームをリセットするとアドレスD05B以降の中身が0x00となります。名前がバグったポケモンには名前の終端を示す0x50がないために、名前がバグったポケモンのニックネームを表示させようとすると終端を示す0x50を出力するまでテキストを読み込もうとします。

ゲームを再開後上記の手順の通りに行動をすると、アドレスD0C8の中身は最後にずかんで姿を見たポケモンの種族のID、アドレスD0C9の中身は0x02、アドレスD0CEの中身は0x00、アドレスD296の中身は0x15、アドレスD297の中身は0x00となります。アドレスD0C9の中身が0x02となっている理由は毒状態の判定のためであり手持ちのポケモンの所持数と同じとなります。

オニスズメをみつけたことがない場合は、アドレスD0C8の中身は0x15にはならないです。そのためアドレスD296の中身0x15をテキストとして読み込もうとする際に、次のアドレスD297の中身0x00を引数としてモバイルスクリプトを実行するためアドレスCD46が実行されます。

オニスズメをみつけたことがある場合は、アドレスD0C8の中身は0x15となり、次のアドレスD0C9の中身0x02を引数としてモバイルスクリプトを実行します。0x02に対応するモバイル関数を実行することで、アドレスD0CEの中身0x00を引数としてモバイルスクリプトを実行するためアドレスCD46が実行されます。

指定された位置でずかんを開いて1歩右に移動して1歩上に移動すると、アドレスCD64以降の中身を C2 9B C4 (jp nz, C49B) にします。アドレスCD46からCD63までは0x00が格納されているので、アドレスCD46を実行した後はアドレスC49Bを実行することになります。

画面に関するデータ

アドレスC49BからC49Fまでは00が格納されています。アドレスC4A0以降は画面に関するデータが格納されており以下のようになっています。

WRA0:C4A0 7F               ld   a,a
WRA0:C4A1 7F               ld   a,a
WRA0:C4A2 7F               ld   a,a
WRA0:C4A3 7F               ld   a,a
WRA0:C4A4 7F               ld   a,a
WRA0:C4A5 7F               ld   a,a
WRA0:C4A6 7F               ld   a,a
WRA0:C4A7 7F               ld   a,a
WRA0:C4A8 7F               ld   a,a
WRA0:C4A9 79               ld   a,c
WRA0:C4AA 7A               ld   a,d
WRA0:C4AB 7A               ld   a,d
WRA0:C4AC 7A               ld   a,d
WRA0:C4AD 7A               ld   a,d
WRA0:C4AE 7A               ld   a,d
WRA0:C4AF 7A               ld   a,d
WRA0:C4B0 7A               ld   a,d
WRA0:C4B1 7A               ld   a,d
WRA0:C4B2 7A               ld   a,d
WRA0:C4B3 7B               ld   a,e
WRA0:C4B4 7F               ld   a,a
WRA0:C4B5 7F               ld   a,a
WRA0:C4B6 7F               ld   a,a
WRA0:C4B7 7F               ld   a,a
WRA0:C4B8 7F               ld   a,a
WRA0:C4B9 7F               ld   a,a
WRA0:C4BA 7F               ld   a,a
WRA0:C4BB 7F               ld   a,a
WRA0:C4BC 7F               ld   a,a
WRA0:C4BD 7C               ld   a,h
WRA0:C4BE 7F               ld   a,a
WRA0:C4BF 7F               ld   a,a
WRA0:C4C0 7F               ld   a,a
WRA0:C4C1 7F               ld   a,a
WRA0:C4C2 7F               ld   a,a
WRA0:C4C3 7F               ld   a,a
WRA0:C4C4 7F               ld   a,a
WRA0:C4C5 7F               ld   a,a
WRA0:C4C6 7F               ld   a,a
WRA0:C4C7 7C               ld   a,h
WRA0:C4C8 7F               ld   a,a
WRA0:C4C9 7F               ld   a,a
WRA0:C4CA 7F               ld   a,a
WRA0:C4CB 7F               ld   a,a
WRA0:C4CC 7F               ld   a,a
WRA0:C4CD 7F               ld   a,a
WRA0:C4CE 7F               ld   a,a
WRA0:C4CF 7F               ld   a,a
WRA0:C4D0 7F               ld   a,a
WRA0:C4D1 7C               ld   a,h
WRA0:C4D2 D6 98            sub  a,98
WRA0:C4D4 EA 97 DB         ld   (DB97),a
WRA0:C4D7 C3 83 DB         jp   DB83

ボックス名

説明

0x1500制御コードによる任意コード実行ではボックス3からボックス5の名前を利用しています。アドレスC4D2以降は現在のボックスの名前に関する画面のデータが格納されており、手順通りに行うとボックス3の名前となっています。

アドレスC4D1まで実行することによってaレジスタにはCDが格納されているので、この任意コード実行の効果は、アドレスDB97の中身を35、アドレスD94Cの中身を0C、アドレスD886の中身を9Eにする効果となります。

アドレスDB97はボックスの名前を格納しており、簡易版バイナリエディタを実行するために書き換えます。アドレスD94Cはポケモンずかんのモードを格納しており、正常でない値を入れることによってポケモンずかんを使って任意コード実行を行うようにします。アドレスD886はどうぐの1番目の種類を格納しており、9Eにすることでどうぐをの1番目をはながらメールにします。

WRA0:C4D2 D6 98            sub  a,98
WRA0:C4D4 EA 97 DB         ld   (DB97),a
WRA0:C4D7 C3 83 DB         jp   DB83

WRA1:DB83 C6 D7            add  a,D7
WRA1:DB85 11 98 D9         ld   de,D998
WRA1:DB88 CB 0B            rrc  e
WRA1:DB8A 12               ld   (de),a
WRA1:DB8B 50               ld   d,b
WRA1:DB8C C6 92            add  a,92
WRA1:DB8E EA 86 D8         ld   (D886),a
WRA1:DB91 E1               pop  hl
WRA1:DB92 E1               pop  hl
WRA1:DB93 C9               ret  
WRA1:DB94 50               ld   d,b
バイナリ
C4D2:
D6 98 EA A0 DB C3 83 DB

DB83:
C6 D7 11 98 D9 CB 0B 12 50
C6 92 EA 86 D8 E1 E1 C9 50

簡易版バイナリエディタ

説明

ポケモンずかんのモードを0Cにしてポケモンずかんを開くことでアドレスD021を実行します。アドレスD002からD022までは最後に閲覧したメールの内容を格納しているため、メールを読んでからポケモンずかんを開くことで簡易版バイナリエディタを起動することができます。

簡易版バイナリエディタはhlレジスタが指しているアドレスとその中身を出力するプログラムです。キーの入力でhlレジスタの指すアドレスとその中身を変化させるようにしています。

WRA1:D002 CD C5 32         call 32C5
WRA1:D005 C3 B2 DB         jp   DBB2
WRA1:D008 C5               push bc
WRA1:D009 CB 30            swap b
WRA1:D00B CD 0F D0         call D00F
WRA1:D00E C1               pop  bc
WRA1:D00F 3E 0F            ld   a,0F
WRA1:D011 A0               and  b
WRA1:D012 4E               ld   c,(hl)
WRA1:D013 C6 F6            add  a,F6
WRA1:D015 2F               cpl  
WRA1:D016 E6 9F            and  a,9F
WRA1:D018 2F               cpl  
WRA1:D019 1C               inc  e
WRA1:D01A 12               ld   (de),a
WRA1:D01B C9               ret  
WRA1:D01C C9               ret  
WRA1:D01D C9               ret  
WRA1:D01E C9               ret  
WRA1:D01F C9               ret  
WRA1:D020 C9               ret  
WRA1:D021 30 DF            jr   nc,D002

WRA1:DB68 0F               rrca 
WRA1:DB69 30 06            jr   nc,DB71
WRA1:DB6B AF               xor  a
WRA1:DB6C C6 10            add  a,10
WRA1:DB6E 30 0E            jr   nc,DB7E
WRA1:DB70 50               ld   d,b
WRA1:DB71 0F               rrca 
WRA1:DB72 30 08            jr   nc,DB7C
WRA1:DB74 9F               sbc  a
WRA1:DB75 D6 0F            sub  a,0F
WRA1:DB77 30 05            jr   nc,DB7E
WRA1:DB79 50               ld   d,b
WRA1:DB7A 30 2C            jr   nc,DBA8
WRA1:DB7C 0F               rrca 
WRA1:DB7D 9F               sbc  a
WRA1:DB7E 86               add  (hl)
WRA1:DB7F 32               ldd  (hl),a
WRA1:DB80 2A               ldi  a,(hl)
WRA1:DB81 44               ld   b,h
WRA1:DB82 50               ld   d,b
WRA1:DB83 11 CF C4         ld   de,C4CF
WRA1:DB86 CD 08 D0         call D008
WRA1:DB89 45               ld   b,l
WRA1:DB8A D6 50            sub  a,50
WRA1:DB8C CD 08 D0         call D008
WRA1:DB8F 1C               inc  e
WRA1:DB90 46               ld   b,(hl)
WRA1:DB91 CD 08 D0         call D008
WRA1:DB94 50               ld   d,b
WRA1:DB95 CD 1B 35         call 351B
WRA1:DB98 CB 7F            bit  7,a
WRA1:DB9A CA 9F DB         jp   z,DB9F
WRA1:DB9D 50               ld   d,b
WRA1:DB9E 34               inc  (hl)
WRA1:DB9F 0F               rrca 
WRA1:DBA0 DA 80 DB         jp   c,DB80
WRA1:DBA3 0F               rrca 
WRA1:DBA4 30 D4            jr   nc,DB7A
WRA1:DBA6 50               ld   d,b
WRA1:DBA7 2B               dec  hl
WRA1:DBA8 0F               rrca 
WRA1:DBA9 DA D1 DD         jp   c,DDD1
WRA1:DBAC 0F               rrca 
WRA1:DBAD D8               ret  c
WRA1:DBAE 50               ld   d,b
WRA1:DBAF 50               ld   d,b
WRA1:DBB0 30 B6            jr   nc,DB68
WRA1:DBB2 26 DD            ld   h,DD
WRA1:DBB4 2E 0B            ld   l,0B
WRA1:DBB6 30 DD            jr   nc,DB95
WRA1:DBB8 50               ld   d,b
バイナリ
D002:
CD C5 32 C3 B2 DB C5 CB 30 CD 0F D0 C1 3E 0F A0 4E
C6 F6 2F E6 9F 2F 1C 12 C9 C9 C9 C9 C9 C9 30 DF

DB68:
0F 30 06 AF C6 10 30 0E 50
0F 30 08 9F D6 0F 30 05 50
30 2C 0F 9F 86 32 2A 44 50
11 CF C4 CD 08 D0 45 D6 50
CD 08 D0 1C 46 CD 08 D0 50
CD 1B 35 CB 7F CA 9F DB 50
34 0F DA 80 DB 0F 30 D4 50
2B 0F DA D1 DD 0F D8 50 50
30 B6 26 DD 2E 0B 30 DD 50

簡易版バイナリエディタのセレクトボタンで実行したコード

説明

アドレスDD0B以降の中身をSRAMバンク03のアドレスAFDE以降とアドレスC800以降へコピーをしてC800を実行するプログラムとなっています。

WRA1:DDD1 11 DE AF         ld   de,AFDE
WRA1:DDD4 CD DB DD         call DDDB
WRA1:DDD7 11 00 C8         ld   de,C800
WRA1:DDDA D5               push de
WRA1:DDDB 3E 03            ld   a,03
WRA1:DDDD 01 BA 00         ld   bc,00BA
WRA1:DDE0 21 0B DD         ld   hl,DD0B
WRA1:DDE3 CD 9D 2F         call 2F9D
WRA1:DDE6 C3 F2 2F         jp   2FF2
バイナリ
11 DE AF CD DB DD 11 00 C8 D5 3E 03 01 BA 00 21 
0B DD CD 9D 2F C3 F2 2F

バイナリエディタ

説明

バイナリエディタはhlレジスタが指しているアドレスを含む18個のアドレスとその中身を出力するプログラムとなっています。更に画面上部にROMバンクとSRAMバンクを表示させて変更しやすいようにしています。アドレスC800を実行することでバイナリエディタを起動することができるようになっています。

WRA0:C800 CD C5 32         call 32C5
WRA0:C803 CD C2 31         call 31C2
WRA0:C806 CD 3B 0E         call 0E3B
WRA0:C809 CD 49 0E         call 0E49
WRA0:C80C 11 00 40         ld   de,4000
WRA0:C80F 21 00 96         ld   hl,9600
WRA0:C812 01 19 3E         ld   bc,3E19
WRA0:C815 CD B3 0D         call 0DB3
WRA0:C818 F0 9D            ld   a,(ff00+9D)
WRA0:C81A F5               push af
WRA0:C81B 21 00 D0         ld   hl,D000
WRA0:C81E CD 5C C8         call C85C
WRA0:C821 E5               push hl
WRA0:C822 11 F8 FF         ld   de,FFF8
WRA0:C825 19               add  hl,de
WRA0:C826 E5               push hl
WRA0:C827 D1               pop  de
WRA0:C828 21 A9 C4         ld   hl,C4A9
WRA0:C82B F0 9D            ld   a,(ff00+9D)
WRA0:C82D CD 9D 2F         call 2F9D
WRA0:C830 CD AB C8         call C8AB
WRA0:C833 01 0C 00         ld   bc,000C
WRA0:C836 36 7C            ld   (hl),7C
WRA0:C838 23               inc  hl
WRA0:C839 7A               ld   a,d
WRA0:C83A CD AB C8         call C8AB
WRA0:C83D 7B               ld   a,e
WRA0:C83E CD AB C8         call C8AB
WRA0:C841 36 7F            ld   (hl),7F
WRA0:C843 23               inc  hl
WRA0:C844 1A               ld   a,(de)
WRA0:C845 CD AB C8         call C8AB
WRA0:C848 13               inc  de
WRA0:C849 36 7C            ld   (hl),7C
WRA0:C84B 09               add  hl,bc
WRA0:C84C 7C               ld   a,h
WRA0:C84D FE C6            cp   a,C6
WRA0:C84F 20 E5            jr   nz,C836
WRA0:C851 CD AD 2F         call 2FAD
WRA0:C854 3E ED            ld   a,ED
WRA0:C856 EA 4B C5         ld   (C54B),a
WRA0:C859 E1               pop  hl
WRA0:C85A 18 C2            jr   C81E
WRA0:C85C CD 1B 35         call 351B
WRA0:C85F F0 A9            ld   a,(ff00+A9)
WRA0:C861 5F               ld   e,a
WRA0:C862 01 01 00         ld   bc,0001
WRA0:C865 07               rlca 
WRA0:C866 38 1E            jr   c,C886
WRA0:C868 0B               dec  bc
WRA0:C869 0B               dec  bc
WRA0:C86A 07               rlca 
WRA0:C86B 38 19            jr   c,C886
WRA0:C86D 0E F0            ld   c,F0
WRA0:C86F 07               rlca 
WRA0:C870 38 14            jr   c,C886
WRA0:C872 01 10 00         ld   bc,0010
WRA0:C875 07               rlca 
WRA0:C876 38 0E            jr   c,C886
WRA0:C878 48               ld   c,b
WRA0:C879 07               rlca 
WRA0:C87A 30 0A            jr   nc,C886
WRA0:C87C E1               pop  hl
WRA0:C87D F1               pop  af
WRA0:C87E D7               rst  10
WRA0:C87F 3E F9            ld   a,F9
WRA0:C881 E0 70            ld   (ff00+70),a
WRA0:C883 C3 ED 21         jp   21ED
WRA0:C886 7B               ld   a,e
WRA0:C887 0F               rrca 
WRA0:C888 30 10            jr   nc,C89A
WRA0:C88A 0F               rrca 
WRA0:C88B 0F               rrca 
WRA0:C88C 30 01            jr   nc,C88F
WRA0:C88E E9               jp   hl
WRA0:C88F F0 9D            ld   a,(ff00+9D)
WRA0:C891 CD 9D 2F         call 2F9D
WRA0:C894 79               ld   a,c
WRA0:C895 86               add  (hl)
WRA0:C896 77               ld   (hl),a
WRA0:C897 C3 AD 2F         jp   2FAD
WRA0:C89A 0F               rrca 
WRA0:C89B 38 05            jr   c,C8A2
WRA0:C89D 0F               rrca 
WRA0:C89E 38 06            jr   c,C8A6
WRA0:C8A0 09               add  hl,bc
WRA0:C8A1 C9               ret  
WRA0:C8A2 79               ld   a,c
WRA0:C8A3 84               add  h
WRA0:C8A4 67               ld   h,a
WRA0:C8A5 C9               ret  
WRA0:C8A6 F0 9D            ld   a,(ff00+9D)
WRA0:C8A8 81               add  c
WRA0:C8A9 D7               rst  10
WRA0:C8AA C9               ret  
WRA0:C8AB F5               push af
WRA0:C8AC CB 37            swap a
WRA0:C8AE CD B2 C8         call C8B2
WRA0:C8B1 F1               pop  af
WRA0:C8B2 E6 0F            and  a,0F
WRA0:C8B4 C6 F6            add  a,F6
WRA0:C8B6 F6 60            or   a,60
WRA0:C8B8 22               ldi  (hl),a
WRA0:C8B9 C9               ret  
バイナリ
CD C5 32 CD C2 31 CD 3B 0E CD 49 0E 11 00 40 21
00 96 01 19 3E CD B3 0D F0 9D F5 21 00 D0 CD 5C
C8 E5 11 F8 FF 19 E5 D1 21 A9 C4 F0 9D CD 9D 2F
CD AB C8 01 0C 00 36 7C 23 7A CD AB C8 7B CD AB
C8 36 7F 23 1A CD AB C8 13 36 7C 09 7C FE C6 20
E5 CD AD 2F 3E ED EA 4B C5 E1 18 C2 CD 1B 35 F0
A9 5F 01 01 00 07 38 1E 0B 0B 07 38 19 0E F0 07
38 14 01 10 00 07 38 0E 48 07 30 0A E1 F1 D7 3E
F9 E0 70 C3 ED 21 7B 0F 30 10 0F 0F 30 01 E9 F0
9D CD 9D 2F 79 86 77 C3 AD 2F 0F 38 05 0F 38 06
09 C9 79 84 67 C9 F0 9D 81 D7 C9 F5 CB 37 CD B2
C8 F1 E6 0F C6 F6 F6 60 22 C9

たいせつなものポケットのわざマシン17

説明

ROMバンク03のアドレス55D7を実行することによりアドレスD0C6の中身に対応するどうぐをたいせつなポケットに入手することができます。

わざマシンポケット以外でわざマシン17を使用することによりアドレスFA47を実行します。アドレスFA47以降のプログラムはSRAMバンク03のアドレスAFDE以降の中身をアドレスC800以降にコピーをしてアドレスC800を実行するプログラムとなっています。

WRA1:D300 3E D0            ld   a,D0
WRA1:D302 EA C6 D0         ld   (D0C6),a
WRA1:D305 3E 03            ld   a,03
WRA1:D307 21 D7 55         ld   hl,55D7
WRA1:D30A CF               rst  08
WRA1:D30B C9               ret  

ECH1:FA47 3E 03            ld   a,03
ECH1:FA49 01 BA 00         ld   bc,00BA
ECH1:FA4C 11 00 C8         ld   de,C800
ECH1:FA4F 21 DE AF         ld   hl,AFDE
ECH1:FA52 D5               push de
ECH1:FA53 C3 8C 68         jp   688C
バイナリ
D300:
3E D0 EA C6 D0 3E 03 21 D7 55 CF C9

FA47:
3E 03 01 BA 00 11 00 C8 21 DE AF D5 C3 8C 68

参考文献

日本語

英語