← [ FRONT / 辺境部 ] に戻る
OBSERVATION · 其の5666 · 2026.07.04

番外編 続 (1/2): マリオを好きな面から始めて、8-4の先へ

番外編 続 (1/2): マリオを好きな面から始めて、8-4の先へ — マリオ, 256W, RAM書き換え

技術部の御供餅(おそなえ)です。

この 256W の“おまけ”、もともとは辺境部の企画でしたが、少し技術的な掘り下げをしたいと思います。

本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。

前の番外編(前後編)では、256W を nesemu で全面踏破して、壊れた地形を眺めて回りました。今回はその続きで、好きな面をブラウザから選んで遊べる録画ページを作り、ついでに 256 面を 全部きっちり数え直した話です。

3バイトで、どの面にも飛べる

nesemu を通じてコードを解析したところ、マリオがいま何面にいるかは、RAM のたった3バイトで決まっています。

  • $075F … ワールド番号
  • $075C … ステージ番号(ステージ表示、1-1などの「◯-△」の △)
  • $0760 … エリア番号(地形データのインデックス)

改造した nesemu(コアには触れず app 層だけ)に、小さな状態機械を仕込みました。タイトル画面で Start を自動連打 → 面がロードされる直前のプリレベル画面で、この3バイトを毎フレーム目標値で上書きし続ける。面が動き出したら手を離す。あとはブラウザに World×Stage の選択盤を置いて、タップしたら reset() してその面へ再ワープ。録画は既存のタブ録画をそのまま使う。「好きな面を選んで、遊んで、録る」が完成です。

なぜ 8-4 の先に“面”があるのか(数字で)

面データは AreaPointer = AreaAddrOffsets[ WorldAddrOffsets[World] + Area ] という固定の計算で引かれます。WorldNumber は1バイト=0〜255(256ワールド)取れるのに、正規の対応表 WorldAddrOffsets は8個しかない。ワールド9以降は結果的にこの表のを読み、そこにあった別のデータを面として読み込んでしまう。

AreaPointer は1バイトの中に 上位ビット=型(水中/地上/地下/城)下位ビット=地形 が同居しています。ここがズレると、本物の地形が“別の型”で読まれる——地上の面が水中になり、城のBGMが鳴る。前回「タイルセット錯誤系」と呼んだ現象は、この型ビットの取り違えでした。

256面、全部数え直した

256ワールド(各1面)を実ROMで自動巡回して分類しました。

分類 割合
本物の面の完全コピー 49 19.1%
本物地形の“型/パレット違い”変種 205 80.1%
CPU暴走でプレイ不可能 2 0.8%

型(見た目)の内訳も出ました。約27%が水中扱いです。

割合
水中(海) 70 27.3%
地上 143 55.9%
地下 23 9.0%
20 7.8%

つまり 256 面の正体は、大半が「本物の面の海バージョン・城バージョン」で、丸コピーが2割、CPUを本気で壊す“純粋なバグ”は数%以下。前回「壊れかたにタイプがある」と眺めていたものを、数にするとこうなります。混沌に少しだけ秩序が見えてきます。

余談 —— 多くのバグ面で、右に数秒歩いたところで、プログラムが自分の居場所(PC)を見失います。有名な9-1も、高確率で途中で暴走し、画面が止まりBGMは奇妙な止まり方をします。夜の雰囲気、妖しいネオンライトのようなパレットが不気味さを演出します。有名な「−1面(実体は36-1)」も、正体は 7-2 の水中データそのものですが、ゴールにつながるはず土管がスタート地点にループし、やがてタイムアウトを迎えるという不条理な展開。実機での到達の難しさも手伝い、その魅力が増してます。

自分でも、好きな面を出せる

この選択盤の遊べる公開版として、ブラウザで動く実験ページ「ファミコン実験室」を用意しました。手元のカセットから吸い出した ROM を読み込ませれば、同じ要領で 256W の好きな面を出して遊べます(マリオでも、女神転生でも)。インストール不要で、ROM はあなたの端末の外に出ません。

ファミコン実験室 | サイバーニュータウン

次回

続編の後編では、この完全コピー49件のコピー元まで特定した「どのワールドがどの正規面のコピーか」の対応表を出します。前回「62-1 と 131-1 と 240-1 は同じ面」と気づいたところの、全体版です。

en.wikipedia.orgMinus World – Wikipediaen.wikipedia.org GistA Comprehensive Super Mario Bros. Disassembly A Comprehensive Super Mario Bros. Disassembly . GitHub Gist: instantly share code, notes, and snippets.gist.github.com

原典:スーパーマリオブラザーズ(ファミリーコンピュータ/1985年)© 1985 NINTENDO ── 掲載した画面写真・動画は、上記作品を実ROMで動作させて撮影したものです(技術解説のための引用)。原権利者の許諾・監修を受けたものではありません。

▶ 関連動画 · YOUTUBE
━━ 観るのを再開 ━━
前の回を読む
連載 第2回 · 番外編 (2/2): スーパーマリオ 256W お気に入り選 — ROM の崖に咲く造形
動画を観る
YouTube
次の回を読む
連載 第4回 · 番外編 続 (2/2): どのワールドがどの面のコピーか — 256W対応表
━━ 他の観測領域 ━━
TECH · 技術部
GNM Head 導入記 ── 地形の骨格を、実在しうる顔として結ぶ(3)|GNMフィット顔をSDXLでアニメアバター化する ── img2img+ControlNetと、上を向く顔を巡る3つのバグ
PHIL · 思想部
召喚をコードにする(4)|種を暦から山の伝承へ、そして「顔」そのものが答え合わせの対象になった
FRONT · 辺境部
【パレイドリア奇譚 03】人面魚 ── 金魚に描かれた顔、魚に見つけた顔