ピカチュウ版で、冒険の途中から任意コード実行環境を構築する(ミラー領域を使用しない方法)

はじめに

ピカチュウ版で、冒険の途中から任意コード実行環境を構築する
上記の記事では、わざマシン05の不正な追加効果を利用して任意コード実行環境を構築する方法を説明しています。この方法はWRAMのミラー領域を使用しているため、ミラー領域が機能していない環境では、この手順を行うことはできないという問題があります。この記事では、ミラー領域を使用しないで任意コード実行環境を構築する方法を説明します。

構築手順

条件

  • ななしのどうくつに行けること
  • 赤緑青と通信交換できること
  • 使っていないボックスが1つ以上あること

赤緑青で用意するもの

※技やステータスの調整は、セレクトバグ・任意コード実行・バイナリエディタなどで行う。

ピカチュウ版で用意するもの

  • (v1.0のみ) いらないポケモン2匹(B)(C)
  • 回避率上昇以外の効果を持つ補助技を覚えているポケモン(D)

手順

  1. 通信交換で(A)をピカチュウ版に送る。
    ※送ったあとに(A)をポケモンボックスや育てやに預けてはいけない。引き出すときにステータスの再計算が行われ、調整したステータスが消えてしまう。
  2. 道具をすべてパソコンに預ける。
    ※預けていない道具は手順終了時点で消えるので注意。
  3. ポケモンボックスのニックネームを以下のようにする。
    • v1.0用 ※[1]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:がめぜルべ
       03:づョづぶづ
       04:ぶづよマづ
       05:にマづぜべ
       06:ョオづにカ
       07:づよナづぼ
       08:づにレづざ
       09:よバづにヨ
       10:づよそづぼ
       11:づにッづの
      
    • v1.1~v1.3用 ※[2]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:べがめぜュ
       03:づぶづぶづ
       04:ぶづよマづ
       05:にせづにさ
       06:づよさづそ
       07:にョづよバ
       08:づよノづづ
       09:にねづよー
       10:づの
      
  4. 手持ちポケモンを以下の順に並べる。
    • (v1.0) 先頭2匹は(B)(C)、3匹目以降は(A)(D)を含んだ任意のポケモン
    • (v1.1~v1.3) 先頭は(A)以外、2匹目以降は(A)(D)を含んだ任意のポケモン
  5. ななしのどうくつに行き、レベル60か65のメタモンとエンカウントする。
    ※条件を満たすメタモンの、フロアごとの出現率は以下のとおり[1]。
    • 1階: 1%
    • 2階: 10%
    • 地下1階: 15%
  6. (A)に交代する。交代後はメタモンが(A)に変身する。
  7. (D)に交代する。
  8. メタモンが使用するわざマシン42が命中し一撃で倒されなかった場合、手持ちの道具が以下のように変化する(v1.0の場合は手持ち1・2匹目の親名も変化する)。命中しなかった場合は、補助技を使ってターンを稼ぐ。

任意コード実行方法

上記の手順で任意コード実行環境を構築したあとの任意コード実行方法については、前回の記事を参照してください。

解説

この構築手順は、バグ技「わざマシン42」の不正な追加効果を利用してポケモンボックスのニックネームに書いたプログラムを実行し、任意コード実行環境を構築しています。

ピカチュウ版におけるわざマシン42の技データを表1に示します(v1.0~v1.3共通)。

表1 ピカチュウ版のわざマシン42の技データ
アニメーション 78h (じばくと同じ)
追加効果 71h (不正値)
威力 102
タイプ C6h (特殊技、タイプ名参照先はFE13h)
命中率 118/256 (約46.1%)
PP 43

わざマシン42のタイプ名は不正であり、不用意にメモリを書き換える可能性があります。そのため、構築手順ではタイプ名を表示させないようにしています。

ピカチュウ版で追加効果71hが発生した場合は、アドレスCD1Fhにジャンプします(v1.0~v1.3共通)。ここから、アドレスCD27h~CD29hに書いたジャンプ命令でボックス1番目のニックネーム1文字目のアドレスDE64hにジャンプし、ボックスのニックネームに書いた任意コード実行環境を構築するプログラムを実行しています。

アドレスCD1Fh~アドレスCD29hが何に使用されているかを表2に示します。

表2 アドレスCD1Fh~CD29hの内容
アドレス(16進数) 内容
CD1F 自分のポケモンの回避率補正(1~13、初期値7)
CD20 未使用(一度でも戦闘すると7になる)
CD21 未使用(一度でも戦闘すると7になる)
CD22 未使用(常に0)
CD23 相手のポケモンのレベル
CD24 相手のポケモンの最大HP上桁
CD25 相手のポケモンの最大HP下桁
CD26 相手のポケモンの補正前のこうげき実数値上桁
CD27 相手のポケモンの補正前のこうげき実数値下桁
CD28 相手のポケモンの補正前のぼうぎょ実数値上桁
CD29 相手のポケモンの補正前のぼうぎょ実数値下桁

表2に示したアドレスのうち、相手のポケモンが変身した場合は、アドレスCD26h~CD29hの値がこちらのポケモンの値となります。

