バイナリエディタ(第一世代)

メモリエディタ、RAMエディタとも。

RAMを自由自在に編集できるプログラム。任意コード実行の最高到達点の一つ。
これがあればもはや書き換え系のコードをいちいち作成する必要性がなくなり、任意コード実行用のプログラムの書き込みも非常に容易になる。
思わぬ範囲まで効果が及ぶ可能性があるので危険が伴います。実験・使用・使用後のセーブには充分注意しましょう。
特にsRAMバンク01h(A000h~BFFFh)は下手に弄ると簡単にフアイルのデータが壊れます。
(一応対策はされました)
 

このページで扱うバイナリエディタにはROMバンクやSRAMバンクの切り替え機能があります。

これらの機能が不要な場合、未使用領域を使ったバージョンが公開されているのでそちらを使うことをお勧めします。
未使用領域型バイナリエディタ
 

参考資料

ポケットモンスター 赤・緑・青 バイナリエディタ - flag3
上記の未使用領域型バイナリエディタの導入チャート及びその原理等の詳細な解説あり。
【初代ポケモン】お手軽20分。バイナリエディタ作成チャート解説【バグ技 任意コード実行】 - YouTube
ニューゲーム(要データクリア)からバイナリエディタを作成するまでのチャート紹介および実践動画。
このページで紹介する簡易型バイナリエディタは動画と操作方法が少し違うことに注意。
ポケットモンスター ピカチュウ バイナリエディタ - flag3
ピカチュウ版でニューゲームからバイナリエディタを作成するまでのチャート。(※レポートバグ使用)
このページで紹介するものとはコードの組み方が違う点に注意。
バイナリエディタ導入 森地図チャート ピカチュウ版 - flag3 ※削除予定
こちらはレポートバグ無し。トキワのもりでfifth法を利用する必要あり。
バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 - flag3 ※削除予定
既存データをそのまま流用できるバイナリエディタ導入チャート

導入

バージョンによってサブルーチンの位置が簿妙に違うため、コードを変える必要がある。

簡易型バイナリエディタ

引用:memory_editor.asm · GitHub

下記のコードをボックスの1番目から並べ、

  • サファリボール0個
    • 今回の実行では育て屋フラグを利用するため、この場所は何もしないようにするのが確実。
      • D983:00[nop]
    • 「あなぬけのヒモ」や「あなをほる」を使うと、サファリボールが0個になる。
      この仕様自体に使用する場所は関係ないので、適当なダンジョンで使用しておけば準備完了となる。
  • 育て屋に「わてん」を預けた状態にする
    • これはbcレジスタにDCE0hを代入しつつボックス22匹目のニックネームに飛ぶ命令となる。
      • D984:01 E0 DC[ld bc,DEC0]
      • D987:C3 E2 DE[jp DEE2]
    • わてEん」の場合はボックス1匹目のニックネームに直接飛ぶ。作り方は5かいバグのページを参考に。

の条件を満たしたうえでなかよしバッヂを使用する。3匹目のニックネームがバージョンによって異なるため注意。
なお、足りない部分を補完するため実行時にボックスのポケモンの名前が少し変わるようになっている。
2回目以降は気にせず実行しておk。

ピカチュウ版ではなかよしバッヂの代わりにかいがらバッヂを使用する。
その仕様上、預けるポケモンの数および種類にも指定がある。

  • コード用以外の余計なポケモンは預けない。(しっかり22匹で止める)
    • 24匹だと余計なジャンプで暴走し、26匹だと予期せぬ場所が書き換えられて困る。
      一応30匹にしてもいいが修正が面倒になる。
  • 1~17匹目にコラッタ(A5h)またはポッポ(24h)。
    • 必ずしもこの2種でなければならないわけではないが、1番道路で適当に乱獲すればいいので楽。
  • 18匹目にメノクラゲ(18h)「へみんちレ」。
    • これは適当に21番水道などで手に入れればいい。
  • 19匹目にウツボット(BEh)「ぼダメギて」。
    • ウツドンは12~15番道路に出現する(マダツボミも即進化可能)ため、これをリーフのいしで進化させればいい。
  • 20~22匹目はニックネームさえ合えば何でもいい。

