メモリエディタ、RAMエディタとも。
RAMを自由自在に編集できるプログラム。任意コード実行の最高到達点の一つ。
これがあればもはや書き換え系のコードをいちいち作成する必要性がなくなり、任意コード実行用のプログラムの書き込みも非常に容易になる。
思わぬ範囲まで効果が及ぶ可能性があるので危険が伴います。実験・使用・使用後のセーブには充分注意しましょう。
特にsRAMバンク01h(A000h~BFFFh)は下手に弄ると簡単にフアイルのデータが壊れます。(一応対策はされました)
このページで扱うバイナリエディタにはROMバンクやSRAMバンクの切り替え機能があります。
これらの機能が不要な場合、未使用領域を使ったバージョンが公開されているのでそちらを使うことをお勧めします。
→未使用領域型バイナリエディタ
バージョンによってサブルーチンの位置が簿妙に違うため、コードを変える必要がある。
下記のコードをボックスの1番目から並べ、
の条件を満たしたうえでなかよしバッヂを使用する。3匹目のニックネームがバージョンによって異なるため注意。
なお、足りない部分を補完するため実行時にボックスのポケモンの名前が少し変わるようになっている。
2回目以降は気にせず実行しておk。
ピカチュウ版ではなかよしバッヂの代わりにかいがらバッヂを使用する。
その仕様上、預けるポケモンの数および種類にも指定がある。
メノクラゲ→ウツボット(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に)ようにしている。
はやぶさバッヂ使用ルートは初期・後期で微妙に手順が異なってくるためここでは触れないことにする。(はやぶさバッヂ使用チャートの動画やブログは多い)
操作方法
簡易型バイナリエディタでは、アドレスとその値が表示される。
「ゃわ」でDCE0h(ボックス24番目のすばやさ努力値下桁)を指定するので初期状態のアドレス表示はDCE0と表示されているはず。
なお、「ゃわ」の部分を変えることで開始位置を変えることもできる。(例:「たむてょん」を預ければ手持ち4匹目のHP努力値上桁から開始できる)
あくまで育て屋に預けている状態である必要がある点には注意。
A | 指すアドレスを+1h 数値を入力したらAで進めていくことになる。 |
---|---|
B | 指すアドレスを-1h |
下 | 指しているアドレスの値を+1h |
上 | 指しているアドレスの値を-1h |
右 | 指しているアドレスの値を+10h |
左 | 指しているアドレスの値を-10h |
SELECT | アドレスDCE0hからプログラム実行。バイナリエディタが完成してから行うこと。 |
START | 簡易型バイナリエディタを終了。長いコードを打ち込むので、セーブしながら進めるのが吉。 始点はDCE0hで固定されている点に注意。 |
バイナリエディタを1から書き直す場合、元の数値が残っていると入力ミスの元になることも考えられる。
そこで、簡易型バイナリエディタで実行できるリセットコードを作成してみた。
アドレス | 値 | ニモニック | 備考 |
---|---|---|---|
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 | バイナリエディタを終了 |
DA00hから実行するような巨大なコードを複数保存したい場合、バイナリエディタごと他のボックスにコピーするのが有効。バックアップという点でも重要。
動作確認ができたら、バイナリエディタを直接起動できるようにすると便利。
また、ボックスの中身が変わるとバイナリエディタが崩壊するので、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足しておく。
アドレス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 | 処理を終了してバイナリエディタに戻る |
※過去の遺物。(ピカチュウ版では応用できるかもしれないが)
これを導入すると育て屋が使えなくなるため、現在ではイベントフラグの未使用領域(セーブもされる)を利用したバイナリエディタの導入を推奨。
→未使用領域型バイナリエディタ
こちらならパソコンを解放でき、書き込み箇所もまとまっているので簡易型バイナリエディタで導入できる。
今回作成したバイナリエディタはボックスのポケモン内に本体があるため、ボックスを切り替えて実行するようなことができない。
そこで、育て屋の領域とパソコンの道具を使うことでボックスの領域を自由に使えるようにするバイナリエディタも開発されている。
打ち込みはバイナリエディタで行うといいだろう。※容量が足りないため、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 |