メタモンとエンカウントする場所とレベルについて

ピカチュウ版では、メタモンはななしのどうくつ以外に、ポケモンやしきの地下1階にも出現します。構築手順でエンカウントする場所やレベルを指定している理由は、メタモンの個体によってはアドレスCD27h~CD29hに書いたジャンプ命令が実行できなかったり、ジャンプする前にスタックポインタやメモリを書き換えたりするためです。

それぞれの場所で出現するメタモンのレベルは、表3のとおりです。

表3 ピカチュウ版でメタモンが出現する場所と、出現するメタモンのレベル[1]
場所 レベル
ポケモンやしき 地下1階 12・18・24
ななしのどうくつ 1階 55・60
ななしのどうくつ 2階 60
ななしのどうくつ 地下1階 60・65

アドレスCD27h~CD29hに書いたジャンプ命令を実行するためには、アドレスCD1Fh~CD26hの間で停止しない・メモリを書き換えない・スタックポインタを書き換えない・ジャンプしない必要があります。このうちアドレスCD1Fh~CD22h・CD24h・CD26hに書かれた命令はこの条件を満たしているので、残りのCD23h・CD25h、すなわちメタモンのレベルと最大HPが問題となります。

表4はピカチュウ版での野生のメタモンのレベルごとの最大HPの値を示したものです。表4の太字で示しているレベルと最大HPは、それらの値を命令として解釈したときに条件を満たさない命令となります。出現する個体によらず安全に実行できるのはレベル60と65のときで、これらのレベルが出現するのはななしのどうくつのみとなります。

表4 メタモンのレベル別最大HPの値
レベル 最大HPの取りうる値
12 33~37 (34)
18 45~50 (48、49、50)
24 57~64 (59)
55 117~118・120~129・131~134 (117~118)
60 127~128・130~134・136~140・142~145
65

137~138・140~143・145~147・149~151・153~156

参考文献

[1] ゲームの匠、メタモンポケモン赤緑ピカチュウ攻略|ゲームの匠、https://pokemon.g-takumi.com/pokemon/132/、2023年1月29日閲覧。

[2] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.net、https://medaka.5ch.net/test/read.cgi/poke/1477904768/87、2023年1月11日閲覧。

[3] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 13、https://tamae.5ch.net/test/read.cgi/poke/1389422437/630、2023年1月11日閲覧。

*1:メモリ上の値はFC 50 C3 82 DE、画面上での表示は「6」

*2:メモリ上の値はF7 50 C3 57 D2、画面上での表示は「1」

ピカチュウ版で、冒険の途中から任意コード実行環境を構築する

はじめに

初代と第二世代のポケモンでは、自分で書いたプログラムを実行することができます。これを任意コード実行といいます。

初代と第二世代のポケモンで任意コード実行を行う方法として、以下の方法があります*1

赤緑青
5かい、てへ、なかよしバッヂを使用する方法[1][2]
ピカチュウ
はやぶさバッヂを使用する方法[3]
金銀
わざマシン17を使用する方法[4]*2
クリスタル(および金銀)
バグった図鑑のモードを使用する方法[5]*3

上記の方法を実行できるようにするための構築手順について、最初から始める場合の構築手順は、赤緑青[6]・ピカチュウ[3]・金銀[4]・クリスタル[5]で示されています。

また、赤緑青と金銀クリスタルでは、以下の方法で冒険の途中からでも任意コード実行環境を構築することができます。

赤緑青
壁抜けアイテムを使用して任意コード実行に必要な道具を入手する[1]
金銀クリスタル
自転車を持ったポケモンを通信交換で送る[5]

しかし、ピカチュウ版で冒険の途中から任意コード実行環境を構築する方法は、私が知る限り存在していません。

ピカチュウ版では[3]で示されているように、トキワの森のトレーナーに対してfifth法を行うことで任意コード実行環境の構築をしています。これを行うにはそのトレーナーを倒していない必要があり、そのトレーナーを倒している場合は構築できません。また、初代では持ち物の概念がないため、通信交換で道具を送ることもできません*4

青版では上記で示した方法以外に、ステータスを調整したポケモンとバグ技の追加効果を利用した任意コードの実行方法があります[7]。ピカチュウ版で同じようなことができれば、ピカチュウ版でも冒険の途中から任意コード実行環境の構築ができると考え調べたところ、青版と同じ方法ではないもののできることが分かりました。この記事では、ピカチュウ版でバグ技の追加効果を利用することによって冒険の途中からでも任意コード実行環境を構築する方法を説明します。

構築手順

条件

  • ポケモンやしき」か「ななしのどうくつ」に行けること
  • 赤緑青と通信交換できること
  • 使っていないボックスが1つ以上あること

赤緑青で用意するもの

  • 以下の条件を満たすポケモン(A)
    • 通信交換で進化しないポケモン、具体的にはユンゲラーゴーリキー・ゴローン・ゴースト以外のポケモン
    • ぼうぎょ実数値が50020(C364h)、すばやさ実数値が56832~57087(DE00h~DEFFh)
      ※ぼうぎょ実数値は、画面上では「ゥ20」と表示される
    • 覚えている技がわざマシン05のみ