メノクラゲ→ウツボット(18 BE ; jr BE)で育て屋預けフラグまで飛び(pcをD9C6h→D984hに)、
預けフラグ(01h)と「ゃわ」(E0h DCh)でbcレジスタにDCE0を代入(01 E0 DC ; ld bc,DCE0)、
「てょん」(C3 E2 DE ; jp DEE2)で22匹目のニックネームまで飛び、「だア」(30 80 ; jr nc,80)で1匹目のニックネームに飛ぶ(pcをDEE4h→DE64hに)ようにしている。
はやぶさバッヂ使用ルートは初期・後期で微妙に手順が異なってくるためここでは触れないことにする。(はやぶさバッヂ使用チャートの動画やブログは多い)

ボックス内コード
  1. がんぜルョ
  2. よヂづよく
  3. づよ
    • 赤緑初期では「づよ」(む→そ)※67→79
    • 青では「づよ」(む→ワ)※67→8F
    • ピカチュウ初期(Ver.1.0)では「にグ」(よむ→にグ)※67→3F
    • ピカチュウ後期(Ver.1.1~)では「にゲ」(よむ→にゲ)※67→40
  4. ゅョダだグ
  5. ぼヂてソん
  6. ダだギムツ
  7. てソんダム
  8. キづごヅー
  9. ぱへにんぴ
  10. へにんボぷ
  11. へにんへ※5、6文字目は冒頭のコードで「Hね゜」書き換えられる。※「H」(67h)は赤緑後期の場合。
  12. うゾダグ※1文字目は冒頭のコードで「円」に書き換えられる。
  13. ダめいんど
  14. ダれチんダ
  15. めしんざダ
  16. れゃわダリ
  17. だいなひだ
  18. へみんちレ
  19. ぼダメギて
  20. よザれんん
  21. よメボデの
  22. だアの※「てょん」で飛んでくる先。ここから相対ジャンプでボックス1匹目のニックネームに飛ぶ。

操作方法

簡易型バイナリエディタでは、アドレスとその値が表示される。
「ゃわ」でDCE0h(ボックス24番目のすばやさ努力値下桁)を指定するので初期状態のアドレス表示はDCE0と表示されているはず。

なお、「ゃわ」の部分を変えることで開始位置を変えることもできる。(例:「たむてん」を預ければ手持ち4匹目のHP努力値上桁から開始できる)
あくまで育て屋に預けている状態である必要がある点には注意。

A 指すアドレスを+1h
数値を入力したらAで進めていくことになる。
B 指すアドレスを-1h
指しているアドレスの値を+1h
指しているアドレスの値を-1h
指しているアドレスの値を+10h
指しているアドレスの値を-10h
SELECT アドレスDCE0hからプログラム実行。バイナリエディタが完成してから行うこと。
START 簡易型バイナリエディタを終了。長いコードを打ち込むので、セーブしながら進めるのが吉。
始点はDCE0hで固定されている点に注意。

おまけ1:バイナリエディタリセット

バイナリエディタを1から書き直す場合、元の数値が残っていると入力ミスの元になることも考えられる。

そこで、簡易型バイナリエディタで実行できるリセットコードを作成してみた。

DCEBh~DDA0hの0フィル
アドレス ニモニック 備考
DCE0 21 ld hl,DCEB コード部分を残す必要があるので、コードの先を指定。
DCE1 EB
DCE2 DC
DCE3 06 ld b,B6 B6h(182)バイトの繰り返し
DCE4 B6
DCE5 AF xor a aレジスタを00hにする。
DCE6 22 ldi (hl),a これでDA00hまでを00hで埋めていく。
DCE7 05 dec b bレジスタの値を1減らす。
DCE8 20 jr nz,FC bレジスタが00hになるまで
DCE9 FC
DCEA C9 ret コード終了。ここから下を書き換えていく。

バイナリエディタ作成

