1 of 28

Super Mario World

11Exit Glitchless

“Intended” RAMの謎

Twitter: @yuniruyuni

Twitch: yuniruyuni

Youtube: link

Virtual Techlead

Author:

2 of 28

注意:

  • プログラム解析観点からのルールの存在理由の解釈です
  • ルールの良し悪し等は特に語っていません
  • 実際のルール運用はモデレータさんに従ってください

3 of 28

“Intended” RAM Areaって何?

4 of 28

11 Exit Glitchlessとは

  • スーパーマリオワールドのRTAカテゴリの1つ。
  • 11個のステージをクリア(Exit)して攻略するから11Exit。
  • バグ技(Glitch)を禁止しているカテゴリなので「Glitchless」
  • ただしこの「バグ技」とはなにかを定義するのが難しい
    • 簡単な指定方法だと新しく発見できてしまったりしそう。
    • 一方でやりすぎるとチャート改善の余地が無くなりそう。
  • → かなり練られたルールになっている。
  • そのルールにコードを知らないとよくわからない文言がある。

5 of 28

11 Exit Glitchlessルールの引用

More specifically, no letting the instruction pointer hit anywhere but ROM,

open bus, and the intended RAM area($7F8000-$7F8182),

and no modifying the intended RAM area.

6 of 28

私によるルールの意訳

  • インストラクションポインタは、
    • ROM
    • OpenBus
    • 「指定された」RAM領域($7F8000-$7F8182)
  • だけを指す。
  • また「指定された」RAM領域は書き換えてはならない。

7 of 28

これじゃまだ訳されてない?

8 of 28

単語の意味

  • ROM
    • 読み込みだけができるデータの入れ物
    • 書き換えることが出来ない。
  • RAM
    • 書き換えることができるデータの入れ物
  • OpenBus
    • (コレは説明が難しい + 今回はあまり関係ないのでskip)
  • インストラクションポインタ / 別名: プログラムカウンタ
    • 次ページへ

9 of 28

インストラクションポインタ(IP)

  • CPU(スーパーファミコン自体)が認識する�「実行する命令はどこにありますか?」�の情報が入ったデータ領域。
  • SFCのCPU的に正式な用語では「プログラムカウンタ(PC)」
  • これは普通はプログラムの入ったROMの中を指示する。
    • RAMは普通ゲームの状態の情報を保存する
    • ……ので指示されると、命令以外が書いてある
      • →IPを差し替えても単におかしくなるだけ。
  • だけど「命令を書き込む + IPを指示する」となんでもできる
    • これがGlitch(任意コード実行)の大まかな仕組み

10 of 28

IP(PC)を制限する理由

11 of 28

IP(PC)を制限する意味は?

  • ROMの中であれば書き換え出来ない
    • ということは破壊的なコードを入れる余地もない
  • IPがROMを指すかぎりは変更されていないプログラムが動く
    • → コレはほとんど 「正しい」プログラムといえる
  • ということは、Glitchのために必要ななんやかんやができない
  • これならなんやかんやに耐性ができて安心です…!

12 of 28

(あらめて)私によるルールの意訳

  • インストラクションポインタは、
    • ROM
    • OpenBus
    • 「指定された」RAM領域($7F8000-$7F8182)
  • だけを指す。 (← 指さない”ではない)
  • また「指定された」RAM領域は書き換えてはならない。

13 of 28

(あらめて)私によるルールの意訳

なぜわざわざ危ない橋渡るの?!

  • インストラクションポインタは、
    • ROM
    • OpenBus
    • 「指定された」RAM領域($7F8000-$7F8182)
  • だけを指す。 (← “指さない”ではない)
  • また「指定された」RAM領域は書き換えてはならない。

14 of 28

理由を解析してみた

15 of 28

画像を出すのに使っているOAM領域

  • スプライトを出すのに使うOAM領域というものがある
  • 画面を動かす上でOAMのクリアという作業が毎フレーム必要
    • → 画面外に敵などの画像を一旦消す作業です
  • スプライトはたくさんあるのでスプライト数分のループが必要
    • → ところがこれは普通にするとコストが高い
  • そこで当時のプログラマは「命令の羅列をRAMに準備」した
    • → 起動時の処理で命令」をRAMに書き込む
    • → この書き込まれた命令の領域を使って処理している

16 of 28

ブートストラップコード

17 of 28

ブートストラップコード

18 of 28

ブートストラップコード

19 of 28

出来上がったRAM領域

これを「実行」?

20 of 28

同じRAM領域をアセンブリとして再解釈

確かに命令列!

21 of 28

ほかのRAM領域は?

22 of 28

他のRAM領域はどうなの?

  • スーパーマリオワールド本体が他のRAMを実行してないの?
    • これ以外の領域でも使ってるなら片手落ち
  • でもどうやって確認しよう?
    • → Execution Memory Breakpoint

23 of 28

ExecutionMemoryBreakpointを使う

IP(PC)がこのアドレスに

入ったら実行中断する機能

“intended”ではない

RAM領域の全体を指定

24 of 28

この状態で最後まで走れます。

この状態で

11Exit Glitchlessを

最後まで走れたよ!

25 of 28

→他のRAMは(命令として)使ってない!

  =問題になるのは該当の領域だけ

  =ルールにして問題なさそう。

26 of 28

応用できそう?

  • intended領域の「変更」だけが禁止されてる。
    • → もし上手く「スタート前に」書き込めれば……?!
    • (多分ルールの意義的に、これは単にNG扱いかも)
  • ROMの「実行」とRAMの「書き込み」はOK
    • → じゃあReturn-Oriented Programingできれば?
    • (とはいえ、どうやって必要なstackを積むのか?)
  • → やっぱり11Exit Glitchlessで任意コード実行はダメそう
  • (なので色々無理。→このスライドはただの豆知識カモ。)

27 of 28

注意:

  • プログラム解析観点からのルールの存在理由の解釈です
  • ルールの良し悪し等は特に語っていません
  • 実際のルール運用はモデレータさんに従ってください

28 of 28

Twitter: @yuniruyuni

Twitch: yuniruyuni

Youtube: link

Virtual Techlead

Author:

最後に宣伝

  • 個人VTuberの です!
  • TwitchではSuperMarioWorld RTAを走っています!(11Exit)
  • Youtubeではプログラミング言語作りなどを配信しています!
  • よかったらフォローお願いします……!