※技やステータスの調整は、セレクトバグ・任意コード実行・バイナリエディタなどで行う。

ピカチュウ版で用意するもの

手順

  1. 通信交換で(A)をピカチュウ版に送る。
    ※送ったあとに(A)をポケモンボックスや育てやに預けてはいけない。引き出すときにステータスの再計算が行われ、調整したステータスが消えてしまう。
  2. 道具をすべてパソコンに預ける。
    ※預けていない道具は手順終了時点で消えるので注意。
  3. ポケモンボックスのニックネームを以下のようにする。
    • v1.0用 ※[8]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:がめぜルべ
       03:づョづぶづ
       04:ぶづよマづ
       05:にマづぜべ
       06:ョオづにカ
       07:づよナづぼ
       08:づにレづざ
       09:よバづにヨ
       10:づよそづぼ
       11:づにッづの
      
    • v1.1~v1.3用 ※[9]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:べがめぜュ
       03:づぶづぶづ
       04:ぶづよマづ
       05:にせづにさ
       06:づよさづそ
       07:にョづよバ
       08:づよノづづ
       09:にねづよー
       10:づの
      
  4. 手持ちポケモンを以下の順に並べる。
    • (v1.0) 先頭2匹は(B)(C)、3匹目以降は(A)を含んだ任意のポケモン
    • (v1.1~v1.3) 先頭は(A)以外、2匹目以降は(A)を含んだ任意のポケモン
  5. ポケモンやしき 地下1階かななしのどうくつに行き、メタモンとエンカウントする(レベルは不問)。
  6. (A)に交代する。交代後はメタモンが(A)に変身する。
  7. わざマシン05を使用する(メタモンわざマシン05を使用することも含む)。わざマシン05が命中し一撃で倒さなかった場合、手持ちの道具が以下のように変化する(v1.0の場合は手持ち1・2匹目の親名も変化する)。
    ※倒してしまった場合は手順5からやり直し。レベルが上った場合は手順1からやり直し。

任意コード実行方法

上記の手順で任意コード実行環境を構築したあとは、以下の方法で任意コード実行ができます。

v1.0の場合

親名が改ざんされた手持ちの2匹のいずれかをボックス5番目に置いてから、はやぶさバッヂを使用します[3]。

v1.1~1.3の場合

パソコンの道具欄9~11番目を以下のようにしてから、はやぶさバッヂを使用します。

Ver1.1~1.3の道具個数については、
09番目:かみなりのいし 99個
10番目:わざマシン22 35個
11番目:わざマシン33 何個でも

の場合は、ボックス1匹目NN
09番目:かみなりのいし 86個
10番目:わざマシン10 35個
11番目:わざマシン33 何個でも
の場合は、手持ち1匹目NNに飛ぶようになっています

[3]

解説

この構築手順は、バグ技「わざマシン05」の不正な追加効果を利用してポケモンボックスのニックネームに書いたプログラムを実行し、任意コード実行環境を構築しています。

追加効果がある技を使用したとき、ダメージを与えたあとに種類に応じて特定のアドレスへジャンプします*7。例えば、ピカチュウ版のv1.3で「どくばり(追加効果02h)」を使用すると、0F:74DFへジャンプします。追加効果のジャンプ先はジャンプテーブルによって指定され、このテーブルに対応した値がジャンプ先となります。例えば、追加効果の値が02hであれば、テーブルの2番目に書かれているアドレスへジャンプします。

バグ技の中には、一撃で倒さないとフリーズするものがあります[10]。これは、追加効果が不正な値となっているためです。この場合は、ジャンプテーブルからはみ出でている部分をジャンプ先として読み込むため、想定外のアドレスへジャンプすることになります。バグ技の使用による想定外のジャンプ先には、WRAM上かつプレイヤーが自由に書き換えられるアドレスが含まれています。ピカチュウ版のバグ技わざマシン05は、そのうちの1つです。

ピカチュウ版におけるわざマシン05の技データを表1に示します(v1.0~v1.3共通)。

表1 ピカチュウ版のわざマシン05の技データ
アニメーション 77h (数字上はオウムがえしと同じ、ただし実際は打撃モーション[10])
追加効果 FAh (不正値)
威力 117
タイプ 0Bh (物理技、表示上はノーマルだがタイプ一致・相性補正はともになし)
命中率 120/256 (約46.9%)
PP 33

ピカチュウ版で追加効果FAhが発生した場合は、アドレスED28hにジャンプします(v1.0~v1.3共通)。アドレスED28hはCD28hのミラーで、相手のポケモンの補正前のぼうぎょ実数値上桁が書き込まれています。また、CD29h・CD2Ahはそれぞれ、相手のポケモンの補正前のぼうぎょ実数値下桁・すばやさ実数値上桁が書き込まれています。

相手のポケモンが変身すると、これらのアドレスの値はその時に出ている自分のポケモンの値となります。そのため、ステータスを調整したポケモンに変身してもらうことで、任意の値を書き込むことができます。

