ピロ彦の何か置き場

【TAS】 スーパーマリオワールド "glitched" in 01:39.74 について。

Masterjunさんによって制作された、クレジット呼び出しバグによるクリアTASの解説を少しだけ書こうと思います。足りないところは http://tasvideos.org/3957S.html を読むべし。
解説の大部分はMasterjun氏と、あんた氏によるテキストから引用してます。

・任意コード実行への道筋

以前の glitched TAS では、乗ると回転するリフト上で「無を吐く」ことでゲームが暴走することをトリガーにしていましたが、このTASではバグスプライトの#FAをトリガーとしています。
このスプライトは通常プレイでは決して登場せず、本来スプライトの挙動が記述されている領域とは異なるアドレス($0322)のコードを実行してしまいます。

・バグスプライト#FA生成

バグスプライトの#FAは、内部タイマーが動いてる『空飛ぶハテナブロック』をヨッシーの口内からしゃがんだ状態で吐き出すか、しゃがまずに吐き出してブロックを当てることで産み出されます。
このバグはスタンバグと呼ばれ、スイッチからプクプクが出たり中身の無い甲羅からハダカガメを産み出すような現象を指しています。
甲羅の場合は踏み潰した時にタイマーが起動し、それを一度口に含むことで消滅待ち状態が初期化され、中身発生待ち状態にすることができます。

・OAM
OAMとは、スプライトを画面上に描画するための状態を格納している領域です。
図は $0320 からのOAM領域を示していますが、実際には$0300から始まっています。

スプライトは、X座標・Y座標・タイル・状態の4バイトで構成され、#9~#0のスロットにはそれぞれ4×5バイトのサイズの枠が用意され、#B・#Aのスロットには特殊なスプライトしか入りません。

通常、画面に登場したスプライトは #9,#8,#7...と開いてるスロット順に格納されます。
$0322に出来るだけ近い位置のコードを途中で途切れないように実行するためには、多くのスプライトを調整しなければなりません。

・クレジットに必要なコード
クレジットに到達するためには、ゲームモード($0100)に0x18と$13C6に0x08を入れ、そして "return" する必要があります。
コードの詳細は説明しませんので、必要な方は各自 65816 Refernce 等を読むなりお願いします。
そのために必要なコードは " A9 18 8D 00 01 A9 08 8D C6 13 6B " と11バイトもあり、不自由なOAM領域だけで用意することはできません。

そこで、OAM領域にコントローラデータ領域($4218)にジャンプするコードを書くことで、ある程度自由なコードを実行することが可能になります。
そのために必要なコードは " 4C 18 42 " や " 4C 19 42 " のようになります。
コード " 4C 18 42 " を実行するには、X座標を0x4C、Y座標を0x18、タイルを0x42にセットする必要があります、タイル0x42を使うスプライトはPスイッチです。

・土管地下

物を持った状態で土管を潜るとスプライトのスロットが#0変化してしまいます。
ここではPスイッチを#2のままにしたいので、甲羅との2個持ちをすることで甲羅の方のスロットだけが#0になるようにスロット調整しています。

土管地下では#FAを生成するために、以下の手順を行なっています。
  1. ブルブルブロックを適切な位置に配置する
  2. 甲羅を踏み潰しながら食べ吐き出すことでハダカガメを出す
  3. ストックのキノコを出しつつダメージでチビになる
  4. キノコの咀嚼と同時にヨッシーの舌を出すことで舌を二度出す
  5. 1回目で甲羅を食べ、2回目でブルブルブロックを食べキャンする(ハダカガメに当たって)
  6. 右に移動してヨッシーの口内を羽の生えたハテナブロックへ変化させる
  7. 羽の生えたハテナブロック(見た目黄色甲羅)をしゃがまずに吐き出す
  8. 転がっている羽の生えたハテナブロックにブルブルブロックを当てる
以上の手順で#FAが生成されると同時にコードが実行されるので、コードが途中で途切れないように#B,#A,#0,#1,#2のスロットのスプライトの位置・状態を適切に調整しておく必要がある。
ただしY座標は毎フレーム0xF0にリセットされるために、バグスプライト#FAが格納されているスロットよりも小さいスロットのスプライトはY=0xF0として処理されてしまうので、#FAはスロット#2のPスイッチよりも小さいスロットの#1に格納されるように#9~#2までのスプライトを埋めておく必要がある。

・地上での事前調整

・コントローラデータ($4218-$421F)

Snes9xとBsnesとでここの処理が異なり、Bsnesの方が実機に近い処理が行われている。
以前のあんた氏の1-2クリアTASでは、実機と挙動が異なるSnes9xが使用されていたが、今回のTASでは正しい処理のLsnesが使用されている。

ひとつのコントローラは2バイトのデータを持ち、4つで合計8バイトのデータまでを自由に扱うことができる。
しかしながら、" A9 18 8D 00 01 A9 08 8D C6 13 6B " の11バイトには足りないので4分割入力する必要がある。
そのために最初の3バイトでコードを実行し、残り5バイトで WAI - Wait for Interrupt 命令でハードウェア割り込みがトリガされるまで待機させた後 8バイト前の $4218 ヘ飛ぶコードを書いている。