世界を動かす技術を、日本語で。

「Bad Apple」を「スーパーマリオブラザーズ」の中で演奏する

概要

  • Super Mario Bros. での 任意コード実行(ACE) を活用したTASの解説
  • RAM操作ワールドN 開始など、通常のプレイでは見られない挙動を利用
  • オブジェクトC9Open Bus現象 など、NESの内部動作を巧妙に利用
  • Bizhawk 2.9.1 を改造し、 カートリッジスワップ を再現
  • Bad Apple!!の再生、スコア最大化、最速クリアなど多様な目標達成

Super Mario Bros. TASによる任意コード実行の仕組み

  • 任意コード実行(ACE) とは、ゲーム機の プログラムカウンタ(PC)RAM領域 に誘導し、任意のバイト列を命令として実行させる技術
  • NESの命令は 6502アセンブリ で記述され、各命令が1バイトのオペコードとして格納される仕組み
  • JSRJMP 命令によりPCを任意のアドレスへジャンプ可能
  • RAMの操作PCの誘導 がACE実現の2大要素
  • ACEのために必要な条件
    • PCをRAMにジャンプさせる手段
    • RAMを任意に書き換える手段
    • 6502アセンブリの知識
    • 明確な実行目標

SMBにおける任意コード実行の実現方法

  • TASは ワールドN から開始
    • 通常プレイでは到達不可能な23番目のワールド
    • RAMアドレス$7FD を0x16に書き換え、Aボタンを押しながらスタートで到達
  • 本来は Super Mario Bros. 3 でRAMをセットアップし、カートリッジをSMBに交換する流れを再現
  • Bizhawk 2.9.1 を改造し、 カートリッジスワップ機能 を実装
  • この手法を「 Tomfoolery」と呼称し、TASの目的の一つを達成

ワールドN開始による副次的効果

  • ワールドNでは Bowser撃破時 の処理が異常動作
  • Bowserの正体を決定する ルックアップテーブル が範囲外アクセスし、 ID 0xC9 のオブジェクトが出現
  • ジャンプテーブル も範囲外を参照し、 アドレス$D007 にジャンプ
  • さらに処理が進むと、 状態遷移値 が4となり、 ジャンプ先$53AE は未割当アドレス
  • Open Bus現象 が発生し、データバス上の値(ここでは0x53)が命令として解釈される

Open Bus現象とコントローラ入力の活用

  • Open Bus では、バス上の値が命令として実行されるため、 コントローラ入力RAM値 を介して次の挙動を制御可能
  • 例えば、Aボタンのみ押下で アドレス$000A が0x80となり、以降の命令フローへ影響
  • この仕組みを利用し、 任意の6502コード をRAM上に配置して実行

TASの目標と工夫

  • 任意コード実行 による「Bad Apple!!」ミュージックビデオの再生
  • 最大スコア獲得4:53クリア など、複数の目標を同時達成
  • グラフィック最適化音声パケット化 など、NESの制約下での表現力向上
  • ASMコード によるパケット読み込み・描画・音声再生の工夫
  • エミュレータ特有の問題 (Open Busの再現性など)を回避し、 実機同期 を実現

技術的詳細と工夫点

  • グラフィック変換 :ビデオフレームをNESタイルに変換し、最適化レンダリングを実施
  • 音声再生 :コントローラ入力を音声データに変換し、DPCMや複数案で音質向上を追求
  • パケット化 :データを効率的にパケット化し、ASMで逐次処理
  • アドレス$2002 やコントローラ読み取りルーチンなど、NES特有のハードウェア挙動も活用
  • エミュレータ遅延問題 :なぜエミュレータ上で遅くなるかの分析

まとめ・特記事項

  • TAS作成手法RAM操作エミュレータ改造 など高度な技術の結集
  • Alyosha氏 による実機検証、コミュニティ協力への感謝
  • ASMコード や統計情報、TAS作成時の裏話も公開

参考・謝辞

  • ASMコード全文
  • 実行統計
  • 協力者への謝辞

(この内容は、元英文の技術解説を日本語に要約・再構成したものです。各項目は体言止めで簡潔にまとめています。ご要望に応じて、個別の技術詳細や特定セクションの深掘りも可能です。)

Hackerたちの意見

超クールだね。ペイロードの大きさってどこかに書いてある?ボタンの押し回数は?音声サンプルは「ストリーミング」なの、それとも全部NESのRAMに収まるの?

詳しい説明があるよ。音声はボタンの押しに合わせてストリーミングされてる。

TASファイル全体で約16MBかかるんだ。NESのRAMは4KBしかないのにね。音声と映像の再生中は、TASがコントローラーを通じて、1フレームあたり約500回入力してストリーミングしてる(15kHzで)。

