やり方
小さな道具が四つ。どれも、ほかの誰かのものに触れる前に、私たち自身のカートリッジで確かめてある。
リスティングが記録だ
カートリッジにはプログラムとその絵が入っている。リスティングはその両方を、アセンブラが受け取れるテキストとして書く: ラベル、命令、そしてコードだと分かっていないものはすべて素のバイト。学んだことは何でも、コメントの中の印として入り、どの印も誰が見つけたかを言う: コンソールが動き出すアドレスからの読み進み、ゲームの走行、規則、または人。検査は一つで、厳しい: そのファイルは、一バイトも違わずカートリッジへ組み立て直せる。何がコードかについての間違った推測は、もっともらしいページとしてではなく、失敗として現れる。
形式は、道具のある場所に書いてある: github.com/tinymachines/public/blob/main/wasm/listing/FORMAT.md。
クロールが私たちの代わりにゲームを遊ぶ
カートリッジを開始アドレスから読むと、そのアドレスが導く先しか見つからない。そしてゲームの大部分は、読むだけでは追えないテーブルを通って届く。だからプログラムが遊ぶ。保存した場面から、ボタンの組み合わせを一つずつ少しの間押し、どの命令が走ったかを見て、まだ一度も走っていなかったものがあればその場面を残す。新しいものが何も走らないときは、メモリがそれまで持ったことのない値を取った場面を選ぶ。面は、次のルーチンが走る前に歩き通さなければならないからだ。残した場面にはどれも、そこへ届くボタン操作が付いているので、どの発見ももう一度再生できる。
これらのページの調査は、ゲームごとに 400 歩のクロールを使った。
走行が、それぞれのルーチンのしたことを語る
クロールが残した道筋はどれも、プロセッサのすべてのアクセスをコンソールが記録する状態で、もう一度再生する。そこから分かるのは、それぞれのルーチンがどこでどう入られたか、触れたメモリとハードウェア、触れたときに画面のどこをビームが走っていたか、そしてどの呼び出しが行き先をテーブルから選んだかだ。さらに、すべての値を、読み込まれた元のメモリのバイトから、ゲームが写していく先々を通して追う。だから、どのバイトが画面上の位置になり、そのうちの二つがどこで比べられ、何が位置に足し込まれ、どのバイトがジャンプのテーブルの行き先を選んだかを言える。
規則は、走ったものを読む
規則は、ルーチンをしたことで名付ける。バイトがどう見えるかでは決して名付けない。証拠が無ければ、名前も無い。どの名前にも規則が見た数が付いているので、読む人は異を唱えられる。パターンと、それぞれの見分け方。
モデルは、読み戻したリスティングだ
これらのページにあるものはすべて、ゲームごとに一つのファイルから来る。そのファイルはリスティングの印を持ち、バイトは一つも持たない: 名前の付いたルーチン、テーブル、共有するメモリ、そしてプログラムのどれだけが走ったか。
バイトは私たちの機械に留まる
カートリッジは私たちのもので、私たちが持っているカートから読んだ。そのバイトは、置いてある機械から出ない: リスティングも、走行の記録も出ない。公開するのは形だ。
まだ見えないもの
- 電源投入からの短いクロールが届くのは、大きなゲームのごく一部だ。数を動かすのは、タイトル画面の先から始める、もっと長いクロールだ。
- ゲームがメモリへ写してそこで走らせるコードは、カートリッジのリスティングの中に居場所が無いので、入れていない。
- ゲームが自分でスタックに置いたアドレスへ戻ることで届くルーチンは、テーブル経由のジャンプではなく、戻りとして扱う。
- 二つの位置を比べるルーチンは名付けるが、その比較が何のためかは名付けない。二つのものが触れたかどうかの判定も、敵がプレイヤーはどちら側かを尋ねるのも、奥行きの順に並べるのも、この規則には同じに見える。
机は、あなた自身の走行にも同じことをする
作る の机で、自分のディスクにあるゲームの走行を記録し、それを読み、リスティングのウィンドウを開く。ウィンドウはそのカートリッジのリスティングをあなたのブラウザの中で書き、これらのページが見せるものを見せる。どこにも何も送られない。