6502tinymachines

2C02 の最初の絵

P1 の報告。作業の後に書かれた。

走行スタンプ: 2026-09-02、rustc 1.97.1、halfphi v0.1.2 (まだ手を付けて いない)。REQUIRE_GOLDEN_P1=1 を付けた cargo test --workspace --release: 5 テストが緑 (計数、収束、P0 のゴールデン、ハーネスを通した P1 のゴールデン、 DAC のゲート)。独立した三つの MUTATE=1 の証明が赤になる: 電源で条件付けた 補正を切ったもの (P0)、CHR バスがネームテーブルのバイトをすべて 1 ビット ずらして差し出すもの (P1 の再生は状態 623 の _db0 で分岐する)、そして DAC のパイプライン遅延を半ステップ一つ分ずらしたもの。

2026-09-04 に録り直した

P3 が実測した二つのことが、このワールドと、そのゴールデンが言う内容を変えた (docs/p3-report.md、書き込み経路の節):

  • パレットは今、書いたとおりに着地する。 レジスタのプログラムは十六の パレット項目を立て続けに書いていた。立て続けだと、どちらのエンジンも 最初の $2007 の値を落とし、残りを一項目ぶん早く着地させる。だから、 この報告が最初に述べたワールドは背景色として 0x16 を持ち、項目はすべて 一つずれていた。ここにあるものはどれもそれを見られなかった (DAC のゲート は脚を、バスに載っている色が何であれそれに照らして比べるし、最初の光は 目視だった)。プログラムは今、standard_program でも gen-p1.js でも、 パレットへの書き込みのたびにアクセス一回分のアイドルを続ける。そして チップは 0f 16 2a 12 0f 28 14 02 0f 26 1a 31 0f 30 27 06 を保持し、 読み返しも間隔を空けて行う。$2006 の対の後の最初の $2007 アクセスは、 今でも古いアドレスの上にバスサイクルを一つ出す ($0000 <- 00、遅れた 下位の書き込み)。純関数のワールドには感じ取れないものだが、コンソールの ために記録しておく。
  • 例外は無い。 halfphi 0.1.6 は駆動されないグループを、リファレンス 自身の面積投票で解決する (0.1.5 とそれ以前は、帯電したメンバーが一つでも あれば高にしていた)。その下で録り直すと、P1 のゴールデンは全 4,008 状態にわたる全 10,906 ノードでビット厳密に再生され (24 エッジのアクセス 26 回、384 半ステップのアイドル、3,000 半ステップの描画)、 p1-diverge-probe が報告する分岐ノードはゼロだ。下にある 27 ノードの 一族は、2026-09-02 には、実際のスプライトデータが通ったときに流れ出す 未定義の電源投入状態と読んでいた。あれはエンジンの電荷規則が、浮いた スプライト経路のグループをリファレンスと違う形で決めていたものだった。 コイン投げは無かった。テストは最初の状態からすべてのノードを比べる。 二つの妨害はどちらも、描画が始まった後の最初の CHR フェッチ (状態 1,007) で今も赤になる。
  • ドットのゴールデン、最初の光、DAC のゲートは、録り直したワールドから 再生成した: DAC の当てはめは同じピン留めした位相と遅延に着地し、7,680 標本で不一致ゼロ。最初の光の背景色は 0x0f だ。

以下の節は 2026-09-02 の報告を、書かれたままに置いたものだ。あのとき何が 測られ、それがどう読まれたかの記録として残してある。

