概要
- Super Mario Bros. での 任意コード実行(ACE) を活用したTASの解説
- RAM操作 や ワールドN 開始など、通常のプレイでは見られない挙動を利用
- オブジェクトC9 や Open Bus現象 など、NESの内部動作を巧妙に利用
- Bizhawk 2.9.1 を改造し、 カートリッジスワップ を再現
- Bad Apple!!の再生、スコア最大化、最速クリアなど多様な目標達成
Super Mario Bros. TASによる任意コード実行の仕組み
- 任意コード実行(ACE) とは、ゲーム機の プログラムカウンタ(PC) を RAM領域 に誘導し、任意のバイト列を命令として実行させる技術
- NESの命令は 6502アセンブリ で記述され、各命令が1バイトのオペコードとして格納される仕組み
- JSR や JMP 命令により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コード全文
- 実行統計
- 協力者への謝辞
(この内容は、元英文の技術解説を日本語に要約・再構成したものです。各項目は体言止めで簡潔にまとめています。ご要望に応じて、個別の技術詳細や特定セクションの深掘りも可能です。)