この構築手順では、アドレスED28h~ED2Ahにボックス1番目のニックネーム1文字目のアドレスDE64hにジャンプする命令を書いています。これによりわざマシン05が命中して一撃で倒さなかった場合は追加効果により、ボックスのニックネームに書いた任意コード実行環境を構築するプログラムが実行されます。これにより、任意コード実行環境を構築することができます。

補足

この構築手順では、WRAMのミラー領域を使用しています。そのため、ミラー領域が機能していない環境では、この手順を行うことはできません。ミラー領域が機能していない環境で任意コード実行環境を構築したい場合は、以下の記事を参照してください。
ピカチュウ版で、冒険の途中から任意コード実行環境を構築する(ミラー領域を使用しない方法)

参考文献

[1] taba、【5かい】初代ポケモンの任意コード実行解説動画【なかよしバッヂ】 - ニコニコ動画https://www.nicovideo.jp/watch/sm28475711、2023年1月16日閲覧。

[2] taba、初代ポケモンの任意コード実行解説動画の謝罪と訂正:tabaのブロマガ - ブロマガ、https://web.archive.org/web/20211007040354/https://ch.nicovideo.jp/taba/blomaga/ar995222、2023年1月16日閲覧。

[3] 魚肉、【VC版対応】ポケットモンスターピカチュウ 任意コード実行下準備チュートリアル | 魚肉の雑記帳、http://blog.livedoor.jp/lpt9705/archives/34247654.html、2023年1月11日閲覧。

[4] Teraman64DD、【ポケモン銀】ポケモン第二世代任意コード実行講座 Part.01【VOICEROID紲星あかり】 - ニコニコ動画https://www.nicovideo.jp/watch/sm37261326、2023年1月16日閲覧。

[5] Teraman64DD、【ゲームボーイポケモン第二世代任意コード実行講座 Part.04【VOICEROID紲星あかり】 - ニコニコ動画https://www.nicovideo.jp/watch/sm38101743、2023年1月16日閲覧。

[6] ありす*、【初代ポケモン】なかよしバッヂ導入チャート【任意コード実行】 - Wonderland Seeker、https://alice-wreath.hatenablog.com/entry/2019/10/03/210029、2023年1月16日閲覧。

[7] imationポケモン青 「わざマシン42」を用いた任意コードの実行(バグ) - ニコニコ動画https://www.nicovideo.jp/watch/sm37244526、2023年1月17日閲覧。

[8] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.net、https://medaka.5ch.net/test/read.cgi/poke/1477904768/87、2023年1月11日閲覧。

[9] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 13、https://tamae.5ch.net/test/read.cgi/poke/1389422437/630、2023年1月11日閲覧。

[10] ROTF、ピカ版 バクわざ目録 | ROTFの覚え書き、https://rollingonthefloor.blog.fc2.com/blog-entry-48.html、2023年1月15日閲覧。

*1:これ以外にも方法はありますが、代表的なものを示しています。

*2:13:06~の理論編

*3:16:51~の理論編

*4:ポケモンスタジアム金銀のカラーケースを使用すれば、ピカチュウ版に道具を送ることはできます。ただし、この方法はVC版では無理です。

*5:メモリ上の値はFC 50 C3 82 DE、画面上での表示は「6」

*6:メモリ上の値はF7 50 C3 57 D2、画面上での表示は「1」

*7:「オウムがえし」や「スピードスター」など、一部の技を除く