閉じたもの

  • ハーネスはリファレンス自身の仕掛けを言い直したものだ。 CPU 側の レジスタのプロトコルは cpucmd.js の 24 エッジのアクセス (アドレスと R/W は エッジ 24、チップイネーブルは 16、解放と標本化は 1)。CHR/VRAM バスは macros.js の handleChrBus (アドレスは ALE の立ち上がりでラッチ、データは /RD の立ち下がりで駆動して立ち上がりで浮かせ、書き込みは /WR の立ち上がり で捕捉) で、リファレンス自身の順序で半ステップごとに走らせる。VRAM は アドレスの純関数なので、ゴールデンの生成器は同一のワールドを JS で台本に する。
  • P1 のノードのゴールデンはハーネスを通して再生する。 712,100 半ステップ の助走、それから $2002 の読み出し、レジスタのプログラム (26 アクセス: ctrl とマスクをゼロ、パレットを $2006/$2007 経由で読み込み、アドレスを ネームテーブルに置き、スクロールをゼロに、背景の描画を入れる)、そして 3,000 半ステップの描画: 書き出された状態は 3,624 で、アクセスのエッジを すべて比べる。だからチップだけでなく、プロトコル自身がオラクルの下に入る。
  • 例外の一族は流れ出した。x 反転の三つ組も含めて。 P0 はリセットを 持たないスプライト経路のラッチ九つを例外にし、実際のスプライトデータが そこを通れば x 反転の三つ組は一覧から外れると予測した。ここで実測した (examples/p1-diverge-probe.rs): この長いトレースでは一族は 27 ノード幅 で (三つ組、八つの spr_dN_in ラッチすべて、その範囲で条件付けられた 後続、名前の無い後続八つ)、描画が入ってスプライトの評価がその経路に 書き込むと、そのすべてが収束する: 最後に分岐する状態は 1,981 で、後ろ に続く 1,642 状態は、マスクを一切かけずに全 10,906 ノードでビット厳密 だ。 テストは流れ出す状態をピン留めし、そこから先はマスクなしで走らせる。 28 番目のノードが出ても、流れ出した後に分岐しても、走行は失敗する。
  • 最初の光。 examples/first-light.rs は標準ワールドの四行を、パレット の出力バス (pal_d0..5_out、各ドットの pclk1 位相で標本化。捕捉を書く前 に済ませた実測だ) から ntsc-crt の DotFrame へ捕らえ、 goldens/p1-first-light.ppm を書く: XOR の VRAM 関数によるタイルの格子、 属性の四分割、縞の模様で、レジスタのプログラムに照らして目視で正しい。
  • DAC のゲート: 有効な 7,680 標本で不一致ゼロ。 半ステップ一つが グリッドの標本一つ (マスタの半クロックは 12 x f_sc) なので、 ntsc-source-nes 自身の信号関数が、十二あるレベルの脚のどれが導通するかを 標本ごとに予測する。二つの定数は一度当てはめてピン留めした: 副搬送波の 位相オフセット (11。ちょうど波 8 になるバーストの脚から) と、pal バスの 後ろの DAC のパイプライン遅延 (12 半ステップ) だ。テストは走行のたびに 当てはめ直し、その結果をピンに照らして押さえる。だからずれれば、黙って 合わせ直す代わりに失敗する。構造の表明も一緒に乗る (どの半ステップでも 導通する脚はちょうど一つ、エンファシスのビットが立っていなければ エンファシスの減衰器は一度も導通しない)。

道すがら実測したこと

それに頼るコードを書く前に測った事実を、必要になった順に:

  • リセットのゲートが解放されるのは半ステップ 712,010。ワールドは 712,100 まで暖機してから話しかける。
  • アドレスの書き込みの前に $2002 の読み出しが必要だ: $2005/$2006 の 書き込みトグルのリセット後の状態は未定義で、この読み出しが無いとパレット はゴミのアドレスに着地した。
  • pal_d0..5_out は各ドットの pclk1 位相で画素の色を運び、pclk0 の間は プリチャージする。
  • 十二本の DAC のレベルの脚は、名前ではなく走査線の既知の地形から 較正した: vid_sync_l が同期の先端、vid_sync_h が消去のレベルで あり、だから $xE/$xF の黒がそれを立てる。書き写した表が、それらの列は 消去の電圧を出すと言っているとおりだ。

描画を入れたときのスループット (P0 が先送りした数字)

背景の描画を入れた三回中の最良で 毎秒約 32,900 半ステップ (examples/p1-bench.rs)。静止時の 50,457 に対しての数字だ: 262 行の フルフレームは 714,736 半ステップ、約 22 秒。描画を入れたときの活動する 円錐は、チップの静かなときの費用をおよそ半分ぶん上乗せする。より速いラング は後のマイルストーンの問題で、ここではまず測った。

持ち越したもの

  • スケッチに従う P2: ドットの流れを ntsc-crt の符号化と復号の全経路に通し、 コンポジットのフレームを目視ではなく採点する。
  • スプライトの描画 ($2003/$2004 経由の OAM 書き込み) には手を付けていない。 ここで実測した 27 ノードの流れ出しは、スプライトの経路が生きていて、 運動させれば一致すると言っている。(2026-09-04 に置き換わった: 一族は 無い。冒頭の節を参照。)
  • P0 から開いていて、まだ開いているもの: DotFrame の在り処、Quietust の ライセンスへの儀礼的な注記。

ビルド時に 2c02/docs/p1-report.md から取り込まれる。写しはリポジトリの一つだけだ。報告は独自の作業用の言葉をいくつか使う: 報告書で使われる言葉。