簡易版バイナリエディタができたら、それを使ってDCE0から以下の数値を書き込んでいく。
DD24h、DD73h、DD74hに書き込む値がバージョンによって異なる点に注意。
なお、このバイナリエディタはボックス24~30番目のポケモンのステータスを使用している。

引用:memory_editor_rom.asm · GitHub

※ROMバンク切り替え機能なし版:memory_editor.asm · GitHub

2024/5/7更新!SELECT+Aでの実行時、hlレジスタを変更するとフリーズする問題の対策をしました。
DD47を43→6F(DD46hのCBhと合わせてbit 0,eをbit 5,aに変更)に変えてください。(導入済みの場合は、3E 6F EA 47 DD C9 [ld a,6F→ld (DD47),a→ret]でも直せます)

バイナリエディタ本体
アドレス
DCE0 21
DCE1 00
DCE2 D0
DCE3 CD
DCE4 23
DCE5 DD
DCE6 E5
DCE7 11
DCE8 F8
DCE9 FF
DCEA 19
DCEB E5
DCEC D1
DCED 21
DCEE A9
DCEF C3
DCF0 CD
DCF1 8E
DCF2 DD
DCF3 CD
DCF4 7D
DCF5 DD
DCF6 01
DCF7 0C
DCF8 00
DCF9 36
DCFA 7C
DCFB 23
DCFC 7A
DCFD CD
DCFE 7D
DCFF DD
DD00 7B
DD01 CD
DD02 7D
DD03 DD
DD04 36
DD05 7F
DD06 23
DD07 1A
DD08 CD
DD09 7D
DD0A DD
DD0B 13
DD0C 36
DD0D 7C
DD0E 09
DD0F 7C
DD10 FE
DD11 C5
DD12 20
DD13 E5
DD14 3E
DD15 ED
DD16 EA
DD17 4B
DD18 C4
DD19 AF
DD1A EA
DD1B 00
DD1C 60
DD1D EA
DD1E 00
DD1F 00
DD20 E1
DD21 18
DD22 C0
DD23 CD
DD24 赤緑初期:79
赤緑後期:67
青:8F
ピカ初期:3F
ピカ後期:40
DD25 38
DD26 F0
DD27 B3
DD28 01
DD29 01
DD2A 00
DD2B 07
DD2C 38
DD2D 14
DD2E 0B
DD2F 0B
DD30 07
DD31 38
DD32 0F
DD33 0E
DD34 F0
DD35 07
DD36 38
DD37 0A
DD38 01
DD39 10
DD3A 00
DD3B 07
DD3C 38
DD3D 04
DD3E 48
DD3F 07
DD40 38
DD41 09
DD42 CB
DD43 53
DD44 28
DD45 0D
DD46 CB
DD47 6F
DD48 28
DD49 03
DD4A E9
DD4B E1
DD4C C9
DD4D F0
DD4E B8
DD4F 81
DD50 E0
DD51 B8
DD52 C9
DD53 79
DD54 CB
DD55 43
DD56 20
DD57 06
DD58 CB
DD59 4B
DD5A 20
DD5B 1E
DD5C 09
DD5D C9
DD5E A7
DD5F C8
DD60 F5
DD61 CD
DD62 8E
DD63 DD
DD64 F1
DD65 86
DD66 77
DD67 E5
DD68 F0
DD69 B8
DD6A F5
DD6B 3E
DD6C 1C
DD6D E0
DD6E B8
DD6F EA
DD70 00
DD71 20
DD72 CD
DD73 赤緑:69
青:59
ピカ初期:B4
ピカ後期:BF
DD74 赤緑青:7C
ピカチュウ:77
DD75 F1
DD76 E0
DD77 B8
DD78 E1
DD79 C9
DD7A 84
DD7B 67
DD7C C9
DD7D F5
DD7E CB
DD7F 37
DD80 CD
DD81 84
DD82 DD
DD83 F1
DD84 E6
DD85 0F
DD86 C6
DD87 F6
DD88 30
DD89 02
DD8A C6
DD8B 60
DD8C 22
DD8D C9
DD8E 3E
DD8F 01
DD90 EA
DD91 00
DD92 60
DD93 3E
DD94 0A
DD95 EA
DD96 00
DD97 00
DD98 F0
DD99 B8
DD9A EA
DD9B 00
DD9C 20
DD9D EA
DD9E 00
DD9F 40
DDA0 C9