レポートバグ(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バイト値のため、たまたま一致してロードに成功することもあります。

レポートのデータ構造(初代)

初代ポケモンのレポートは、SRAMに記録されます。初代ポケモンSRAMは32KiBであり、各8KiBのバンク4つ(バンク0~3)で構成されています。この記事では、各SRAMバンクごとのデータ構造を示します。

※開始アドレス・終了アドレスは、メモリ上のアドレスを示しています。
※未使用領域は、データクリア以外で読み書きすることはありません。

バンク0

表1 バンク0の構造
開始アドレス 終了アドレス サイズ(byte) 内容 備考
A000h A187h 392 グラフィックバッファ領域0 圧縮されているグラフィックデータの展開に使用される
(他のバッファ領域も同様)
A188h A30Fh 392 グラフィックバッファ領域1  
A310h A497h 392 グラフィックバッファ領域2  
A498h A597h 256 未使用  
A598h B857h 4800 殿堂入りデータ(50回分)  
B858h BFFFh 1960 未使用  

殿堂入りデータ

殿堂入りデータは1回あたり96バイトで、下位アドレス側から古い順に入っています。

表2 1回の殿堂入りデータの構造
オフセット サイズ(byte) 内容
0 16 1匹目の殿堂入りポケモン
16 16 2匹目の殿堂入りポケモン
32 16 3匹目の殿堂入りポケモン
48 16 4匹目の殿堂入りポケモン
64 16 5匹目の殿堂入りポケモン
80 16 6匹目の殿堂入りポケモン
表3 殿堂入りポケモンの構造
オフセット サイズ(byte) 内容
0 1 外見の内部番号
1 1 レベル
2 6 ニックネーム
8 8 00h (パディング)

1回の殿堂入りポケモンが5匹以下の場合は、その回の最後の殿堂入りポケモンの直後にFFhが入り、FFhより後ろの領域は全て00hとなります。例えば3匹で殿堂入りした場合、最初の3匹分は表3のデータが書き込まれます。4匹目は外見の内部番号にFFhが書き込まれ、残りの15バイト分の領域に00hが書き込まれます。5匹目と6匹目のデータは全て00hが書き込まれます。

バンク1

表4 バンク1の構造
開始アドレス 終了アドレス サイズ(byte) 内容 WRAM・HRAMの対応アドレス 備考
A000h A597h 1432 未使用    
A598h A59Dh 6 主人公の名前 D11Dh~D122h  
A59Eh ACD4h 1847 メインデータ D27Bh~D9B1h  
ACD5h AED4h 512 スプライトデータ C100h~C2FFh  
AED5h B02Ch 344 手持ちポケモンのデータ D123h~D27Ah  
B02Dh B592h 1382 現在選択中のボックスのデータ D9B2h~DF17h  
B593h B593h 1 ? FFD7h 詳細不明(タイル関連の値)
B594h B594h 1 チェックサム - A598h~B593hのチェックサム
B595h BFFFh 2667 未使用    

チェックサムは、次のようにして計算されます: 範囲内の値を1バイト単位で全て足し合わた値を256で割った余りを求める。その値をビット反転した値がチェックサムとなる。

レポートに書き込まれるWRAMのアドレスを昇順に並べると、次のようになります: C100h~C2FFh、D11Dh~DF17h
(すなわち、アドレスC000h~C0FFh、C300h~D11Ch、DF18h~DFFFhのデータはセーブされない)

バンク2・3

表5 バンク2・3の構造
開始アドレス 終了アドレス サイズ(byte) 内容 備考
A000h A565h 1382 ボックス1・5 バンク2はボックス1、バンク3はボックス5
A566h AACBh 1382 ボックス2・6 バンク2はボックス2、バンク3はボックス6
AACCh B031h 1382 ボックス3・7 バンク2はボックス3、バンク3はボックス7
B032h B597h 1382 ボックス4・8 バンク2はボックス4、バンク3はボックス8
B598h B598h 1 チェックサム A000h~B598hのチェックサム(このアドレス自身もチェックサムの計算対象になる)
ただし、このアドレスが読み込まれることはない
B599h BFFFh 2663 未使用  

外部リンク

Save data structure (Generation I) - Bulbapedia, the community-driven Pokémon encyclopedia *1

*1:リンク先の解説は英語版を対象としており、日本語版とは構造が違う点に注意

通信なし進化(赤緑青)

以下の方法により、通信交換で進化するポケモンをレベルアップで進化させることができます。

セレクトバグを用いる方法

※この方法は、2020年11月13日のツイートを加筆・修正して記事化したものです。

用意するもの

  • いらないポケモン2匹
    • ニックネームの3文字目が「わ」であるポケモン (以下P1とする)
    • ポイントアップ0回使用・残りPPが50の技を含めて技を2つ以上覚えているポケモン (以下P2とする)
      • 残りPP50の技は一番下に置いておく。
  • 道具13種類以上
  • タマムシシティかヤマブキジムに1度でも入っておく (13番目セレクトバグを行うため)
    • 必須ではないが準備が面倒になるため入っておくことを推奨

手順

  1. P1を手持ち6番目に、P2を手持ち1番目に置く。
  2. P1に対して13番目セレクトバグを行い、そのまま逃げる。
  3. 手持ち道具の一番下でセレクトBB。
  4. 野生のポケモンとエンカウントする。
  5. たたかうを選び、残りPP50の技でセレクト、そのまま逃げる。
  6. P1に対して再度13番目セレクトバグを行い、そのまま逃げる。
  7. これ以降電源を切るかリセットするまで、通信交換で進化するポケモンがレベルアップ(戦闘・ふしぎなアメどちらでも可)で進化するようになる。

備考

  • 通信なし進化ができる状態では、通常のレベルアップ進化・石進化はできない。石進化の場合、ポケモン一覧では「つかえる」と表示されるが、使っても「つかっても こうかが ないよ」と表示される。
  • 通信交換で進化するポケモンがレベルアップで進化するとき、Bボタンによる進化キャンセルは可能。
  • 手順3で手持ち道具欄を一番下までスクロールさせているときにスクロールが止まった場合は、Bボタンを一度押す。このとき手持ち道具欄が閉じられた場合は、一番下までスクロールできているので、再度手持ち道具欄を開いてセレクトBBをすればいい。
  • 手順5~7の間にトレーナーに見つかると、ドッペルゲンガーが勝負を仕掛けてきてフリーズすることがある[1][2]。
  • 手順5を行ったときに入れ替わる技は、手持ち6番目のバグっているポケモンの1番目の技(D343h)。
  • 進化させたあとにマップのグラフィックがバグった場合は、メニューから主人公の情報を見ると治る。

名前の長いバグわざを利用する方法 (Super Glitchを利用するもの)

※この方法は、juninさんによるものです。

文献: 上から順に[3][4]

備考

この方法で通信なし進化をしてからレポートを書くときは、レポートを書く前に必ずポケモンセンターの受付に話しかけ、「あずける/やめる」の選択肢を表示させること(回復する必要はない)。これを行わなかった場合、レポートを書く際にバグ選択肢が表示されてフリーズすることがある。

解説

文献: [5]

具体的には、アドレスD0F0hの値が32hのとき、通信なし進化ができるようになります[6]。セレクトバグを用いた方法は、戦闘中の自分のポケモンの221番目の残りPPがアドレスD0F0hに対応していることを利用しています。名前の長いバグわざを用いた方法は、技名バッファとなるアドレスD0BEhから数えて51文字目がアドレスD0F0hに対応していることを利用しています。

参考文献

[1] ROTF、D0F0の挙動 | ROTFの覚え書き、https://rollingonthefloor.blog.fc2.com/blog-entry-174.html、2022年7月13日閲覧。

[2] ROTF、『名前の長いバグわざ』について | ROTFの覚え書き、https://blog-imgs-111-origin.fc2.com/r/o/l/rollingonthefloor/20190516082325823.html、2022年7月13日閲覧。

[3] junin、Twitterhttps://twitter.com/junin_x10/status/1327899855671312385、2022年7月12日閲覧。

[4] junin、Twitterhttps://twitter.com/junin_x10/status/1329007295527677952、2022年7月12日閲覧。

[5] junin、Twitterhttps://twitter.com/junin_x10/status/1327637221273264128、2022年7月12日閲覧。

[6] 【GB/VC】ポケモン 赤緑青ピカチュウ 36【初代】 [無断転載禁止]©2ch.net | 5ちゃんねる、https://tamae.5ch.net/test/read.cgi/poke/1485481078/626、2022年7月18日閲覧*1

付録

ポイントアップ0回使用・残りPP50の技を用意する方法

この技を用意する方法はいくつかありますが、最大PPが50~63の安全なバグ技を用意するのが楽だと思います。以下にその方法を示します。

用意するもの
  • 道具9種類以上
  • 以下の条件を満たすいらないポケモン(以下Aとする)
    • 経験値を256で割ったあまりが207(赤緑)・212(青)である
    • こうげきの実数値を256で割ったあまりが63以下
手順
  1. Aを手持ち1番目に置く。
  2. 道具の9番目でセレクトBB。
  3. 野生のポケモンとエンカウントし、たたかう→いらない技でセレクト、セレクト後はそのまま逃げる。
  4. Aがわざマシン07(赤緑)・わざマシン12(青)を覚えており、その技の最大PPが53(赤緑)・50(青)であることを確認する。
  5. Aをポケモンセンターで回復させる。
  6. (赤緑のみ)戦闘でわざマシン07を3回だけ使う。

更新履歴

2022/07/22 公開

2022/07/28 名前の長いバグ技を利用した方法に備考(注意事項)を追記

2022/08/02

  • セレクトバグを用いる方法に、元ツイートへのリンクを追加
  • セレクトバグを用いる方法に、道具を13種類以上用意することを追記
  • 付録としてポイントアップ0回使用・残りPP50の技を用意する方法を追記

*1:通信なし進化の流れは611~632あたり

13番目セレクトバグでハマる原因と回避条件

ピカチュウバージョン以外の初代ポケモンには、13番目セレクトバグというどうぐ欄のやめるよりも下にスクロールすることができる裏技があります[1]。この裏技は、ある程度ストーリーを進めていないと、バグらせるポケモンを選んだときにハマりが起こります。これは入れ替えて出てくる手持ち13番目のポケモンのHPが、HPバーの長さ計算でハマる条件を満たしているためです。

※この記事を読む前に、HPバーについて(初代)の記事を見ることをおすすめします。

手持ち13番目のポケモン

そもそも手持ち13番目のポケモンとは、一体何でしょうか。初代ポケモンでは手持ちポケモンは6匹までであり、メモリ上でも6匹分だけの領域が確保されています。6匹目のデータより後ろには、手持ちポケモンとは別のデータが入っています。

13番目セレクトバグをした場合、バグらせるポケモンと手持ち13番目のポケモンのデータを入れ替える処理が行われます。前述の通り手持ち7番目以降のポケモンのデータは存在しませんが、ポケモンのデータを入れ替える処理ではそれを気にせず手持ち13番目のポケモンに相当する領域のデータと入れ替えが行われます。

メモリ上、手持ちポケモンのデータは以下のように配置されています[2][3]。

手持ちポケモンの数
D123h
手持ちポケモンの外見
D124h~D129h、1匹あたり1バイト
終端(手持ちポケモンを6匹持っているときに使用される)
D12Ah
手持ちポケモンのデータ
D12Bh~D232h、1匹あたり44バイト
手持ちポケモンの親名
D233h~D256h、1匹あたり6バイト
手持ちポケモンのニックネーム
D257h~D27Ah、1匹あたり6バイト

手持ち7番目以降のポケモンの外見・データ・親名・ニックネームの領域は、それぞれ手持ち6番目のポケモンの領域以降に続いているものとみなします。したがって、手持ち13番目のポケモンに相当するメモリ上の領域は、以下のようになります。

外見
D130h (手持ち1番目のタイプ1)
データ
D33Bh~D366h (現在いるマップの出口情報の一部、後述)
親名
D27Bh~D280h (捕まえたフラグ (図鑑No. 1~48))
ニックネーム
D29Fh~D2A4h (見つけたフラグ (図鑑No. 137~152)、手持ち道具所持数、手持ち道具1番目の種類・個数、手持ち道具2番目の種類)

冒頭で書いた通り、ハマりの原因は手持ち13番目のポケモンのHPにあります。手持ち13番目のポケモンの現在HPのアドレスはD33Ch~D33Dh、最大HPのアドレスはD35Dh~D35Ehです。このアドレスは、出口情報の一部分です。出口情報については次で説明します。

出口情報

出口情報とは、現在いるマップに存在する扉・階段・ワープパネルなどの出口について、出口ごとに座標と移動先を定めているものです*1。1つの出口情報は、出口のY座標・X座標・移動先出口番号・移動先マップ番号の4バイトで構成され、アドレスD32Eh以降に配置されます[4]。これとは別に、アドレスD32Dhに現在いるマップの出口の数が格納されます[4]。

出口情報とアドレスの対応を表1に示します。

表1 出口番号ごとの出口情報とアドレスの対応[4]
出口番号 Y座標 X座標 移動先出口番号 移動先マップ番号
0 D32Eh D32Fh D330h D331h
1 D332h D333h D334h D335h
2 D336h D337h D338h D339h
3 D33Ah D33Bh D33Ch D33Dh
中略
11 D35Ah D35Bh D35Ch D35Dh
12 D35Eh D35Fh D360h D361h
中略
31 D3AAh D3ABh D3ACh D3ADh

例えばマサラタウンにいる場合、アドレスD32Dhの値は03hとなり、D32Eh以降に配置される出口情報は表2のようになります。

表2 マサラタウンにいるときの出口情報
出口番号 Y座標 X座標 移動先出口番号 移動先マップ番号
0 05h 05h 00h 25h (主人公の家 1階)
1 05h 0Dh 00h 27h (ライバルの家)
2 0Bh 0Ch 01h 28h (オーキド研究所)

出口情報は、最初から始めたときは全領域が00hになっており、マップを切り替えたときか戦闘を終わらせたときに、現在いるマップに対応した情報に更新されます。このとき更新される出口情報は、出口番号0番から(現在いるマップの出口の数 - 1)番までで、(現在いるマップの出口の数)番目以降の情報はそのまま残ります*2。また、出口情報はレポートに記録されるので、リセットして続きから始めても初期化されることはありません。

手持ち13番目のポケモンのHPと出口情報の関係

手持ち13番目のポケモンのデータは、3番出口のX座標から14番出口のY座標に対応します。このうち、現在HPのアドレスは3番出口の移動先出口番号・移動先マップ番号、最大HPのアドレスは11番出口の移動先マップ番号・12番出口のY座標に対応します。これらのアドレスの値が変わる条件を述べます。

手持ち13番目のポケモンの現在HPが変わる条件

手持ち13番目のポケモンの現在HPは、ゲームを始めた時点では0です。現在HPは、出口が4箇所以上あるマップに入ったときに変わります。現在HPが始めて変わるタイミングは、最初にトキワシティ(5箇所)に入ったときです*3。一度トキワシティに入った後は、手持ち13番目のポケモンの現在HPが0になることはありません*4

手持ち13番目のポケモンの最大HPが変わる条件

手持ち13番目のポケモンの最大HPは、ゲームを始めた時点では0です。最大HPは、出口が12箇所以上あるマップに入ったときに変わります。出口が12箇所以上あるマップは、以下のとおりです(緑後期で確認)。

  • ヤマブキジム (32箇所)
  • タマムシシティ (13箇所)
  • サントアンヌ号 2階客室 (12箇所)

それぞれのマップに入った後の最大HPは、以下のようになります(緑後期で確認)。

ヤマブキジム
45585 (B211h)
タマムシシティ
35611 (8B1Bh)
サントアンヌ号 2階客室
上記2マップに入っていない場合: 24576 (6000h)
ヤマブキジム→客室の順で入った場合: 24593 (6011h)
タマムシシティ→客室の順で入った場合: 24603 (601Bh)

13番目セレクトバグでハマりを回避する条件

結論から先にいうと、13番目セレクトバグでハマりが起こらなくなる条件は、「タマムシシティかヤマブキジムに1度でも入る」です。以下で詳細を述べます。

ゲームを始めてからトキワシティに入るまでの間は、手持ち13番目のポケモンの最大HP・現在HPはともに0であるため、この時点では13番目セレクトバグを行ってもハマることはありません。しかし、この時点で道具を13種類以上持つことは不可能であるため、そもそも13番目セレクトバグはできません。

トキワシティに入ってから出口が12箇所以上あるマップに入るまでの間は、手持ち13番目のポケモンの最大HPは0・現在HPは0でない値となり、HPバーの長さ計算でハマる条件を満たしているためハマりが起こります。出口が12箇所以上あるマップのうちサントアンヌ号 2階客室だけ入った場合、最大HPは24576となります。これは1024の倍数であるため、同様にハマりが起こります。

タマムシシティかヤマブキジムに1度でも入った場合、最大HPは45585・35611・24593・24603のいずれかとなります。これらは1024で割ったあまりが4以上であるため、HPバーの長さ計算でハマる条件を満たさずハマりは起こりません。

別の回避方法として、バグらせるポケモンを外見がアネ゛デパミ゛ポケモンより下に置いて13番目セレクトバグを行うという方法があります[5]。この場合はカギカッコ内の条件を満たす必要はありません。

参考文献

[1] ありす*、13番目セレクトバグ---鞄は13で出来ている。アンリミテッドアイテムワークス--- - Wonderland Seeker、https://alice-wreath.hatenablog.com/entry/2019/11/14/114946、2022年6月14日閲覧。

[2] ゴールド、レポートデータ | POKeMON Bug HiSTORiA、http://pokemon.s20.xrea.com/bug/1st/memory.html、2022年6月16日閲覧。

[3] れんだ、D120からDFFFまでを表したCの構造体 | 8D A7 87 93 19 07 50、https://www.msmrrenda.net/~renda/select/memory_struct.h、2022年6月16日閲覧。

[4] 2P、利用者:2P/第一世代のワープバグ - ポケモンWiki

https://wiki.ポケモン.com/wiki/%E5%88%A9%E7%94%A8%E8%80%85:%EF%BC%92%EF%BC%B0/%E7%AC%AC%E4%B8%80%E4%B8%96%E4%BB%A3%E3%81%AE%E3%83%AF%E3%83%BC%E3%83%97%E3%83%90%E3%82%B0、2022年6月20日閲覧。

[5] れんだ、シュレディンガーのゼロ除算 - タマムシ未到着で道具欄拡張 | 8D A7 87 93 19 07 50、http://www.msmrrenda.net/~renda/select/07_schroedinger.html、2022年6月22日閲覧。

*1:ただし、ふたごじまなどに存在する落とし穴やポケモン屋敷に存在する上から飛び降りるマスは含みません。

*2:出口が1つもないマップに移動したときは、出口の数だけ更新されます。

*3:マサラタウンマサラタウンの建物(4マップ)は出口が3箇所以下、1番道路は出口なし

*4:マサラタウンの0番出口につながるのは主人公の家 1階のみだが、移動先出口番号はFFhとなっている。

HPバーについて(初代)

この記事では、初代ポケモンにおけるHPバーの長さ・色・ピンチ音について説明します。

HPバーの長さ

現在HPが 0 の場合は HPバーの長さ = 0 で、以下の計算は行わない。現在HPが 1 以上の場合、HPバーの長さ = (X / Y) を 256 で割った余り。ただし、 計算結果が 0 となった場合は 1 とする。なお、小数点以下は出るたびに切り捨てる(これ以降も同様)。

X と Y の値は以下の通り。

最大HPが 256 未満のとき:

  • X = 現在HP * 48
  • Y = 最大HP

最大HPが 256 以上のとき:

  • X = 現在HP * 48、その後下位 2 バイトを 4 で割る
  • Y = (最大HP / 4) を 256 で割った余り

最大HPが 256 以上のときの X の値について、例を示します。

現在HPが 200 のとき
現在HP * 48 の値は 9600 (2580h)、下位 2 バイトを 4 で割った値は 2400 (960h)

現在HPが 1400 のとき
現在HP * 48 の値は 67200 (10680h)、下位 2 バイトを 4 で割った値は 65952 (101A0h)

ハマりが起こるケース

Y が 0 となった場合、ゼロ除算によるハマりが起こります。ハマりが起こる条件(すなわち、Y が 0 となる条件)は、現在HPが 1 以上で、最大HPが以下のどちらかの条件を満たすときです。

  • 最大HPが 0
  • 最大HPが 1024 以上かつ 1024 で割った余りが 0 ~ 3

HPバーの長さが不正になるケース

以下のいずれかの条件を満たす場合、HPバーの長さは最大HPに対する現在HPの割合ではなくなります。

  • X / Y の値が 256 以上
  • 最大HPが 256 以上かつ現在HPが 1366 以上
  • 最大HP が 1028 以上

なお、ステータス計算においてHPを含む各ステータスは 999 が上限となります。そのため、現在HP・最大HPが 1000 以上となるのは、セレクトバグなどで HP の値を直接書き換えるか、そのような値を持ったポケモン(に相当するデータ)と入れ替える場合に限られます。

HPバーの色

スーパーゲームボーイでプレイしている場合、HPバーの長さによって色が変わります。

  • 9 以下: 赤
  • 10 以上 26 以下: 黄
  • 27 以上: 緑

ピンチ音

プレイしているハードウェアによらず、戦闘中自分のポケモンのHPバーの長さが 9 以下のときにピンチ音が鳴ります。スーパーゲームボーイでプレイしている場合、HPバーの色が赤のときにピンチ音が鳴るとも言えます。