レポートバグ(SRAM glitch) (初代)

はじめに

初代ポケモンには、メニューからレポートを書く際に特定のタイミングで強制リセット*1をすると、手持ちデータのみセーブされていない状態で続きから始めることができます。

手順は以下のとおりです[1]。

  1. メニューを開き、レポートを書くかどうかの確認画面まで進む(「ここまでの かつやくを~」というメッセージが表示されるところまで)。
  2. 以下のタイミングで強制リセットをする。
    • 赤緑青版では、「~かきのこした!」が出た直後*2
    • ピカチュウ版では、「はい」を押してから約0.5秒後
  3. 強制リセットのタイミングが適切であれば、レポートバグが成功する。適切でなかった場合は、セーブされない・レポートが壊れる・正常にセーブされるのいずれかになる。

解説

この節では、メニューからのセーブ・ロード・レポートの削除について説明し、その後にレポートバグの原理について説明します。

セーブ

全体の流れ

メニューからレポートを書くときの処理は、以下のようになっています。

  1. レポートを書くかどうかを確認する(進行状況のダイアログと「ここまでの かつやくを~」の確認メッセージを表示)。
  2. 前に書かれたレポートが存在するかどうかを調べ、存在する場合は上書き確認をする(「まえに かかれた レポートが~」の確認メッセージを表示)。(※)
  3. 1・2ともに「はい」が選ばれた場合は、レポートを書く。

※: 実際には、後述のようにレポートが壊れているときに上書き確認される。

上書き確認について

以下の条件について、1を満たし、かつ2または3を満たす場合は、前に書かれたレポートが存在するものとみなします。ただし、青とピカチュウ版でタイトルメニューに「つづきからはじめる」がない状態で始めた場合は、常に前に書かれたレポートが存在しないものとみなします。

  1. レポート上の主人公名の1文字目が00hでない
  2. レポートが壊れている(01:B594hの値と01:A598h~01:B593hのチェックサムを計算した値が一致しない)
  3. レポート上の主人公のIDとWRAM上の主人公のIDが一致しない
レポートを書く処理

レポートを書く(SRAMに書き込む)処理は、以下のようになっています。

  • (赤緑青) セーブ完了のメッセージを表示してからSRAMに書き込む
  • (ピカチュウ) SRAMに書き込みを行ってからセーブ中のメッセージ表示→一定時間待機→セーブ完了のメッセージを表示する

SRAMへの書き込みは、以下のように3回に分けて行われます。

  1. 手持ちポケモンデータ以外のSRAMバンク01hに書き込まれるすべてのデータ
  2. 現在選択中のボックスデータ
  3. 手持ちポケモンデータと図鑑データ
    • ピカチュウ版では、これに加えてなつき度・ごきげん度もセーブする

1~3それぞれの書き込みごとに、チェックサムが計算され、その値がSRAMに書き込まれます。

ロード

タイトル画面でレポートのデータをロードする際は、まずレポート上の主人公名に50hが入っているかどうかを調べます。50hが入っていない場合はレポートが存在しないとみなし、ロードを行いません。50hが入っている場合はロード処理を呼び出します。

ロード処理は、セーブ時と同様に3回に分けて行われます。

  1. 手持ちポケモンデータ以外のSRAMバンク01hに書き込まれるすべてのデータ
  2. 現在選択中のボックスデータ
  3. 手持ちポケモンデータと図鑑データ

1~3それぞれの段階で、ロード前にレポートのチェックが行われます。レポートに記録されているチェックサムの値と、ロード時に計算したチェックサムの値を比較し、一致していない場合はレポートが壊れていると判断します*3。いずれかの地点で壊れていると判断された場合はそこでロード処理が中断され、「フアイルの データが こわれています!」というメッセージを表示し*4、続きから始められないようにします。

レポートの削除

タイトル画面で「↑+Select+B」を押し、その後の確認画面で「はい」を選ぶと、SRAMの全領域*5が赤緑版では00h・青ピカチュウ版ではFFhで初期化されます。

原理

このバグが発生する原因は、強制リセットでSRAMへの書き込みを強制的に中断することにより、手持ちデータのみセーブされず前の状態を引き継ぐためです。

SRAMへの書き込み中に強制リセットを行うと、その時点でSRAMへの書き込みが中断されます。レポートを書く処理の1番目か3番目が実行されているときに強制リセットを行った場合は、チェックサムが更新されないため、次のロード時にレポートが壊れていると判断されます*6

一方、レポートを書く処理の2番目が実行されているときに強制リセットを行った場合を考えてみます。レポートを書く処理の2番目で書き込まれる内容は同1番目に含まれているため、この処理でSRAMのデータとチェックサムが更新されることはありません。そのため、2番目の処理が実行されているときに強制リセットを行った場合は、次のロード時にレポートが壊れていないと判断されて正常にデータがロードされ、手持ちデータがセーブされていない状態で続きから始めることができます。レポートを削除してからレポートバグを行った場合はレポート削除時に初期化される値を引き継ぐため、手持ちデータ領域は00h(赤緑)またはFFh(青ピカチュウ)となります。

上記のとおり、強制リセットを行ったあとのレポートの状況は強制リセットを行うタイミングによって変わります。強制リセットを行ったタイミングごとのレポートの状況は、表1のようになります。

表1 強制リセットのタイミングごとのレポート状況
強制リセットのタイミング 結果
1より前 セーブされない
1の最中 レポートが壊れる
2の最中 レポートバグ成功、手持ちデータがセーブされない
3の最中 レポートが壊れる
3より後 正常にセーブされる(手持ちデータを含めて)
※強制リセットのタイミングの1~3は、レポートを書く処理の1~3に対応する。

応用例

このバグを利用して、以下のことができます。

  • (青・ピカチュウ版のみ)最初からゲームを始めて手持ちポケモンの数を255匹にする[1]
  • 前のデータの手持ちポケモンを引き継いだ状態で最初からゲームを始める[2][3]

参考文献

[1] オーキドせんせい研究者、オーキドせんせい撃破RTA06:14【ポケモン初代(青) ゆっくり解説】 - YouTubehttps://www.youtube.com/watch?v=YrMjEehtOAg、2022年11月16日閲覧。

[2] しづき、続々・レポートを書くときに電源を切ると | 伝説のスターブロブ2、https://hakuda2.web.fc2.com/wario/poke4/f26-2.html、2022年11月19日閲覧。

[3] SRAM glitch - Glitch City Wikihttps://glitchcity.wiki/SRAM_glitch、2022年11月19日閲覧。

*1:電源OFF→ONによるリセット。ハードリセットとも言う。

*2:参照元では赤緑版について触れられていないが、後述のとおりレポートを書く処理が青版と同じであるため、青と同じタイミングでできる。

*3:1のロード処理のみ、1度目の比較で不一致だった場合はもう1度比較が行われ、それでも不一致だった場合のみ壊れていると判断します。

*4:ピカチュウ版では「ファイル~」

*5:00:A000h~03:BFFFhまでの8192*4バイト

*6:チェックサムは1バイト値のため、たまたま一致してロードに成功することもあります。