実行と仕上げ

打ち込みに成功していれば、簡易版バイナリエディタでSTARTを押すとバイナリエディタが起動する。
始点はDCE2とDCE1で設定されている。(デフォルトはD000h)
ROMバンクとsRAMバンクは同時に変更される。(初期値は03h)

操作方法
キー 操作
アドレスを-01h
アドレスを+01h
アドレスを-10h
アドレスを+10h
B+上 アドレスを-100h
B+下 アドレスを+100h
B+左 アドレスを-1000h
B+右 アドレスを+1000h
SELECT+上 バンクを+01h
SELECT+下 バンクを-01h
SELECT+左 バンクを-10h
SELECT+右 バンクを+10h
SELECT+A カーソル位置のプログラム実行
A+下 数値を+01h
A+上 数値を-01h
A+左 数値を-10h
A+右 数値を+10h
START バイナリエディタを終了

おまけ2:バイナリエディタを他ボックスにコピー

DA00hから実行するような巨大なコードを複数保存したい場合、バイナリエディタごと他のボックスにコピーするのが有効。バックアップという点でも重要。

手順
  1. コピー先のボックスに一度切り替える。(念のため)
    • 未使用のボックスの場合、初めて切り替えた時に初期化処理が行われるため。
  2. コピー元のボックスに切り替える。
  3. バイナリエディタを起動し、アドレスD51Fhの値をコピー先のボックスに合わせて書き換える。
    • 1:80 / 2:81 / 3:82 / 4:83 / 5:84 / 6:85 / 7:86 / 8:87
      上桁の8は初期化済みを示すもので、下桁はボックスの番号より1少なくなると覚えておけばいい。
  4. 書き換えたら、現在ボックスがコピー先のボックスになっているので、コピー元のボックスにもう一度切り替える。
    ここを間違えると逆にコッピ―元のボックスが消えるので注意。
  5. コピー元のボックスでバイナリエディタを起動し、アドレスD2B9hの値を1Eに書き換える。
    • これで、コピー元のボックスのボールマークが復活する。

バイナリエディタを直接起動できるようにする

動作確認ができたら、バイナリエディタを直接起動できるようにすると便利。
また、ボックスの中身が変わるとバイナリエディタが崩壊するので、D9B2hを1Eに書き換えてポケモンを追加できないようにしておくと安心。

赤緑青の場合

育て屋に預けるポケモンを「パパてゃわ」に変えることで、サファリボールや育て屋の状態にかかわらずバイナリエディタを直接起動できるようになる。
具体的にはD985h~を以下のように書き換える。

名前変更
アドレス 文字
D985 40
D986 40
D987 C3
D988 E0
D999 DC
ピカチュウの場合

D9B2h~を以下のように書き換える。

書き換え箇所
アドレス 備考
D9B2 1E 30匹預けていることにして崩壊防止
D9B3 A5 ここは即値(ld a,xxの「xx」)として使うため元のままでいい。
ポッポの場合は24になっているが変更する必要はない。
D9B3 C3 以下3匹は(見た目だけ)バグポケモン(ここは「アム゛」)になるので強さを見るのは避ける。
D9B4 E0 ポケスタで見ると中身の種族に見えてしまうが、
ボックスの中身を弄らなければ書き換えられることはない。
D9B5 DC 「ゃパ」というバグポケモンだったり

ピカチュウバージョンではかいがらバッヂを手に入れる過程で道具周りのデータを破損させたりするため、そちらのリカバリーも行うこと。

例:毒サファリいあいぎりルートの場合はD4B9hを32に戻したり、D525hを1足しておく。

おまけ3:ROMバンクの切り替え法(バンク切り替え機能がある場合は不要)