こんにちは、これをまとめたTASerだよ。入力は580万回あったんだ。tasvideosの説明に全てのアセンブリコードを共有してるよ: https://tasvideos.org/8991S#HereSTheAsmCode 説明に書いたことをまとめると、7ビットPCM音声は約25kHzでストリーミングされてて(コントローラーから読み取って、アドレス$4011に71CPUサイクルごとに書き込んでる)、グラフィックデータをストリーミングする時は時々9kHzに落ちることもあったよ。

これって、改造したコントローラーを使って実機でもできるの?

https://www.youtube.com/watch?v=OJXxmD_Qk2o メモリの状態を設定するために改造したROMを使ってるけど、SMB3を手動でやってもできるみたいだよ。

https://www.youtube.com/watch?v=OJXxmD_Qk2o これはコンソールで動かしてる動画だけど、どうやって入力したのかはよくわからないな。

256個のセルをチェックした後、差が最も小さいセルが選ばれるんだ。これは基本的にベクトル量子化コーデックの基本的な操作で、初期のロスのある動画圧縮で人気があった理由は処理が軽いからなんだ。この用語が記事に出てこないってことは、著者が独自にこの理論を発見して再発明したってことだから、かなりすごいよね。

そういうことは直感でわかるし、オンラインで学術記事を探すよりもこっちの方が生産的だよ。

音声はただ重ねてあるだけだと思ってたけど、コントローラーを通じてストリーミングされてたんだ。めっちゃ素晴らしい音だよ、コンソールでも信じられないくらい!

同じく!「ああ、音が重なってるのか」と思ったけど、実際はそうじゃなかった。すごいね。

すごい!!!これでドゥーム動かせるかな?

ポケモンイエローの似たようなバグ技で、いろんなゲームを動かしてるすごい動画があるよ: https://youtu.be/Vjm8P8utT5g?si=8N0Xh-VOq_gqHJ4z

元の音よりも、特にベースがもっと8ビットっぽくていい感じだね。

投稿は読んだけど、これが何なのか全然わからない。データはどこから来てるの?なんで最初にSMBの一部をプレイする必要があるの?使われてるスプライトを除いて、これがSMBと何の関係があるの?この音楽ビデオを再生するだけのカスタムROMと何が違うの?こんなにデータをROMに入れられるの?これが何についてのことなのか理解するためには、いろんなコンテキストが必要な気がするけど、私には全然わからない。上の「目的」リストも役に立たないし(「1. ちょっといたずら 2. 任意のコードを実行...」)。このチャレンジの実際のパラメータは何なの?何が達成されてるのか理解するために、誰か説明してくれない?編集:返信してくれたみんな、ありがとう!これがすごい理由がわかったよ。

私の理解では、ゲームをグリッチさせてメモリにデータを注入してるんだ。今回はプロセッサの命令をね。そして、別のグリッチを使ってそのコードにジャンプして実行する。ハードウェアやROMの改造は必要なくて、ゲームのプレイ方法をすごく選んでメモリをひっくり返してるだけなんだ。この動画は手作業で作られていて、どうやってなぜそれが機能するのかを少し説明してるよ: https://www.youtube.com/watch?v=hB6eY73sLV0

スピードランナーのコミュニティがあって、ゲームをできるだけ早くクリアすることを目指してるんだ。バグを使う場合も使わない場合もあって、手動でやったり、全自動のツールを使ったりすることもある。目標は通常、ゲームをクリアすることやその一部をできるだけ早く、または徹底的に、あるいはできるだけ少ない行動で達成することに関連してる。スピードランの成果を投稿したり、他の人の成果に挑戦したりするためのオンラインフォーラムもあるよ。この場合、誰かが自動スピードランのツールを使って、SMBのバグを実行して任意のコードを実行できるようにして、Bad Appleの音楽ビデオを再生するプログラムを入力して実行したんだ。これは、ビデオを再生した成果としてスピードランとして投稿されてる。Bad Appleの音楽ビデオを作るためのカスタムカートリッジも作れるけど、これはSMBのカートリッジだけを使ってビデオを再生する方法を見せてるんだ。データはRAMに収まらなきゃいけなくて、これはトリッキーなカートリッジROMよりもずっと小さい。音楽とグラフィックデータはコントローラーの入力としてストリーミングされて、残りはRAMで処理されてる。SMBカートリッジにあるデータを使ってビデオ出力してるんだ。コントローラーの入力のビットレートが低いからだけじゃなくて、ビデオプロセッサがRAMから直接表示できないからでもあるんだ。

