コンソールの弧を振り返る
この弧は、それぞれ単独で証明済みだった部品からコンソール全体を組み上げることを目指した。スイッチレベルの 6502 とその上の高速ラング、スイッチレベルの 2A03 と 2C02、波形のレベルで模擬した NTSC 信号経路、そして NES-001 基板の書き下ろしの糊。弧を走らせたスケッチはノートの最初のページにあり、以下の各ページが述べる数値はコンソールのページにリポジトリ自身の走行から搭載されている。ここでは何も打ち直さない。
すべてを形作った規則
節目は二度文書になる。計画はコードの前に書かれ、検査の名と許容を述べる。報告はその後に書かれ、すべての数値が走行スタンプ付きの実測である。その間に一つの規律がある: 書き下ろす前にスイッチレベルのチップで測る、書き下ろしたものには書き下ろしと札を付ける、無ければ検査が赤になる修正だけを加える。各報告はやらなかったことの一覧を残し、次の計画はその一覧から始まる。
この規則は毎回同じ形で元を取った。高速ラングと実プログラムが食い違えば、食い違いはスイッチレベルのチップをラングに並走させて分かれるまで追うことで位置を特定し、そこで測り、書き下ろし、無ければ赤になる固定具で押さえた。チップが何をするかを誰も推論しなかった。チップに訊いた。
チップがエンジンに教えたこと
五つ目のチップは、エンジンが初版から抱えていた問いを決めた。四つのダイは、レイアウトのプルと外部駆動が争うグループを一度も作らなかった。2A03 のセットオーバーフロー鎖は電源投入時に三つ作り、そのリファレンスは低へ解決する。エンジンの順序はそれに合わせて変えられ、出荷前に他のどのチップでも観測不能であることが証明された。
PPU は自前のエンジン相違を二つ見つけ、それぞれ共有ライブラリで直され、一族全体で再証明された: レール衝突のホールドと、仮定ではなくネットリストごとに宣言されねばならない電荷規則だ。一族が電源投入時に未定義と読んでいたラッチはシリコンではなくエンジンの規則だった。規則が正しくなると、PPU の記録済み走行は例外の一覧を一切持たずに再生した。
コンソールがラングに教えたこと
高速ラングは記録済みの全トレースを正確に再生しながら、トレースが覆っていなかった見落としを抱えていた。トレースは符号化の幅しか持たないからだ。blargg のテスト ROM を実 CPU 付きでコンソール全体に通すと、それらが一つずつ見つかった: 駆動されないバス線に乗って次の命令へ渡る桁上げ、誤った捕捉から読んだシフトの桁上げ、結果がバスの取り合いでスイッチモデルが独自に決着させる三命令、割り込み入力を標本化するハーフサイクル、バスに尋ねるより遅くラッチされるバイト。APU の見落としはもう一方のチップでの同じ話だった: 書き込みの位相ジッタ、半ステップ遅れてラッチされるステータス、三サイクル立つフラグ、読み出しが着地する所で数え落とされるバイト。それぞれダイで測り、押さえた。
二つの発見は修正ではなかった。コンソールの割り込みは、それぞれ自身の実測に押さえた二つのチップが許すより約二ドット遅れて CPU に届く。文書化された挙動と実測のチップが食い違い、実基板に当てるスコープが決める。そして、高速ラングが背景色としてしか書き下ろしていなかった描画オフ時の PPU の絵は、アドレスレジスタが指すパレット項目であり、行途中の書き込みに対するタイミングは今固定具になっている。それが測られるまで、カラーバーのカートリッジは青い縞だった。
信号経路が比較に教えたこと
テレビ模型を通る絵は信号経路自身の連鎖で、コンソールが足したのは二つ、フレームの順序と一つのフレームから次へ持ち越す副搬送波の位相だ。カラーバーのカートリッジで閉じるはずだった捕捉比較は、計画が述べた許容では閉じず、報告は許容を広げる代わりにそう述べた。最初に見つかったのは計器のものだった: 復元のレベル基準合わせがヒストグラム一区画分粗く、フレーム全体の利得として現れ、暗い絵のレベルが消去期間と取り違えられ得た。どちらも信号経路自身のリポジトリで直された。残ったのは、捕捉模型の折り返し防止フィルタと符号化器の方形波の間の小さなクロマ残差で、それが何であるかという手順の問いとして記録されている。
音は逆へ行った。回路図から読んだ基板の音声段は、公表されたミキサーの表の中にすでに入っていた: 二つの定数は基板の加算抵抗の比にあり、そのオフセットは基板のプルダウンだ。blargg のミキサー ROM は、それぞれ一チャンネルを DMC の逆波形に対して鳴らし、コンソール全体で打ち消す。同じ ROM を実機で録った彼の録音を同じコードで測ると、二つのチャンネルでコンソールとコンマ数パーセントで一致し、残る二つでは実物のパルスと DMC の曲線をスコープへの問いとして残す。
シェルが時間について教えたこと
一フレームが一コアで要する時間は、何かを書く前に測られた: コンソールと符号化器は一コアに余裕で収まり、コム復号と CRT の各段は CPU のどこにも収まらなかった。その二つは GPU の計算パスになり、CPU の連鎖に全画素の全成分で押さえられた。述べた許容の百分の一の内側で、百倍速い。コンソールは自分のスレッドで壁時計に歩調を合わせて走り、信号経路のドリフト方針を通して重複と欠落を数え、時間方向には決して再標本化しない。最初の版はそれを描画スレッドに置き、一拍遅れた瞬間に暴走した。最初の走行の計数器がそれを示した。窓は負荷のかかった機械の仮想ディスプレイで走った。本物の画面、スピーカー、そして手が残っている。
一つの罠は一文に値する。一族がどこでも使う変異スイッチは環境変数で、チップのラングもそれを読む。だからコンソール側の変異が一度、下のチップまで変異させ、検査は間違った理由で赤になった。何も証明しない赤は家風が警告する種類のもので、実際に何が失敗したかを問うことで捕まえた。
ベンチに残るもの
未決の項目はすべて実機での一回のスコープ・セッションで、スケッチの捕捉一覧がすでに順序を付けている: カラーバーのカートリッジでの映像出力、終端付きで。CPU と PPU 自身のクロックの横にマスタクロックを、複数回の電源投入にわたって。これが割り込みの問いを決め、コンソールが引くべき位相の集合を与える。ミキサー ROM での音声出力。電源投入時のリセット連鎖。クロックに対するカートリッジ選択線。その横の机には、画面付きのシェル。