ベンチ
機械だけで届くマイルストーンはすべて終わった。だから模型が実機についてまだ知らないことはベンチを待っていて、次に組むのはそのベンチだ。コンソールのコントローラポートと純正パッドの間にブリッジを置く。ブリッジ上のシフトレジスタが、コンソールの読むパッドそのものになる。マイクロコントローラはポーリングの合間にボタンを書き込み、コンソールのラッチとクロックのパルスをハードウェアで数える。ネットワーク上の Raspberry Pi がスクリプトを受け取り、リセットと電源のリレーを駆動し、スコープをトリガする。スクリプトはポーリング番号ごとのボタンのバイトの列なので、模型と実機はまったく同じ入力を見る。ブリッジも模型もポーリングごとにログを取り、その二つをポーリング単位で突き合わせる。トリガした取り込みは、絵のマイルストーンが往復を採点したのと同じやり方で採点する。計画はファームウェアより先に四つのマイルストーンとその検査を名指しし、最初の一つ、コントローラポートの盗み聞きは、すでに模型を変えた。DMC のフェッチがパッドの読み出しに何をするかを問うと、スイッチレベルの 2A03 が実物より先に答え、コアと高速チップとコンソールがそれに合わせて変わった。どの変更も、それがなければ赤になるテストが守っている。いまや各マイルストーンの道具はハードウェアより先に揃っている: スクリプトをブリッジとリレーとスコープに流すヘッドから、実機と模型が食い違う最初のポーリングを探し出す仕組みまで。どれも代役に対して試し、わざと壊した走行が赤になることを確かめてある。下の図は配線表からスクリプトが生成したもので、表と食い違うことはできない。計画、配線、スクリプト、進行中の報告はノートブックに、リポジトリは github.com/tinymachines/nes-bench。
部品は机の上にあり、次は配線だ。組み立ては五回の作業として書き出してあり、一回につきコマンドは一つ。そこから返ってくるのがラボノートである。実際に組み上がっていく過程そのものだ: 十四のステップ、各ステップは意見ではなく測定で終わり、失敗した試行も含めてすべての試行を残し、各段階で写真を撮る。うち二つのステップは、このサイトがいま見積もりとしている数字を実測に置き換える: パッド自身のポートにスコープを当てて、上のタイミング図が推測しているだけのラッチとクロックのパルス幅を測り、接続したブリッジが、本当にすべてのポーリングが八クロックを運ぶのかに答える。ノートは組み立てを進める道具から生成されるので、何ひとつ手で書き込まれていない。そしてサイトは、自身のログが裏づけないノートの公開を拒む。同じ組み立ては印刷用の図面パッケージにもなっている: 横置きレターの枠付き図面で、各葉に表題欄と図番と改訂欄があり、その寸法では読めなくなる二葉だけは縮めずに大きな用紙を求めている。収めてあるのは回路図、どの部品とどのジャンパがどの穴に入るかを示すブレッドボード配置図、部品表、配線表である。この配置図で選択なのは部品の置き場所だけで、線はすべて回路図から読み出されている。だから図面にない接続を絵が示すことはできない。ブレッドボードではなく基板を欲しがるのは二ポート版のほうで、こちらには独自のパッケージがある: 回路図は四葉。部品十一点と四十二本のネットは、誰かが印刷できる一枚には収まらないからだ。その基板は配線済みである。両面、裏にグラウンド、表に電源を敷き、配線そのものは記録されたファイルで、ビルドはそれを適用するだけだ。誰かが毎回やり直す工程ではない。全ネットがつながっているか、別ネットの銅が近すぎないかは、完成した基板に対して問う。ルータ自身の報告は採らない。最初に走らせた時、ルータは基板が完成したと言いながら、三つのパッドには銅の経路がまったく無かったからだ。
ベンチの計画
ベンチは実機と模型を同じコントローラ入力の下に置く。以下は先に書かれたもの。
ベンチを組む
図面の上のブリッジと、組み上がったブリッジ: 回路図、部品、ピンごとの早見表、組み立てガイド。
- ブリッジの回路図と部品: 回路図としてのブリッジ (v1 と v1b)、拡張したブリッジ (v2)、タイミングの帯として描いたコントローラのポーリング一回、電話のパッドとしての純正パッド。部品表と組み立ての順序。
- Arduino UNO の上の v1b ブリッジ: 最初に作る版、すべて 5 ボルト: レベルシフタが消える理由、ピンの表、そしてファームウェアを書いて見えた、計画が間違えていた四つのこと。
- 組み立ての手引き、五回の作業で: ピンごとに何を配線するか、それからコマンドが何を測るか、どの写真を撮るか、そして各回がどこまで進んでいるか。組み立てを進める道具から生成される。
- ベンチの部品表: 回路図のシートごとに一つの表と、集めるものすべての一覧。回路図を描くファイルから生成するので、二つが食い違うことはない。
- ベンチの早見表: 二つのブレークアウトをピンごとに、ハーネスの色付きで。四本のジャンパ、そしてすべてのチップのすべてのピンを、何をするかとどこへ行くか付きで。回路図と実験ログから生成される。
- ヘッドの手の早見表: v1b パッケージの三枚目のシートを表にしたもの: ヘッダの位置で並べた Pi の四本のジャンパ、電源とリセットのブレイクアウト、全配線、そして PC817 とリレーのモジュールの各ピンが何をしてどこへ行くか。回路図から生成。
- 組み上がった v1b 基板: 写真から読み取ったもの: チップがどこに座りどちらを向いているか、レール、UNO のリボン、そしてジャンパを短く保つためにヘッダをどこへ動かすべきか。
- QA の装置: フレームに載ったカメラとボードを、インチと画素で: 各カメラの役目、取り付け、スケール、下敷き板とブレッドボードの寸法、写真で見るベンチ、そして何かが動いたときに走らせるもの。
- 純正パッドを USB か Bluetooth のキーボードに: 単体のアダプタ。組むために描き、そして組んだ: 部品はそのシルクから読み、ヘッダは測り、図面、組み立てが二度向きを変えた理由 (C6 が書き込みを受け付けず P4 モジュールへ、それからモジュールの無線リンクが落ちて Bluetooth から USB へ)、そして純正パッドのすべてのボタンが USB 越しに Linux のホストへ届いたこと。
- ボタンからキー入力まで、層ごとに: パッドが USB キーボードであるとき、純正パッドと電話の間を何が行き来するか: パッドのシフトレジスタ、キーのレポートとしてのバイト、ホストにその読み方を教えるディスクリプタ、USB そのもの、それからブラウザの keydown。ブートキーボードではない理由と、一層ずつ確かめる七段階の計画、七段階すべてが通った、最後は電話の上で。
- どの ESP32 がどの仕事をするか: Espressif のどのチップが Bluetooth のキーボードになれ、どれが USB のキーボードになれ、どれが両方か。八つについて、記憶ではなくベンダ自身のヘッダから読んだもの。パッドを P4 モジュールへ移した比較。
- 手持ちの山にあるもの: 新しい計画のために手元にある機材を、写真から読み取ったもの: ESP32 の基板、フォトカプラの基板、HP-16C の電卓。それぞれについて、部品から読み取ったもの、部品の系列の資料から来るもの、そして合う仕事。
ベンチで起きたこと
写真つきで一歩ずつ進んだ組み立てと、各道具が示したことの経過報告。
- リグが固まり、ブリッジが正しく読めた: ベンチでの三日間: v1b のブリッジがコンソールへバイトを渡し、その一つ残らずを読み返し、トリガがスコープを止め、カメラは枠に載った。計画が間違えていたこと、目には見えないこと、そして次にすること。
- ベンチの道具が示したこと: どの道具も合成の走行で動き、どれにも赤にならなければならない妨害の走行が付く。実機のコンソールより先にチップが最初の問いに答え、模型はそれに合わせて変わった。
- 実験ノート: ベンチを一歩ずつ配線する。失敗も含めてすべての試行を残し、どのステップも実測で終わる。組み立ての道具のログから生成。
- まだ開いているもの: 道すがら気づいて、まだ終わっていないものすべて: 較正カートの実機側、模型の色相がコンソールのものと違う箇所、グラバー、ベンチ、カートリッジのリーダー。それぞれに、なぜ大事かと何が閉じるかを添えて。
ベンチでの実験
実機の絵と模型の絵の比較、そして両者が同じバイトを走らせるために模型が備えたカートリッジ。
- オシロスコープの使い方、ソフトウェア開発者のために: 配線のためのデバッガとしてのスコープを、本物の故障で教える: カチカチ鳴っているのにファームウェアが何も数えなかったガイガーカウンター。グラウンドクリップ、ブレークポイントとしてのトリガ、信号の連鎖の二分探索、SCPI でスコープをスクリプトから操ること、そして計器そのものが間違えたいくつものやり方。
- 目 対 スコープ: コンソールの映像をスコープと USB のグラバーに分け、グラバーを動かすまでの経過、そしてグラバーの絵をスコープの記録の自前の復号に照らして採点する。
- 模型の中の実物のカートリッジ: リーダーが違うゲームを推測した理由、検証済みのダンプ、そして絵の比較のために同じバイトを両側で走らせられるよう模型が生やしたマッパー 66 の基板。
- 机の上のカートリッジには、どれも基板がある: 模型が備えた七つのカートリッジ基板、コンソールがなければ試せなかった二つ、割り込みが線になって初めて成立した画面の分割、そして 20 本目のダンプ。それはマルチカートの最初のバンクを単独で読んだものだ。
ベンチを鍛える
両方のスタックを一段ずつ厳しく動かす体制と、それが自動化に教える言葉: 実機に合わせた模型、パッドから学ぶゲーム、ゲームのコードのレントゲン。
- ベンチを運動させる: 二つのスタックを一枚の論理図に、どの流れにも型を付けて。層ごとの方言、それぞれにゲートを持つ六段の課程、そしてその上に乗る三つの取り組み: 実機で実測する模型のノブ、パッドから絵まで学び取るゲーム、そしてコードのパターンの百科事典を支える X 線。
- Super Mario Bros. を一面ずつ、実機の上で: ベンチが本物のコンソールで、電源投入から Super Mario Bros. を遊ぶ。1-1 から一面ずつ、模型の上で見つけたボタンの押し方の一本のスケジュールで: それぞれの面をどう探し、どう通しで再生し、どう実機で遊んだか、数字だけから描いた面ごとの図、そしてそれぞれが教えたこと。
- コードの模様の百科: 透視が積み上がって何になるか: NES のコードの模様ごとに、模型で実測したシグネチャ、ダイのページの窓、そしてそれが教える仕組み。コードは、ソースが私たちのものであるカートリッジからだけ
- Super Mario Bros. を解剖する: 模型の上で分解した最初のゲーム: 割り込みの中のループ、走査線ごとのフレーム、ジャンプエンジンを通るルーチンの木、VRAM のパイプライン、そしてジャンプへ向かうパッドのバイト。形だけで、コードは決して出さない