おそらく、彼らはコントローラーを使って、ボットやノートパソコンに接続して、コードの欠陥を高速で利用しているんだと思う(人間よりずっと速く)。それによって、ライブゲームにコードを注入しているんだ。技術をもっと理解しやすくする良い動画があるよ(最初に説明があって、最後にすごいデモがある)。 https://www.youtube.com/watch?v=PNbkv_DJ0f0 それに関する背景情報もあるよ。 https://tasvideos.org/ArbitraryCodeExecutionHowTo

古いコンソールゲームには、バグがあって、正しいボタンを正しい順番で押すだけで、好きなように再プログラムできるんだ(バグがメモリの範囲外書き込みにつながるため)。この場合は、スーパーマリオブラザーズ(SMB)が、コントローラーからの入力で「Bad Apple」をストリーミングするように再プログラムされているんだ。ストリーミングされるデータは、1秒間に何千回もボタンが押されることで入力されている。理論的には、オリジナルのSNESハードウェアとオリジナルのSMBカートリッジを使って、ボタンを十分に速く、かつ正しいタイミングで押せれば、これを実行できるかもしれない。

データはどこから来てるの? コントローラーの入力だよ、自分がSMBをプレイしているのと同じ。これ「ただ」ボタンをすごく速く、正確に押してるだけなんだ。もう少し背景を説明すると、こういうことは元々ゲームのスピードランコミュニティから生まれたんだ。一部の人たちは、ゲームの状態を完全に理解し、完璧に実行できる「完璧な」人間がゲームをプレイしたら、スピードランがどれだけ速くなるかに興味を持っていたんだ。それで、彼らはゲームを改造したり、そんなランを模倣するツールを作ったりして、ツールアシストスピードラン(TAS)が生まれたんだ。この理論的に可能なことを見せるという目標のために、TASはほぼ常に人間が使うのと同じ入力方法に制限されているんだ。TASの違いは、どうやって作成されるかにあって、外部ツールを使ってメモリ検査(例えば、RNGやプレイヤー/敵の位置/速度を観察するため)やフレームアドバンス/プログラム入力(完璧に正確で再現可能な入力のため)、セーブステート(セクションを何度も試してミスを修正したり、異なるRNGを試したりするため)を利用しているんだ。 > なんで最初にSMBの一部をプレイする必要があるの? これもTASが理論的に可能なことを見せるために関連してるんだ。だから、TASはほぼ常に「普通の」状態から始まるんだよ - ゲームの電源オン(tasvideos.orgに提出されるTASの普通のスタート状態)、普通の人間が到達できるゲーム状態(例えば、Games Done Quickのイベントでのゼルダの伝説 時のオカリナのショーケースの一つで行われたもの)など。 > 使用されるスプライト以外に、これがSMBと何の関係があるの? TASの「聖杯」の一つは、任意のコード実行(ACE)で、ゲームを操作して任意のコードを実行できる状態にすることなんだ。このTASは、コントローラーの入力だけでSMBとゲームハードウェアを操作してACEが可能な状態にできることを示しているんだ。 > これはこの音楽ビデオを再生するカスタムROMとはどう違うの? 違いは目的地ではなく、旅路にあるんだ。たとえば、コンピュータに「普通の」マルウェアをインストールするのと、同じ機能を得るためのRCEチェーンを見つけたり書いたりするのと同じようなものだね。後者は特定のコミュニティにとって、より技術的に印象的/興味深いと見なされるかもしれない。 > こんなに多くのデータをROMに収めることはできるの? この場合はそのままでは無理だね。ここではデータがストリーミングされていて、コントローラーが拡張メモリのように機能しているんだ。 > そして、最初の「目的」リストは役に立たないね(「1. ちょっとふざける 2. 任意のコードを実行する...」)。この挑戦の実際のパラメータは何なの? 何が実際に達成されているのか理解するために。tasvideos.orgに提出されたTASには、提出者が選んだ目的のリストが付いてくるんだ。同じゲームの異なるTASが異なることを目指すかもしれないからね。一つのTASは、可能な限り速くゲームをクリアしようとするかもしれないし、別のTASは、いくつかのアプローチの使用を制限しながら速くクリアしようとするかもしれない。あるTASは、速くクリアしつつ「真の」エンディングや「完全」なクリアを目指すかもしれないし、また別のTASは、速さを追求せずにエンターテイメント性を重視するかもしれない。すべての目的がtasvideos.orgによって公式に公開される価値があるとは限らないけど、確か、何が受け入れられるかについて厳密なルールはなかったと思う。この特定のTASはエイプリルフールに提出されたから、ちょっとしたおふざけも含まれているんだ。

私も!