NEStinymachines

やり方

小さな道具が四つ。どれも、ほかの誰かのものに触れる前に、私たち自身のカートリッジで確かめてある。

リスティングが記録だ

カートリッジにはプログラムとその絵が入っている。リスティングはその両方を、アセンブラが受け取れるテキストとして書く: ラベル、命令、そしてコードだと分かっていないものはすべて素のバイト。学んだことは何でも、コメントの中の印として入り、どの印も誰が見つけたかを言う: コンソールが動き出すアドレスからの読み進み、ゲームの走行、規則、または人。検査は一つで、厳しい: そのファイルは、一バイトも違わずカートリッジへ組み立て直せる。何がコードかについての間違った推測は、もっともらしいページとしてではなく、失敗として現れる。

形式は、道具のある場所に書いてある: github.com/tinymachines/public/blob/main/wasm/listing/FORMAT.md。

クロールが私たちの代わりにゲームを遊ぶ

カートリッジを開始アドレスから読むと、そのアドレスが導く先しか見つからない。そしてゲームの大部分は、読むだけでは追えないテーブルを通って届く。だからプログラムが遊ぶ。保存した場面から、ボタンの組み合わせを一つずつ少しの間押し、どの命令が走ったかを見て、まだ一度も走っていなかったものがあればその場面を残す。新しいものが何も走らないときは、メモリがそれまで持ったことのない値を取った場面を選ぶ。面は、次のルーチンが走る前に歩き通さなければならないからだ。残した場面にはどれも、そこへ届くボタン操作が付いているので、どの発見ももう一度再生できる。

これらのページの調査は、ゲームごとに 400 歩のクロールを使った。

走行が、それぞれのルーチンのしたことを語る

クロールが残した道筋はどれも、プロセッサのすべてのアクセスをコンソールが記録する状態で、もう一度再生する。そこから分かるのは、それぞれのルーチンがどこでどう入られたか、触れたメモリとハードウェア、触れたときに画面のどこをビームが走っていたか、そしてどの呼び出しが行き先をテーブルから選んだかだ。さらに、すべての値を、読み込まれた元のメモリのバイトから、ゲームが写していく先々を通して追う。だから、どのバイトが画面上の位置になり、そのうちの二つがどこで比べられ、何が位置に足し込まれ、どのバイトがジャンプのテーブルの行き先を選んだかを言える。

規則は、走ったものを読む

規則は、ルーチンをしたことで名付ける。バイトがどう見えるかでは決して名付けない。証拠が無ければ、名前も無い。どの名前にも規則が見た数が付いているので、読む人は異を唱えられる。パターンと、それぞれの見分け方。

モデルは、読み戻したリスティングだ

これらのページにあるものはすべて、ゲームごとに一つのファイルから来る。そのファイルはリスティングの印を持ち、バイトは一つも持たない: 名前の付いたルーチン、テーブル、共有するメモリ、そしてプログラムのどれだけが走ったか。

バイトは私たちの機械に留まる

カートリッジは私たちのもので、私たちが持っているカートから読んだ。そのバイトは、置いてある機械から出ない: リスティングも、走行の記録も出ない。公開するのは形だ。

まだ見えないもの

  • 電源投入からの短いクロールが届くのは、大きなゲームのごく一部だ。数を動かすのは、タイトル画面の先から始める、もっと長いクロールだ。
  • ゲームがメモリへ写してそこで走らせるコードは、カートリッジのリスティングの中に居場所が無いので、入れていない。
  • ゲームが自分でスタックに置いたアドレスへ戻ることで届くルーチンは、テーブル経由のジャンプではなく、戻りとして扱う。
  • 二つの位置を比べるルーチンは名付けるが、その比較が何のためかは名付けない。二つのものが触れたかどうかの判定も、敵がプレイヤーはどちら側かを尋ねるのも、奥行きの順に並べるのも、この規則には同じに見える。

机は、あなた自身の走行にも同じことをする

作る の机で、自分のディスクにあるゲームの走行を記録し、それを読み、リスティングのウィンドウを開く。ウィンドウはそのカートリッジのリスティングをあなたのブラウザの中で書き、これらのページが見せるものを見せる。どこにも何も送られない。