アドレス4000h~7FFFhにはROMデータの一部が格納されている。
バイナリエディタを起動した時点のROMバンクは03hになっているが、ROMバンク自体は01h~1Fhまで存在する(殿堂入りのプログラムはバンク1Chに入っている)
ROMバンクを切り替えてデータを見たい場合は2000hとFFB8hに書き換えたいバンクの番号を入れる必要がある。
バイナリエディタ上で適当な場所(D000hでも一応おk)に以下のコードを書き込み、コードの先頭にカーソルを合わせてSELECTを押すと、指定したバンクの4000hからデータを見ることができる。

コード例
数値 ニモニック 備考
3E ld a,xx  
xx 即値 切り替えたいバンクの番号を入れる
EA ld (2000),a 2000hにバンク番号を代入
00 即値  
20 即値  
E0 ld (FF00+B8),a FFB8hにバンク番号を代入
B8 即値  
21 ld hl,4000  
00 即値 この数値を変えることでバイナリエディタの始点を変えられる
40 即値
C9 ret 処理を終了してバイナリエディタに戻る

おまけ4:パソコン型バイナリエディタ

※過去の遺物。(ピカチュウ版では応用できるかもしれないが)
これを導入すると育て屋が使えなくなるため、現在ではイベントフラグの未使用領域(セーブもされる)を利用したバイナリエディタの導入を推奨。
未使用領域型バイナリエディタ
こちらならパソコンを解放でき、書き込み箇所もまとまっているので簡易型バイナリエディタで導入できる。

今回作成したバイナリエディタはボックスのポケモン内に本体があるため、ボックスを切り替えて実行するようなことができない。
そこで、育て屋の領域とパソコンの道具を使うことでボックスの領域を自由に使えるようにするバイナリエディタも開発されている。
打ち込みはバイナリエディタで行うといいだろう。※容量が足りないため、ROMバンクの切り替え機能は入っていない。

参考:memory_editor_stored_item.asm · GitHub
※下記のコードはパソコンのデータを3バイトずらしていることに注意。変更点を緑字強調で示す。

育て屋データ
アドレス ニモニック 備考
D983 00 nop 1Eh(サファリボール30個)でも一応問題はない
D984 00 nop 01h以上にするとD99Fh~D9A1h(経験値)が歩行で変化してしまう。
D985 21 ld hl,D000 開始アドレス設定 ピカ版の場合はここに飛ぶようにすればいい(「てカる」に対応)
D986 00   ニックネーム:あ゛[無効]みへはや
D987 D0    
D988 CD call D4CA ※パソコン内に飛ぶ
D989 CA    
D98A D4    
D98B E5 push hl 親名:゛ヅ29パポケモン
D98C 11 ld de,FFF8  
D98D F8    
D98E FF    
D98F 19 add hl,de  
D990 54 ld d,h  
D991 5D ld e,l 種族:シードラ
D992 21 ld hl,C3AB 現在HP:8619
D993 AB    
D994 C3   引き取りレベル:195(預けた状態にできない理由でもある)
D995 36 ld (hl),7C 左側の枠線を描画する部分
D996 7C   タイプ1(謎)
D997 23 inc hl タイプ2も存在しないタイプ
D998 7A ld a,d ちからのねっこを持っていることになる…らしい
D999 CD call D50A パソコンに飛ぶ
D99A 0A   わざマシン05、ひっかく
D99B D5   わざマシン13
D99C 7B ld a,e スモッグ
D99D CD call D50A 再びパソコンへ
D99E 0A   ID:52490
D99F D5   ここから経験値
D9A0 36 ld (hl),7F アドレスと数値の間のスペースを描画する部分
D9A1 7F    
D9A2 23 inc hl ここから努力値
D9A3 1A ld a(de)  
D9A4 CD call D50A  
D9A5 0A    
D9A6 D5    
D9A7 36 ld (hl),7C 右側の枠線を描画する部分
D9A8 7C    
D9A9 01 ld bc,000C  
D9AA 0C    
D9AB 00   ここまで努力値
D9AC 09 add hl,bc AB個体値
D9AD 13 inc de SC個体値
D9AE 7D ld a,l ここから技PP
D9AF C3 jp D4BC パソコン2番目の種類に飛ぶ
D9B0 BC   参考元のコードではD4B9hで預け数に飛んでいる
D9B1 D4   この先はボックスのデータ。結構ギリギリ。
パソコンデータ
アドレス ニモニック 備考
D4B9 31   道具49種類でできるため、預け数もそれに合わせておく。
D4BA FF   先頭にやめるを設置。
D4BB 63   特に理由もなく99個。一応やめるも引き出せてしまうので…
D4BC FE cp a,13  
D4BD 13    
D4BE C2 jp nz,D995 左枠線描画部
D4BF 95    
D4C0 D9    
D4C1 3E ld a,ED  
D4C2 ED    
D4C3 EA ld (C44B),a カーソルを描画する部分
D4C4 4B    
D4C5 C4    
D4C6 E1 pop hl  
D4C7 C3 jp D988 育て屋に飛ぶ
D4C8 88    
D4C9 D9    
D4CA CD call 38※  
D4CB 赤緑初期:79
赤緑後期:67
青:8F
ピカ初期:3F
ピカ後期:40
  ※バージョンによってサブルーチンの位置が違うため、
