The English version is here:
📄RAM Writer in Pokémon Red/Green/Blue (JP)
バイナリエディタは、初代ポケモンにおける任意コード実行の究極の到達点とも言えるツールです。このエディタを使用すると、ゲーム内のあらゆるメモリの読み書きが可能になります。さらに、プログラムを記述し、実行させることもできます。これにより、テトリスやオセロなどのゲームを遊ぶことも可能になる、非常に強力なツールです。
本記事は以下の動画の解説となります。
バイナリエディタ導入手順
環境
ポケットモンスター 赤・緑・青の日本語版のみに対応しています。ポケットモンスター ピカチュウや日本語版以外のバージョンには対応していません。またポケモンスタジアムのGBビルや一部のエミュレータでは動作しません。ポケットモンスター ピカチュウにおけるバイナリエディタ導入については以下の記事をご覧ください。
バージョンの違い
ポケットモンスター 赤・緑はそれぞれにv1.0とv1.1が存在します。カートリッジの表面のパッケージシール右下に刻まれている刻印によってどのバージョンであるかを判定することができます。
- 刻印が数字のみであればv1.0。
- 刻印が数字+Aであればv1.1。
なお3DSのVCはv1.1となります。
以下の手順3における23番目のどうぐの種類によってバージョンを判定することもできます。
- 23番目のどうぐが「ぼチへぴゾの4ぽレ」であればv1.0。
- 23番目のどうぐが「ぼヂへぴゾの4ぽレ」でなければv1.1。
なおポケットモンスター 青には1つのバージョンしかありません。
手順1: さいしょからはじめる
主人公の名前はなんでも良いですが、ライバルの名前は「レレレオ」にしてください。パソコンからキズぐすりを取り出すか、1ばんどうろのNPCからキズぐすりを入手し、おとどけものを入手するまで通常通りゲームを進めます。
手順2: タマムシデパートへ向かう
- 1ばんどうろの一番下の草むらに向かいます。セーブをすることをおすすめします。
- どうぐの2番目でセレクトボタンを押し、野生のポケモンとエンカウントします。
- ポケモン画面で1番目のポケモンを選びます。存在しない2番目のポケモンと1番目のポケモンが自動的に入れ替わります。
- たたかうを選んでから逃げます。たたかうを選ばずに逃げると4歩歩くたびにめのまえがまっくらになり詰んでしまいます。
- マサラタウンに入ってから48、49歩歩き、ライバルの家に入ります。
- 16ばんどうろに移動します。4歩右に進んで民家の右上の角の真上に行きます。その地点からゲートに入るために1歩下に進みます。
- ゲートの右側から出ます。ゲートから出た後は右に3歩、下に2歩、右に6歩進んでから下に進みいあいぎりの木の左のマスを通過し、タマムシシティへ向かいます。
- タマムシシティに入ったら壁に沿って進み、タマムシデパートへ向かい左のドアから入ります。
手順3: どうぐ欄の操作
タマムシデパートの2階に行き、以下の順番でアイテムを購入します。
- いいキズぐすり×1
- スーパーボール×1
- ねむけざまし×1
- こおりなおし×1
- やけどなおし×1
- まひなおし×1
- どくけし×8
購入を終えたら6~9歩歩いて再度店員に話しかけます。
- うりにきたを選んでどうぐ欄にねむけざまし×255があることを確認します。
- おとどけものをどくけし×8と入れ替えます。
- ねむけざましとおとどけもの以外の全てのどうぐを売ります。どうぐの1番目がねむけざまし×1、2番目以降がねむけざまし×255となります。
- ライバル戦に勝利した場合は2番目のねむけざましを251個売っておかねを26725円にします。負けた場合は253個売っておかねを26750円にします。
買い物を終えてメニューからどうぐ欄を開きます。
- 1番目と2番目のねむけざましを4回入れ替えます。
- どうぐの所持数が255になるので、1番目のねむけざましと22番目のなかよしバッヂを入れ替えます。
- 25番目のピーピーエイド×0と26番目のどうぐを入れ替えます。
- 24番目のどうぐと76番目のどうぐと入れ替えます。
- 70~78番目のどうぐについては以下のようになっているのでこれを目印にして24番目のどうぐと76番目のどうぐと入れ替えると良いです。🔍70番目のどうぐ:まひなおし×3
71番目のどうぐ:マスターボール×12
72番目のどうぐ:モンスターボール×122
73番目のどうぐ:マスターボール×16
74番目のどうぐ:マスターボール×124
75番目のどうぐ:マスターボール×1
76番目のどうぐ
77番目のどうぐ:?????
78番目のどうぐ:マスターボール
- 70~78番目のどうぐについては以下のようになっているのでこれを目印にして24番目のどうぐと76番目のどうぐと入れ替えると良いです。
エレベーターに入ることでタマムシマンション屋上部屋に移動します。タマムシマンション屋上部屋に着いたらどうぐ欄を開きます。
- 74番目のハイパーボールを59個捨てて残りを72個にします。
タマムシマンション屋上部屋の入り口でセーブとリセットをすることをおすすめします。またこれ以降は簡易版バイナリエディタを導入するまでセーブしないことをおすすめます。
手順4: 簡易版バイナリエディタ導入
イーブイを入手し、以下の順番でニックネームをつけます。好きなだけイーブイを入手することができる状態になっています。もしイーブイのモンスターボールが消えてしまう場合はリセットして4歩以上歩いてからイーブイを入手するようにしてください。
- ーゆてぽん
- ニックネームなし
- ニックネームなし
- ニックネームなし
- ニックネームなし
- よメボデの
- よザれんん
- ぼダメギて
- へみんち
- だいなひだ
- れじよダリ
- めしんざダ
- ダれチんダ
- ダめいんど
- ううゾダグ
- へにんへ
- へにんボぷ
- ぱへにんぴ
- キづごヅー
- てソんダム
- ダだギムツ
- ぼヂてソん
- ゅョダだグ
- づよ◯づな
- 赤緑v1.0: づよそづな
- 赤緑v1.1(VC): づよむづな
- 青: づよワづな
- よヂづよく
- がんぜルョ
イーブイにニックネームをつけ終わったら下に向かい右側の出口から出ることでそだてやさんに移動します。
手持ちの2番目にいるニックネーム「ーゆてぽん」のイーブイを預けます。
なかよしバッヂを使うと簡易版バイナリエディタが起動します。
簡易版バイナリエディタ
これ以降、なかよしバッヂを使うたびに簡易版バイナリエディタを起動することができます。
左側のD5E3が書き換えようとしているメモリのアドレスで、右の00がその中身です。
B: アドレス-01
A: アドレス+01
↑: 中身-01
↓: 中身+01
←: 中身-10
→: 中身+10
START: 終了
SELECT: D62Cからのコードを実行(プログラム入力するまで押さないように注意)
手順5: バイナリエディタ導入
簡易版バイナリエディタを使用してバイナリエディタのプログラムを入力していきます。入力を終えたらセレクトボタンを押すことでバイナリエディタを起動することができます。バイナリエディタを起動する前に一旦スタートボタンを押して簡易版バイナリエディタを終了させてセーブすることをおすすめします。
アドレス | 中身 |
---|---|
D5E9 | CD |
D5EA | 赤緑v1.0: 79 赤緑v1.1(VC): 67 青: 8F |
D5EB | 38 |
D5EC | F0 |
D5ED | B3 |
D5EE | 01 |
D5EF | 01 |
D5F0 | 00 |
D5F1 | 07 |
D5F2 | 38 |
D5F3 | 18 |
D5F4 | 0B |
D5F5 | 0B |
D5F6 | 07 |
D5F7 | 38 |
D5F8 | 13 |
D5F9 | 0E |
D5FA | F0 |
D5FB | 07 |
D5FC | 38 |
D5FD | 0E |
D5FE | 01 |
D5FF | 10 |
D600 | 00 |
D601 | 07 |
D602 | 38 |
D603 | 08 |
D604 | 07 |
D605 | 38 |
D606 | 03 |
D607 | 07 |
D608 | D0 |
D609 | E9 |
D60A | E1 |
D60B | C9 |
D60C | 79 |
D60D | CB |
D60E | 43 |
D60F | 20 |
D610 | 06 |
D611 | CB |
D612 | 4B |
D613 | 20 |
D614 | 05 |
D615 | 09 |
D616 | C9 |
D617 | 86 |
D618 | 77 |
D619 | C9 |
D61A | 84 |
D61B | 67 |
D61C | C9 |
D61D | F5 |
D61E | CB |
D61F | 37 |
D620 | CD |
D621 | 24 |
D622 | D6 |
D623 | F1 |
D624 | E6 |
D625 | 0F |
D626 | C6 |
D627 | F6 |
D628 | F6 |
D629 | 60 |
D62A | 22 |
D62B | C9 |
D62C | 21 |
D62D | 00 |
D62E | D0 |
D62F | CD |
D630 | E9 |
D631 | D5 |
D632 | E5 |
D633 | 11 |
D634 | F8 |
D635 | FF |
D636 | 19 |
D637 | E5 |
D638 | D1 |
D639 | 21 |
D63A | AB |
D63B | C3 |
D63C | 01 |
D63D | 0C |
D63E | 00 |
D63F | 36 |
D640 | 7C |
D641 | 23 |
D642 | 7A |
D643 | CD |
D644 | 1D |
D645 | D6 |
D646 | 7B |
D647 | CD |
D648 | 1D |
D649 | D6 |
D64A | 36 |
D64B | 7F |
D64C | 23 |
D64D | 1A |
D64E | CD |
D64F | 1D |
D650 | D6 |
D651 | 13 |
D652 | 36 |
D653 | 7C |
D654 | 09 |
D655 | 7C |
D656 | FE |
D657 | C5 |
D658 | 20 |
D659 | E5 |
D65A | 3E |
D65B | ED |
D65C | EA |
D65D | 4B |
D65E | C4 |
D65F | E1 |
D660 | 18 |
D661 | CD |
バイナリエディタ
これ以降、簡易版バイナリエディタを起動してからセレクトボタンを押すたびに、バイナリエディタを起動することができます。
↑: アドレス-01
↓: アドレス+01
←: アドレス-10
→: アドレス+10
B+↑: アドレス-100
B+↓: アドレス+100
B+←: アドレス-1000
B+→: アドレス+1000
A+↑: 中身-01
A+↓: 中身+01
A+←: 中身-10
A+→: 中身+10
START: 終了
SELECT: 現在のアドレスからのコードを実行(注意して使用してください)
バイナリエディタを使って以下のように書き換えを行うと、なかよしバッヂを使うたびに、バイナリエディタを直接起動することができるようになります。
アドレス | 中身 |
---|---|
D984 | 00 |
D985 | 00 |
D986 | 00 |
D987 | C3 |
D988 | 2C |
D989 | D6 |
注意: 既存のセーブデータにおける導入
上記の手順はさいしょからはじめるを念頭に置いていますが、既存のセーブデータでも簡易版バイナリエディタを使ってバイナリエディタを導入することができます。サファリゾーンに入ったことがある場合は、サファリゾーンに入ってからあなぬけのヒモを使います。そだてやさんに「ーゆてょん」のポケモンを預け、ボックスに預けたポケモンのニックネームを以下のものにしてからなかよしバッヂを使用することで簡易版バイナリエディタを起動することができます。
- がんぜルョ
- よヂづよく
- づよ◯づな
- 赤緑v1.0: づよそづな
- 赤緑v1.1(VC): づよむづな
- 青: づよワづな
- ゅョダだグ
- ぼヂてソん
- ダだギムツ
- てソんダム
- キづごヅー
- ぱへにんぴ
- へにんボぷ
- へにんへ
- ううゾダグ
- ダめいんど
- ダれチんダ
- めしんざダ
- れじよダリ
- だいなひだ
- へみんちレ
- ぼダメギて
- よザれんん
- よメボデの
- だア
既存のセーブデータでなかよしバッヂを入手する方法
- タマムシシティ到達前の場合は、手持ちのポケモンを2~5匹にして、どうぐ欄の(手持ちのポケモンの数+1)番目でセレクトボタンを押し、野生のポケモンとエンカウントして、ポケモン画面で(手持ちのポケモンの数)番目のポケモンを選んで、内部番号FFのポケモンを入手し、内部番号FFのポケモンより後ろにニックネーム「アアアゾッ」のポケモンを配置します。
- どうぐ欄の13番目でセレクトボタンを押し、野生のポケモンとエンカウントして、ポケモン画面でニックネーム「アアアゾッ」のポケモンを選んで、どうぐの所持数を増やします。
- フレンドリィショップに行き、どうぐ欄の1番目にあるねむけざましを売ることでおかねの1000の位を6に、100の位を7にします。
- 22番目のなかよしバッヂと3~20番目にある不要なアイテムと入れ替えます。不要なアイテムは内部番号の16進数にA~Fが現れないもので9個以下にするとおこづかいの表示が正常なものとなります。例えばキズぐすり×1にすると良いでしょう。
- 再びどうぐ欄の13番目でセレクトボタンを押し、野生のポケモンとエンカウントして、ポケモン画面でニックネームが「アアアゾッ」だったポケモンを選んで、どうぐ欄を元に戻します。
- 内部番号FFのポケモンを入手した場合は、どうぐ欄の(手持ちのポケモンの数+1)番目でセレクトボタンを押し、野生のポケモンとエンカウントして、内部番号FFのポケモンを選んで、ポケモンの状態を元に戻します。
手順6: 通常の状態に戻す
既存のセーブデータでバイナリエディタを導入した場合はこの手順は不要です。さいしょからはじめた場合はバイナリエディタの導入で様々な副作用が発生しています。
- ポケモンずかん
- 手持ちのどうぐ欄
- おこづかい
- 現在地
- ボックス
- ライバルの名前
- 手持ちのポケモン
- イーブイ取得のフラグ
ポケモンずかん
アドレスD28BとD29Eの中身を00にすることでポケモンずかんからイーブイに関する情報を削除することができます。これを行うことでオーキドはかせにおとどけものを渡すことができるようになります。
手持ちのどうぐ欄
手持ちのどうぐ欄の情報はアドレスD2A1以降で管理されています。アドレスD2A1以降の中身を 03 67 00 14 01 46 01 FF
にすることで、どうぐの所持数を正常にしどうぐの1番目をなかよしバッヂ、2番目をキズぐすり、3番目をおとどけものにすることができます。
おこづかい
おこづかいの金額はアドレスD2CBからD2CDで管理されています。アドレスD2CBからD2CDの中身を 00 30 00
にすることで現在のおこづかいを3000円にすることができます。
現在地
出入口が1個しかない建物の中に入りアドレスD330、D331、D334、D335の中身を00にしてから外に出るとマサラタウンに移動することができます。
ボックス
アドレスD9B2の中身を00に、アドレスD9B3の中身をFFにすることでボックスに預けているポケモンを0匹にすることができます。
ライバルの名前
バイナリエディタを使ってアドレスD000~D00Dの中身を以下のように書き換えてください。
アドレス | 赤v1.0 | 緑v1.0 | 赤v1.1(VC) | 緑v1.1(VC) | 青 |
---|---|---|---|---|---|
D000 | 3E | 3E | 3E | 3E | 3E |
D001 | 01 | 01 | 01 | 01 | 01 |
D002 | 21 | 21 | 21 | 21 | 21 |
D003 | 2D | 2E | D2 | D3 | 40 |
D004 | 69 | 69 | 68 | 68 | 6A |
D005 | CD | CD | CD | CD | CD |
D006 | 20 | 20 | 0E | 0E | 36 |
D007 | 36 | 36 | 36 | 36 | 36 |
D008 | CD | CD | CD | CD | CD |
D009 | 86 | 86 | 74 | 74 | CF |
D00A | 1B | 1B | 1B | 1B | 30 |
D00B | C3 | C3 | C3 | C3 | C3 |
D00C | EE | EE | DC | DC | 02 |
D00D | 3D | 3D | 3D | 3D | 3E |
書き変えたらカーソルをアドレスD000に合わせてセレクトボタンを押すことでライバルの名前を決めることができます。
残りの副作用
残りの副作用についてもプログラムを実行することで元に戻します。バイナリエディタを使ってアドレスD010~D021の中身を以下のように書き換えてください。
アドレス | 中身 |
---|---|
D010 | 21 |
D011 | 2D |
D012 | D5 |
D013 | CB |
D014 | AE |
D015 | AF |
D016 | EA |
D017 | 23 |
D018 | D1 |
D019 | FA |
D01A | 96 |
D01B | D6 |
D01C | 47 |
D01D | 0E |
D01E | 05 |
D01F | C3 |
D020 | 赤緑v1.0: 78 赤緑v1.1(VC): 66 青: 8C |
D021 | 3E |
書き換えたらカーソルをアドレスD010に合わせてセレクトボタンを押すことで最初のポケモンを再度入手することができます。他にもこのプログラムは以下の効果があります。
- 手持ちのポケモンを再度入手したポケモンのみにする。
- イーブイを再度入手できるようにする。
ただし最初にもらったポケモンは手順2で消えたポケモンと同一の個体ではないことに注意してください。これ以降はストーリーを通常通り進めることができます。
使用上の注意
バイナリエディタの導入後はサファリゾーンでボールを投げたり、そだてやを利用しないようにしてください。サファリゾーンでボールを投げてしまった場合は、もう一度サファリゾーンに入りなおしてボールを投げずにすぐに出てください。そだてやを利用してしまった場合は、ニックネーム「アアてじよ」のポケモンを預けてすぐに引き取ってください。またアドレスD5E9~D661とD983~D989はバイナリエディタで編集しないようにしてください。
技術的補足
どうぐの2番目でのセレクト
手順2で2番目のポケモンを1番目のポケモンと入れ替えると、手持ちのポケモンの最後を示す終端コードFFが消えてしまい、7番目以降のポケモンを実際のポケモンだと勘違いします。それによってポケモンではないデータに対してポケモンとしての処理が行われてます。具体的には4歩歩くたびに毒状態のポケモンのHPを1減らすという処理が行われます。
どこかしらドア
どこかしらドアとはライバルの家のドアの移動先が変更されるバグです。
どこかしらドアでは199番目のポケモンが毒状態であることが関係しています。199番目のポケモンに対応するアドレスは以下のようになっています。
番号 | 種族 | 現在HP上位 | 現在HP下位 | 状態異常 |
---|---|---|---|---|
199 | D1EA | F334 | F335 | F337 |
199番目のポケモンが毒状態と判定されるためにはアドレスD125からD1EAまでの中身にFFが存在しないことが必要です。最初にもらうポケモンのおやID、経験値、努力値、個体値にFFがあると移動先が変更されません。経験値と努力値についてはライバル戦以外で経験値を入れなければ回避できますが、おやIDと個体値については運が悪いとFFが入ることがあります。
状態異常のアドレスの3ビット目が立っていればポケモンは毒状態だと判定されます。マサラタウンに入るとアドレスF337の中身が0Cとなり3ビット目が立ちます。この中身はオーキドけんきゅうじょのドアのX座標に対応しています。
アドレスF335はライバルの家の移動先を格納しています。アドレスF335の中身は最初は27が格納されますが、毒の判定が行なわれる度に1ずつ減っていきます。手順2で48、49歩歩く(厳密には12回毒判定を行う)ことで、アドレスF335の中身が1Bとなり、それに対応する16ばんどうろに移動することができます。
アドレスE000~FDFFはEcho RAM領域でありC000~DDFFのミラーとなっています。ポケモンスタジアムのGBビルではE000~FDFFはミラーになっていないため動作しないです。また、ミラーが適切でないエミュレータでも動作しません。
いあいぎりの木の左のマスを通ることができる理由
いあいぎりの木の左のマスを通ることができる理由は132番目のポケモンが毒状態であることが関係しています。132番目のポケモンに対応するアドレスは以下のようになっています。
番号 | 種族 | 現在HP上位 | 現在HP下位 | 状態異常 |
---|---|---|---|---|
132 | D1A7 | E7B0 | E7B1 | E7B3 |
アドレスE6E8からEBFBまでは背景タイルを格納しています。2×2マスの4マスを1ブロックとしてブロックごとに以下のIDが割り当てられています。
アドレスE7B1とE7B3に対応するブロックは以下の画像の場所となります。アドレスE7B3に対応するブロックのIDが0Fで3ビット目が立っているので132番目のポケモンが毒状態だと判定されます。そのためアドレスE7B1の中身は毒の判定が行なわれる度に1ずつ減っていきブロックが変化します。ゲートの右側から最短ルートでいあいぎりの木の左のマスを通り抜けようとする際に、アドレスE7B1の中身が6Fから6Dへと変化するためにいあいぎりの木の左のマスを通ることができます。
Dry Underflow
Dry Underflowはどうぐの所持数が0の状態でさらに所持数を減少させることで、アンダーフロー(より正確には負のオーバーフロー)を起こし、どうぐの所持数を255の状態にするバグです。元々はどうぐの所持数が0の状態でヤマブキシティの警備員に飲み物を渡すという手法だったのが、手順3のようなどうぐの入れ替え操作によってできるようになったため、Dryという名前がついているそうです。
Dry Underflowを実行するためには255個のどうぐを入手する必要があります。255個のどうぐを入手するために196番目のポケモンがどく状態であることを利用します。196番目のポケモンに対応するアドレスは以下のようになっています。
番号 | 種族 | 現在HP上位 | 現在HP下位 | 状態異常 |
---|---|---|---|---|
196 | D1E7 | F2B0 | F2B1 | F2B3 |
アドレスF2B3は9番目のどうぐの個数を格納しています。手順3の買いものではどうぐの所持数が9になるようにしています。また毒状態と判定されるためには3ビット目が立っていることなので、9番目のどうぐの個数を8個となるようにしています。
アドレスF2B0とF2B1はそれぞれ8番目のどうぐの種類と個数を格納しています。手順3の通りに買いものを行うと、8番目のどうぐはまひなおし×1となるので、中身は 0F 01
となります。6~9歩歩いて毒の判定が2回行われると、中身が 0E FF
となるので、8番目のどうぐがねむけざまし×255となります。
どうぐ欄からどうぐを削除する際、残りの個数が0個になる場合は、0個になったどうぐを削除し、後続のどうぐを全て繰り上げるという処理が行われます。通常はどうぐの最後を示す終端コードFFまでを繰り上げるという処理となっています。ねむけざまし×255がある場合には、16進数のFFは10進数で255に相当するため、このFFがどうぐの最後であると処理されてしまい、見かけ上ねむけざまし×255が増殖するように見えます。
手順3で1番目と2番目のねむけざましを4回入れ替えることでどうぐの所持数を255の状態にしています。入れ替える前はどうぐの所持数が3であるため、4回入れ替えることでアンダーフロー(負のオーバーフロー)を起こしています。
どうぐの所持数が0のとき、通常はカーソルを2番目以降に移動することはできないのですが、上記の入れ替え操作を行う際にはカーソルを2番目に移動することができます。これにはメニュー内の項目の最大数を表す内部変数が関係しています。どうぐ欄を開いている場合はこの変数に2が格納されていて画面上の3番目のアイテムまで移動させることができます。どうぐの所持数が1または0の場合は、やめるよりも下に移動できないようにするため、この変数には1または0が格納されています。
2つのどうぐをまとめてどうぐの所持数を減らす入れ替え処理を行う際、どうぐの所持数が1になったかどうかを確認して、どうぐの所持数が1になった場合はメニュー内の項目の最大数を表す内部変数を1に変更します。通常はどうぐの所持数を0にすることはできないので、どうぐの所持数が0になったかどうかを確認しないため、どうぐの所持数が0になった場合はこの内部変数を変更しません。そのため、カーソルを2番目にすることができます。
イーブイのモンスターボールが消えない理由
イーブイのモンスターボールが消えない理由は25番目のポケモンが毒状態であることが原因です。25番目のポケモンに対応するアドレスは以下のようになっています。
番号 | 種族 | 現在HP上位 | 現在HP下位 | 状態異常 |
---|---|---|---|---|
25 | D13C | D54C | D54D | D54F |
アドレスD54D以降は消えるオブジェクトを格納しています。1つの項目につきオブジェクトの番号と消えるオブジェクトのフラグの番号の2バイトで構成されており、終端はFFで表されています。タマムシマンション屋上部屋に入るとアドレスD54D以降は 02 45 FF
となっています。アドレスD54Fが FF
となっているため、4歩歩くとD54D以降は 01 45 FF
となり、イーブイを取得すると別のオブジェクトが消えるようになります。なおアドレスD54Eが変化しないため、イーブイを取得したというフラグは立つのでイーブイを取得した後タマムシマンション屋上部屋に戻るとイーブイのモンスターボールは消えてしまいます。
どうぐの入れ替え操作
タマムシデパートでの操作
どうぐの所持数を255にした後は以下の操作を行っています。
- 1番目のねむけざましと22番目のなかよしバッヂを入れ替える。
- 25番目のピーピーエイド×80と26番目のどうぐを入れ替える。
- 24番目のどうぐと76番目のどうぐと入れ替える。
22、24、25、26、76番目のどうぐに対応するアドレスは以下のようになっています。
番号 | 種類 | 個数 |
---|---|---|
22 | D2CC | D2CD |
24 | D2D0 | D2D1 |
25 | D2D2 | D2D3 |
26 | D2D4 | D2D5 |
76 | D338 | D339 |
1つ目の操作では、なかよしバッヂを1番目にすることを目的としています。なかよしバッヂを1番目にすることで使いやすくなります。22番目がなかよしバッヂとなっている理由はアドレスD2CCになかよしバッヂの内部番号である67が格納されているからであり、おこづかいの1000の位と100の位の2桁に対応しています。手順3でおかねを26725円または26750円に調整しているのはこのためです。
2つ目の操作では、文字送り速度の最大化を目的としています。アドレスD2D4はオプションに関する情報が格納されており、0~3ビットが文字を表示させた後に遅延させるフレーム数に対応しています。はなしのはやさがはやいは1フレームに対応しており、アドレスD2D4の0~3ビットには1が格納されています。25番目と26番目のどうぐを入れ替えることでアドレスD2D4の0~3ビットを0にし文字を表示させた後に遅延させるフレーム数を最も短くしています。アドレスD2D2はライバルの名前の5文字目が格納されており、手順の通りに4文字の名前をつけると名前の終端を示す50が格納されます。
3つ目の操作では、エレベーターの移動先をタマムシマンション屋上部屋にすることを目的としています。アドレスD339はエレベーターの移動先のマップの内部番号、アドレスD338は移動先の出入口の番号が格納されています。一方でアドレスD2D2、D2D3はそれぞれライバルの名前の3、4文字目が格納されています。このためライバルの名前を調整することで移動先を変更することができます。なおライバルの名前の1、2文字目はバイナリエディタ導入では利用していません。
タマムシマンション屋上部屋の内部番号は84であるため、タマムシマンション屋上部屋に移動するためにライバルの名前の4文字目を84に対応する「オ」にしています。タマムシマンション屋上部屋の出入口の番号は00と01が正常なものとなっています。それ以外の番号ではバグった空間に移動しますが、26と27に関しては偶然にもセキチクシティのフレンドリィショップの出入口の座標を参照して移動をすることができます。出入口の番号00、01、26、27のうちイーブイのモンスターボールに最も近い座標は27であり、座標を定める際に6、7ビット目を無視する処理が行われるため、ライバルの名前の3文字目をA7に対応する「レ」にしています。
タマムシマンション屋上部屋での操作
ハイパーボールを59個捨てるという操作は出入口をそだてやさんにするために行っています。59個捨てることでハイパーボールの個数が131個から72個へと変化し、16進数で83から48へと変化することで移動先がタマムシマンション屋上からそだてやさんへと変化しています。
どうぐの13番目でのセレクト
既存のセーブデータにおける導入で使う手法となります。どうぐの13番目でのセレクトでどうぐの所持数を増やすことができる理由は手持ちのポケモンの13番目のニックネームが関係しています。
番号 | ニックネーム3文字目 | ニックネーム4文字目 | ニックネーム5文字目 | ニックネーム終端 |
---|---|---|---|---|
13 | D2A1 | D2A2 | D2A3 | D2A4 |
アドレスD2A1はどうぐの所持数、それ以降のアドレスでどうぐの種類と個数を格納しています。ニックネーム「アアアゾッ」のポケモンでセレクトを行うことで、どうぐの所持数を128に、どうぐの1番目をねむけざまし×172に、どうぐの2番目をピーピーエイドにしています。
なかよしバッヂの効果
なかよしバッヂを使うとアドレスD983へジャンプします。アドレスD983はサファリボールの個数を格納しており、アドレスD984以降はそだてやに預けたポケモンのニックネームを格納しています。バイナリエディタ導入後はサファリゾーンでボールを投げたり、そだてやを利用しないようにすることで、これらのアドレスが変化するのを防ぎます。
簡易版バイナリエディタ(さいしょからはじめる)
説明
簡易版バイナリエディタはhlレジスタが指しているアドレスとその中身を出力するプログラムです。キーの入力でhlレジスタの指すアドレスとその中身を変化させるようにしています。
アドレスDE72の中身は赤緑v1.0ではBF、赤緑v1.1(VC)ではD1、青ではA9となります。
WRA1:D983 00 nop
WRA1:D984 01 E3 D5 ld bc,D5E3
WRA1:D987 C3 48 DE jp DE48
WRA1:DE64 26 DE ld h,DE
WRA1:DE66 2E A6 ld l,A6
WRA1:DE68 AF xor a
WRA1:DE69 50 ld d,b
WRA1:DE6A D6 10 sub a,10
WRA1:DE6C 32 ldd (hl),a
WRA1:DE6D D6 B8 sub a,B8
WRA1:DE6F 50 ld d,b
WRA1:DE70 32 ldd (hl),a
WRA1:DE71 D6 ?? sub a,??
WRA1:DE73 32 ldd (hl),a
WRA1:DE74 C5 push bc
WRA1:DE75 50 ld d,b
WRA1:DE76 E1 pop hl
WRA1:DE77 AF xor a
WRA1:DE78 0F rrca
WRA1:DE79 30 07 jr nc,DE82
WRA1:DE7B 50 ld d,b
WRA1:DE7C 3E 10 ld a,10
WRA1:DE7E C3 8E DE jp DE8E
WRA1:DE81 50 ld d,b
WRA1:DE82 0F rrca
WRA1:DE83 30 06 jr nc,DE8B
WRA1:DE85 9F sbc a
WRA1:DE86 91 sub c
WRA1:DE87 50 ld d,b
WRA1:DE88 C3 8E DE jp DE8E
WRA1:DE8B 0F rrca
WRA1:DE8C 9F sbc a
WRA1:DE8D 50 ld d,b
WRA1:DE8E 86 add (hl)
WRA1:DE8F 32 ldd (hl),a
WRA1:DE90 2A ldi a,(hl)
WRA1:DE91 11 E3 50 ld de,50E3
WRA1:DE94 44 ld b,h
WRA1:DE95 CD C6 DE call DEC6
WRA1:DE98 45 ld b,l
WRA1:DE99 50 ld d,b
WRA1:DE9A CD C6 DE call DEC6
WRA1:DE9D 1C inc e
WRA1:DE9E 46 ld b,(hl)
WRA1:DE9F 50 ld d,b
WRA1:DEA0 CD C6 DE call DEC6
WRA1:DEA3 CD 50 50 call 5050
WRA1:DEA6 B3 or e
WRA1:DEA7 B3 or e
WRA1:DEA8 0E 0F ld c,0F
WRA1:DEAA 07 rlca
WRA1:DEAB 50 ld d,b
WRA1:DEAC 0F rrca
WRA1:DEAD D2 B2 DE jp nc,DEB2
WRA1:DEB0 34 inc (hl)
WRA1:DEB1 50 ld d,b
WRA1:DEB2 0F rrca
WRA1:DEB3 DA 90 DE jp c,DE90
WRA1:DEB6 0F rrca
WRA1:DEB7 50 ld d,b
WRA1:DEB8 D2 BC DE jp nc,DEBC
WRA1:DEBB 2B dec hl
WRA1:DEBC 0F rrca
WRA1:DEBD 50 ld d,b
WRA1:DEBE DA 2C D6 jp c,D62C
WRA1:DEC1 0F rrca
WRA1:DEC2 D8 ret c
WRA1:DEC3 50 ld d,b
WRA1:DEC4 30 B2 jr nc,DE78
WRA1:DEC6 C5 push bc
WRA1:DEC7 CB 30 swap b
WRA1:DEC9 50 ld d,b
WRA1:DECA CD D0 DE call DED0
WRA1:DECD C1 pop bc
WRA1:DECE 50 ld d,b
WRA1:DECF 50 ld d,b
WRA1:DED0 3E 0F ld a,0F
WRA1:DED2 A0 and b
WRA1:DED3 06 C3 ld b,C3
WRA1:DED5 50 ld d,b
WRA1:DED6 D6 0A sub a,0A
WRA1:DED8 DA DE DE jp c,DEDE
WRA1:DEDB 50 ld d,b
WRA1:DEDC D6 A0 sub a,A0
WRA1:DEDE 1C inc e
WRA1:DEDF 12 ld (de),a
WRA1:DEE0 C9 ret
WRA1:DEE1 50 ld d,b
バイナリ
D983:
00 01 E3 D5 C3 48 DE
DE64:
26 DE 2E A6 AF 50
D6 10 32 D6 B8 50
32 D6 ?? 32 C5 50
E1 AF 0F 30 07 50
3E 10 C3 8E DE 50
0F 30 06 9F 91 50
C3 8E DE 0F 9F 50
86 32 2A 11 E3 50
44 CD C6 DE 45 50
CD C6 DE 1C 46 50
CD C6 DE CD 50 50
B3 B3 0E 0F 07 50
0F D2 B2 DE 34 50
0F DA 90 DE 0F 50
D2 BC DE 2B 0F 50
DA 2C D6 0F D8 50
30 B2 C5 CB 30 50
CD D0 DE C1 50 50
3E 0F A0 06 C3 50
D6 0A DA DE DE 50
D6 A0 1C 12 C9 50
簡易版バイナリエディタ(既存のセーブデータ)
説明
上記で述べた簡易版バイナリエディタのプログラムはアドレスDE48からDE63までの中身が00で埋まっている前提でプログラムを組んでいます。既存のセーブデータで実行する場合はjp命令でアドレスDEE2を実行してからjr命令でDE64を実行するようにしています。
WRA1:D983 00 nop
WRA1:D984 01 E3 D5 ld bc,D5E3
WRA1:D987 C3 E2 DE jp DEE2
WRA1:DE64 26 DE ld h,DE
WRA1:DE66 2E A6 ld l,A6
WRA1:DE68 AF xor a
WRA1:DE69 50 ld d,b
WRA1:DE6A D6 10 sub a,10
WRA1:DE6C 32 ldd (hl),a
WRA1:DE6D D6 B8 sub a,B8
WRA1:DE6F 50 ld d,b
WRA1:DE70 32 ldd (hl),a
WRA1:DE71 D6 ?? sub a,??
WRA1:DE73 32 ldd (hl),a
WRA1:DE74 C5 push bc
WRA1:DE75 50 ld d,b
WRA1:DE76 E1 pop hl
WRA1:DE77 AF xor a
WRA1:DE78 0F rrca
WRA1:DE79 30 07 jr nc,DE82
WRA1:DE7B 50 ld d,b
WRA1:DE7C 3E 10 ld a,10
WRA1:DE7E C3 8E DE jp DE8E
WRA1:DE81 50 ld d,b
WRA1:DE82 0F rrca
WRA1:DE83 30 06 jr nc,DE8B
WRA1:DE85 9F sbc a
WRA1:DE86 91 sub c
WRA1:DE87 50 ld d,b
WRA1:DE88 C3 8E DE jp DE8E
WRA1:DE8B 0F rrca
WRA1:DE8C 9F sbc a
WRA1:DE8D 50 ld d,b
WRA1:DE8E 86 add (hl)
WRA1:DE8F 32 ldd (hl),a
WRA1:DE90 2A ldi a,(hl)
WRA1:DE91 11 E3 50 ld de,50E3
WRA1:DE94 44 ld b,h
WRA1:DE95 CD C6 DE call DEC6
WRA1:DE98 45 ld b,l
WRA1:DE99 50 ld d,b
WRA1:DE9A CD C6 DE call DEC6
WRA1:DE9D 1C inc e
WRA1:DE9E 46 ld b,(hl)
WRA1:DE9F 50 ld d,b
WRA1:DEA0 CD C6 DE call DEC6
WRA1:DEA3 CD 50 50 call 5050
WRA1:DEA6 B3 or e
WRA1:DEA7 B3 or e
WRA1:DEA8 0E 0F ld c,0F
WRA1:DEAA 07 rlca
WRA1:DEAB 50 ld d,b
WRA1:DEAC 0F rrca
WRA1:DEAD D2 B2 DE jp nc,DEB2
WRA1:DEB0 34 inc (hl)
WRA1:DEB1 50 ld d,b
WRA1:DEB2 0F rrca
WRA1:DEB3 DA 90 DE jp c,DE90
WRA1:DEB6 0F rrca
WRA1:DEB7 50 ld d,b
WRA1:DEB8 D2 BC DE jp nc,DEBC
WRA1:DEBB 2B dec hl
WRA1:DEBC 0F rrca
WRA1:DEBD 50 ld d,b
WRA1:DEBE DA 2C D6 jp c,D62C
WRA1:DEC1 0F rrca
WRA1:DEC2 D8 ret c
WRA1:DEC3 50 ld d,b
WRA1:DEC4 30 B2 jr nc,DE78
WRA1:DEC6 C5 push bc
WRA1:DEC7 CB 30 swap b
WRA1:DEC9 50 ld d,b
WRA1:DECA CD D0 DE call DED0
WRA1:DECD C1 pop bc
WRA1:DECE A7 and a
WRA1:DECF 50 ld d,b
WRA1:DED0 3E 0F ld a,0F
WRA1:DED2 A0 and b
WRA1:DED3 06 C3 ld b,C3
WRA1:DED5 50 ld d,b
WRA1:DED6 D6 0A sub a,0A
WRA1:DED8 DA DE DE jp c,DEDE
WRA1:DEDB 50 ld d,b
WRA1:DEDC D6 A0 sub a,A0
WRA1:DEDE 1C inc e
WRA1:DEDF 12 ld (de),a
WRA1:DEE0 C9 ret
WRA1:DEE1 50 ld d,b
WRA1:DEE2 30 80 jr nc,DE64
バイナリ
D983:
00 01 E3 D5 C3 E2 DE
DE64:
26 DE 2E A6 AF 50
D6 10 32 D6 B8 50
32 D6 ?? 32 C5 50
E1 AF 0F 30 07 50
3E 10 C3 8E DE 50
0F 30 06 9F 91 50
C3 8E DE 0F 9F 50
86 32 2A 11 E3 50
44 CD C6 DE 45 50
CD C6 DE 1C 46 50
CD C6 DE CD 50 50
B3 B3 0E 0F 07 50
0F D2 B2 DE 34 50
0F DA 90 DE 0F 50
D2 BC DE 2B 0F 50
DA 2C D6 0F D8 50
30 B2 C5 CB 30 50
CD D0 DE C1 A7 50
3E 0F A0 06 C3 50
D6 0A DA DE DE 50
D6 A0 1C 12 C9 50
30 80 50
バイナリエディタ
説明
バイナリエディタはhlレジスタが指しているアドレスを含む18個のアドレスとその中身を出力するプログラムとなっています。アドレスD62Cを実行することでバイナリエディタを起動することができるようになっています。アドレスD5E9からD66Eまでの134バイトは未使用領域であり、この領域にバイナリエディタのプログラムを記述しています。
アドレスD5EAの中身は赤緑v1.0では79、赤緑v1.1(VC)では67、青では8Fとなります。
WRA1:D5E9 CD ?? 38 call 38??
WRA1:D5EC F0 B3 ld a,(ff00+B3)
WRA1:D5EE 01 01 00 ld bc,0001
WRA1:D5F1 07 rlca
WRA1:D5F2 38 18 jr c,D60C
WRA1:D5F4 0B dec bc
WRA1:D5F5 0B dec bc
WRA1:D5F6 07 rlca
WRA1:D5F7 38 13 jr c,D60C
WRA1:D5F9 0E F0 ld c,F0
WRA1:D5FB 07 rlca
WRA1:D5FC 38 0E jr c,D60C
WRA1:D5FE 01 10 00 ld bc,0010
WRA1:D601 07 rlca
WRA1:D602 38 08 jr c,D60C
WRA1:D604 07 rlca
WRA1:D605 38 03 jr c,D60A
WRA1:D607 07 rlca
WRA1:D608 D0 ret nc
WRA1:D609 E9 jp hl
WRA1:D60A E1 pop hl
WRA1:D60B C9 ret
WRA1:D60C 79 ld a,c
WRA1:D60D CB 43 bit 0,e
WRA1:D60F 20 06 jr nz,D617
WRA1:D611 CB 4B bit 1,e
WRA1:D613 20 05 jr nz,D61A
WRA1:D615 09 add hl,bc
WRA1:D616 C9 ret
WRA1:D617 86 add (hl)
WRA1:D618 77 ld (hl),a
WRA1:D619 C9 ret
WRA1:D61A 84 add h
WRA1:D61B 67 ld h,a
WRA1:D61C C9 ret
WRA1:D61D F5 push af
WRA1:D61E CB 37 swap a
WRA1:D620 CD 24 D6 call D624
WRA1:D623 F1 pop af
WRA1:D624 E6 0F and a,0F
WRA1:D626 C6 F6 add a,F6
WRA1:D628 F6 60 or a,60
WRA1:D62A 22 ldi (hl),a
WRA1:D62B C9 ret
WRA1:D62C 21 00 D0 ld hl,D000
WRA1:D62F CD E9 D5 call D5E9
WRA1:D632 E5 push hl
WRA1:D633 11 F8 FF ld de,FFF8
WRA1:D636 19 add hl,de
WRA1:D637 E5 push hl
WRA1:D638 D1 pop de
WRA1:D639 21 AB C3 ld hl,C3AB
WRA1:D63C 01 0C 00 ld bc,000C
WRA1:D63F 36 7C ld (hl),7C
WRA1:D641 23 inc hl
WRA1:D642 7A ld a,d
WRA1:D643 CD 1D D6 call D61D
WRA1:D646 7B ld a,e
WRA1:D647 CD 1D D6 call D61D
WRA1:D64A 36 7F ld (hl),7F
WRA1:D64C 23 inc hl
WRA1:D64D 1A ld a,(de)
WRA1:D64E CD 1D D6 call D61D
WRA1:D651 13 inc de
WRA1:D652 36 7C ld (hl),7C
WRA1:D654 09 add hl,bc
WRA1:D655 7C ld a,h
WRA1:D656 FE C5 cp a,C5
WRA1:D658 20 E5 jr nz,D63F
WRA1:D65A 3E ED ld a,ED
WRA1:D65C EA 4B C4 ld (C44B),a
WRA1:D65F E1 pop hl
WRA1:D660 18 CD jr D62F
WRA1:D983 00 nop
WRA1:D984 00 nop
WRA1:D985 00 nop
WRA1:D986 00 nop
WRA1:D987 C3 2C D6 jp D62C
バイナリ
CD ?? 38 F0 B3 01 01
00 07 38 18 0B 0B 07 38 13 0E F0 07 38 0E 01 10
00 07 38 08 07 38 03 07 D0 E9 E1 C9 79 CB 43 20
06 CB 4B 20 05 09 C9 86 77 C9 84 67 C9 F5 CB 37
CD 24 D6 F1 E6 0F C6 F6 F6 60 22 C9 21 00 D0 CD
E9 D5 E5 11 F8 FF 19 E5 D1 21 AB C3 01 0C 00 36
7C 23 7A CD 1D D6 7B CD 1D D6 36 7F 23 1A CD 1D
D6 13 36 7C 09 7C FE C5 20 E5 3E ED EA 4B C4 E1
18 CD
ライバルの名前変更のプログラム
説明
ライバルの名前を選択するプログラムを直接呼び出しています。ただし呼び出した後に姿がポケモンのアイコンになったりマップの表示が壊れたりするので、元に戻すための処理を入れています。
赤v1.0
WRA1:D000 3E 01 ld a,01
WRA1:D002 21 2D 69 ld hl,692D
WRA1:D005 CD 20 36 call 3620
WRA1:D008 CD 86 1B call 1B86
WRA1:D00B C3 EE 3D jp 3DEE
緑v1.0
WRA1:D000 3E 01 ld a,01
WRA1:D002 21 2E 69 ld hl,692E
WRA1:D005 CD 20 36 call 3620
WRA1:D008 CD 86 1B call 1B86
WRA1:D00B C3 EE 3D jp 3DEE
赤v1.1(VC)
WRA1:D000 3E 01 ld a,01
WRA1:D002 21 D2 68 ld hl,68D2
WRA1:D005 CD 0E 36 call 360E
WRA1:D008 CD 74 1B call 1B74
WRA1:D00B C3 DC 3D jp 3DDC
緑v1.1(VC)
WRA1:D000 3E 01 ld a,01
WRA1:D002 21 D3 68 ld hl,68D3
WRA1:D005 CD 0E 36 call 360E
WRA1:D008 CD 74 1B call 1B74
WRA1:D00B C3 DC 3D jp 3DDC
青
WRA1:D000 3E 01 ld a,01
WRA1:D002 21 40 6A ld hl,6A40
WRA1:D005 CD 36 36 call 3636
WRA1:D008 CD CF 30 call 30CF
WRA1:D00B C3 02 3E jp 3E02
バイナリ
赤v1.0
3E 01 21 2D 69 CD 20 36 CD 86 1B C3 EE 3D
緑v1.0
3E 01 21 2E 69 CD 20 36 CD 86 1B C3 EE 3D
赤v1.1(VC)
3E 01 21 D2 68 CD 0E 36 CD 74 1B C3 DC 3D
緑v1.1(VC)
3E 01 21 D3 68 CD 0E 36 CD 74 1B C3 DC 3D
青
3E 01 21 40 6A CD 36 36 CD CF 30 C3 02 3E
残りの情報に関するプログラム
説明
残りの情報に関しては以下のことを実現するプログラムを記述しています。
- アドレスD52Dの5ビット目を降ろしてイーブイ取得のフラグを折る。
- アドレスD123の中身を00にし、手持ちのポケモンを0匹にする。
- 最初のポケモンの内部番号が格納されているアドレスD696を利用してポケモンを入手する。
アドレスD013の中身は赤緑v1.0では78、赤緑v1.1(VC)では66、青では8Cとなります。
WRA1:D010 21 2D D5 ld hl,D52D
WRA1:D013 CB AE res 5,(hl)
WRA1:D015 AF xor a
WRA1:D016 EA 23 D1 ld (D123),a
WRA1:D019 FA 96 D6 ld a,(D696)
WRA1:D01C 47 ld b,a
WRA1:D01D 0E 05 ld c,05
WRA1:D01F C3 ?? 3E jp 3E??
バイナリ
21 2D D5 CB AE AF EA 23 D1 FA 96 D6 470E 05 C3
?? 3E