この部分を変える必要がある。
参考元ではD4C8hであることに注意。
D4CC 38    
D4CD F0 ld a,(FFB3) 入力検知部
D4CE B3    
D4CF 07 rlca  
D4D0 30 jr nc,04 D4D6hに飛ぶことになる
D4D1 04    
D4D2 3E ld a,01  
D4D3 01    
D4D4 18 jr 1C D4F2hに飛ぶことになる。
D4D5 1C    
D4D6 07 rlca  
D4D7 30 jr nc,03 D4DChに飛ぶことになる。
D4D8 03    
D4D9 9F sbc a  
D4DA 18 jr 16 D4F2に飛ぶことになる。
D4DB 16    
D4DC 07 rlca  
D4DD 30 jr nc,04 D4E3hに飛ぶことになる。
D4DE 04    
D4DF 3E ld a,F0  
D4E0 F0    
D4E1 18 jr 0F D4F2hに飛ぶことになる。
D4E2 0F    
D4E3 07 rlca  
D4E4 30 jr nc,04 D4EAhに飛ぶことになる。
D4E5 04    
D4E6 3E ld a,10  
D4D7 10    
D4E8 18 jr 08 D4F2hに飛ぶことになる。
D4E9 08    
D4EA 07 rlca  
D4EB 30 jr nc,02 D4EEhに飛ぶことになる。
D4EC 02    
D4ED E1 pop hl  
D4EE C9 ret  
D4EF 07 rlca  
D4F0 D0 ret nc  
D4F1 E9 jp hl  
D4F2 CB bit 0,e  
D4F3 43    
D4F4 28 jr z,03 D4F9hに飛ぶことになる。
D4F5 03    
D4F6 86 add (hl)  
D4F7 77 ld (hl),a 指しているアドレスの値増減処理
D4F8 C9 ret  
D4F9 CB bit 1,e  
D4FA 4B    
D4FB 28 jr z,03 D500hに飛ぶことになる。
D4FC 03    
D4FD 84 add h  
D4FE 67 ld h,a 指すアドレス上桁の増減処理
D4FF C9 ret  
D500 06 ld b,00  
D501 00    
D502 CB bit 7,a  
D503 7F    
D504 28 jr z,01 D507hに飛ぶことになる。
D505 01    
D506 05 dec b  
D507 4F ld c,a  
D508 09 add,hl,bc 指すアドレス下桁の増減処理
D509 C9 ret  
D50A 47 ld b,a  
D50B CB swap a  
D50C 37    
D50D CD call D511  
D50E 11   パソコン内なのでずれを考慮
D50F D5    
D510 78 ld a,b  
D511 E6 and a,0F  
D512 0F    
D513 C6 add a,F6  
D514 F6    
D515 30 jr nc,02 D519hに飛ぶことになる。
D516 02    
D517 C6 add a,60  
D518 60    
D519 22 ldi (hl),a  
D51A C9 ret  

タグ:

+ タグ編集
  • タグ:
最終更新:2024年06月11日 17:56