コンソール全体の計画
スケッチ、版 0.2。
2026-09-02 に v0.1 として起草し、同じ日にディレクターが修正して批准した。 有効なのはこの版だ。ここにある数字はどれも、一族の中の走行スタンプ付きの報告 からの引用か、書き下ろしと札を付けたものだ。書き下ろしのものは、マイル ストーンが実測に置き換えるまで、どこにも引用されない。
v0.1 から変わったところ:
- 第 0 節のフレームレートを訂正した: v0.1 は「60.0988 Hz」で歩調を取って いたが、それはちょうど ntsc-crt の M0 報告が捕まえ、批准された v0.3 の 引き継ぎが別々に押さえた取り違えだ。NES の三つのレートは今、すべて名指し してある。
- 第 1 節の PPU の実時間の数値を訂正した: v0.1 の「10.74 M h/s」はドット クロックの縁のレートで、どの 2C02 の報告も使わない単位だ。走行スタンプ付きの 2C02 の数値がすべて実測されている単位 (マスタの半クロック) では、実時間は 毎秒 42.95 M 半ステップ、4 倍多い。P3 のゲートはフレーム時間で言い直したので、 単位を再び取り違えることはできない。
- 開いていた四つの問いは決着した (第 6 節がいまその決定の記録だ):
nes-busは自前のリポジトリにする。P3 はまずドットごとの表駆動の数値を測り、ビット スライスはいま設計して、記録された不足があって初めて作る。N5 のゲート 3 の ROM は Micro Mages のデモにする。2A03 のダイのページはラダーの後へ動かし、 それが載せるはずだったプローブは N3 の成果物になる。
0. 「動く」の定義
以下のすべてが同時に成り立ち、それぞれに数字が付いたとき、コンソールは動いて いると言える:
- NROM (マッパー 0) のプログラムが、電源投入からリセットベクタを通って、 手出し無しでブートする。
- 画面の絵は、2C02 のラダーが作ったコンポジットの波形から ntsc-crt が 復調したものであり、パレットから引いたものではない。
- コントローラは両方とも、近道ではなく 74LS368 の経路を通って働く。
- 音は 2A03 のラダーの AD1/AD2 のタップから、書き下ろしのミキサーを通って 出て、ホストのレートに再標本化される。
- フレームは、ソース自身のレートで、フレームの種類ごとに歩調を取る: フル
フレームは 29,531,250/491,381 = 60.09848 Hz、短いフレームは 60.09915 Hz、
描画を有効にした 2 フレームの平均は 39,375,000/655,171 = 60.09881 Hz
(文献が「60.0988」に丸める数値)。この三つは、ntsc-crt の
field_rates_exactがすでに別々に押さえているレートだ。重複と欠落は数える (ntsc-wasm はすでにこの方針を持っている)。 - 箱の中のどのチップも、ゴールデンによって自分のラング 0 に押さえられ、箱の 全体は実機の NES からの実際の捕捉に押さえられる。
「動く」は、すべてのマッパー、すべてのテスト ROM、スプライトのオーバーフローの すべての隅を意味しない。水晶から蛍光体までの、一本の正直な道を意味する。
1. 一族の現在地 (引用)
| 箱の部分 | リポジトリ | 状況 |
|---|---|---|
| 6502 コア | 6502 + halfphi | ラング 0 が 1,725 ノードでビット厳密。ラング 3 (v6502-micro) は 39.0 M h/s、274 本のトレースがすべて正確に再生する (2026-08-31) |
| 2C02 | 2c02 | P0 と P1 は 2026-09-02 に閉じた。描画を有効にして 32,900 h/s。DAC は 7,680 標本にわたって食い違いゼロ |
| コンポジットから蛍光体まで | ntsc-crt | M0 から M5 まで閉じた。M4 の実機の録音の半分は、捕捉ファイル一つを待っている |
| 2A03 のラッパー (÷12、APU、DMA、ストローブ) | 無い | visual2A03 は「200 を返す。取得も実測もしていない」 |
| メイン基板の糊とカートリッジ | 無い |
実時間の要求を、回路図の上のクロックから (マスタ 21.477272 MHz、CPU は ÷12): CPU は毎秒 3.58 M 半サイクルで、ラング 3 の実測 39.0 M に対して 10.9 倍の 余裕がある。PPU の単位はマスタの半クロックで (P1 報告によれば、半ステップ 一つが NTSC のグリッド標本一つ、12 x f_sc にあたる)、だからその実時間は 毎秒 42.95 M 半ステップだ: フルフレーム一つは 16.639 ms の中の 714,736 半ステップになる。PPU の要求を他のどの単位で述べても、v0.1 が 4 倍間違えたのと 同じことになる。下のマイルストーンのゲートはフレーム時間を使う。単位の変更では それを曲げられない。
2. かたち
新しいリポジトリを三つ。
nes-bus:halfphiと同じように自前のリポジトリで、公開し、版をピン 留めする。どのチップのクレートも話すフレームの型がここに入る: CPU のピン、 PPU のピン、カートリッジの端、DotFrame、そして音声の標本の流れだ。nesの中のクレートにすると、チップのリポジトリがコンソールのリポジトリに依存 することになり、下の規則が逆さになる。先例はv6502-pins(規約一つ、依存 なし) とhalfphi(リポジトリをまたいで共有し、ゲートで検査する) だ。 チップ間の規約をすべて一度に一か所へ動かすことで、PPU の引き継ぎの開いた 問い 2 (DotFrameはどこに住むか) も決着する。2a03: halfphi を通す五つ目のチップ。ラング 0 とラダー、まさに 2c02 と 同じ型だ。nes: コンソール。書き下ろしの糊、スケジューラ、シェル、そして端から 端までのゴールデンを持つ。nes-bus、6502、2a03、2c02、ntsc-crtに 依存する。
これを成り立たせている規則: チップのクレートは、自分のピンの向こう側に何が あるかを決して知らない。何かを何かに差し込むのは、コンソールだけだ。
この文書のコミットされる住所は、nes リポジトリができるまでは nes-bus/docs
で、できたらそこへ移る。6502 リポジトリの中の起草用の写しはコミットしないまま
にする。ntsc-crt の引き継ぎの写しと同じ構えだ。
3. マイルストーン
どのマイルストーンにも、数字であるゲート、赤にならなければならない
MUTATE=1、そして check-self-counts.py の行がある。順序は依存の順序だ。
N1 と N2 は並行して走れる。
N0: 規約
CpuPins、PpuPins、CartEdge(72 本のピンを型付きの構造体として。 カートリッジ側の出力 CIRAM_A10 と CIRAM_CE も含む)、DotFrame(互換のための 再輸出付きで ntsc-crt から移す)、AudioSamplesを持つnes-bus。- カートリッジはトレイトであり、NROM がその最初の実装で、視野に入る唯一の ものだ。
- ゲート:
2c02とntsc-crtが、既存のゴールデンを変えないままnes-busに対してコンパイルできる。MUTATE=1は規約の中のピン一本の極性を反転させ、 依存するゴールデンはすべて赤にならなければならない。
N1: 2A03 のラング 0 (2a03 リポジトリ、マイルストーン A0 から A3)
- A0: ネットリストをピン留めしたハッシュで取得、計数を表明、電源投入が
収束、JSSim のノードゴールデンがビット厳密。最初に記録する測定: 2C02 の、
電源でゲートされた永久導通のトランジスタ 38 個が再発するかどうか。再発する
なら、
power_onの手当てを halfphi へ昇格させる。 - A3: 最初の音: AD1/AD2 の駆動ノードを半ステップごとに取り、レベルを wiki の二出力のミキサー表に標本ごとに押さえ、WebAudio へ流す。
- 新しい種類のゲート: コアの領域を、ラング 3 の 6502 とピンのロックステップで
v6502-pinsに押さえる。規約を通したチップ対チップだ。十進の命令は予期された ダイバージェンスであり、名前で一覧にする。 - v0.1 が A1 と A2 と番号を振ったダイのページ (2A03 のレイアウトを載せた描画器、
アトラスと監視パネル) は N3 の後へ動かす。一族はページで測ったことが一度も
無い: 測ったのは decimal-probe、reset-probe、
_block-probe.htmlで、ページは それを見せていた。あのページが運ぶはずだった計器は、表の測定がそれを必要と する N3 で、ヘッドレスのプローブとして作る。ページは後から、臨界経路の外で。 6502 のページと同じ仕事だ。
N2: PPU の P2 と P3 (2c02 リポジトリ、すでに書かれているとおり)
- P2: スプライト 0、VBL の競合、OAM の破壊。手で作ったマイクロトレースで。
- P3: ラダー。ゲートはフレーム時間で述べる: 1 フレームを最大 16.639 ms で
描く。これはフルフレームの周期で、述べた数のフレームにわたって測り、余裕を
記録する。P3 の中の順序:
- まず測る: ドットごとの表駆動のステッパ (ラダーのラングは半ステップで刻む
義務を持たない。
v6502-microはノードを持たないし、ドットごとの一歩は 一歩で半ステップ 8 個分の仕事をするので、算術がまるごと変わる)。スライスの 作業を始める前に、そのフレーム時間を記録する。 - ビットスライスのデータパス (
halfphi::sliceがすでに働いているやり方) は、 いま、P3 の計画の中で設計して見積もる。隔たりが大きいからだ: 書き下ろしの見込みとして、素朴な半ステップのラダーが 6502 の 1,465 倍の 十分の一に届くとすれば、毎秒 4.8 M 半ステップの付近に着き、実時間が要求する 42.95 M に対しておよそ 9 倍足りない。作るのは、ステップ 1 から記録された 不足があってこそで、この書き下ろしの数字によってではない。
- まず測る: ドットごとの表駆動のステッパ (ラダーのラングは半ステップで刻む
義務を持たない。
N3: 2A03 のラダー
v2a03-micro: コアにはv6502-micro(十進はフラグで無効にし、N1 の ダイバージェンスの一覧に照らして確かめる)。加えて APU を、6502 の復号が そうだったように、ラング 0 から測り出した表として持つ: フレームシーケンサ、 スイープ、エンベロープ、長さの表、ノイズの LFSR、DMC。$4014 と DMC の ストールは RDY の区間として書き下ろし、盗みがどの半サイクルに着地するかを 示すラング 0 のゴールデンに対して再生する。- プローブは足場ではなく成果物だ: フレームシーケンサ、チャンネルのタイマと 長さのカウンタ、OUT0-2、OE1-2、そして $4014 の間の RDY のヘッドレスな 吐き出しを、表を書き下ろす前にラング 0 に対して走らせる。これが、後回しに したダイのページが後で見せる計器になる。
- ゲート: 全チャンネルを運動させるレジスタプログラムで、ラング 0 に対するピンの ゴールデン。AD1/AD2 の標本の流れが、ラング 0 のタップに対してビット厳密。 スループットを実測。
N4: 糊、書き下ろし
ここでは何も halfphi を通らない。どの部品も数行で、自分のデータシートに押さえ、 書き下ろしと札を付け、自分の小さなテストを持つ。
- 74LS139 の A 半分: A13/A14 から CPU_RAM_CS と PPU_CS。
- 74LS139 の B 半分: ROMSEL = not (A15 and M2)。M2 の項が検査どころだ。
- 74LS373: ALE が高い間は透過、立ち下がりでラッチ。検査は、マッパー式の A12 の 見張りが正しい縁の数を見ることだ。
- TMM2115 を 2 個: 理想的な 2 KB の SRAM。アクセス時間はデータシートからの 定数として記録し、誰かが競合を必要とするまで使わない。
- 74LS368 を 2 個とダイオードアレイ: コントローラの読み出し経路。使っていない ビットのオープンバスも含む。
- 74HC04: PPU_!A13。
- 電源投入のリセット連鎖: RST_PB と、固定の遅延としての CIC のリセット出力 (書き下ろし。スコープが置き換える。第 5 節を参照)。
N5: コンソール
- スケジューラ: 21.477272 MHz ÷ 2 のマスタ半ステップのカウンタ一つ。CPU は マスタのティック 12 回ごとに、PPU は 4 回ごとに進む。電源投入時の整列は、 ラング 0 が作る集合の中から選び、走行スタンプに記録する。壁時計での歩調合わせ は別の層で、書き下ろしと札を付け、第 0 節の 5 番のフレーム種別ごとの周期で、 ntsc-wasm のドリフト方針とともに歩調を取る。
- ゲート 1: CPU と PPU の整列。BRK 中の NMI の場面と、P2 からの VBL の競合が、 単体のトレースと同じ半サイクルの位置でコンソールを通して再生する。
- ゲート 2: blargg の
cpu_timing_test、ppu_vbl_nmi、sprite_hit_tests、apu_testを、ラダーのラング群を通して端から端まで。結果はそれぞれ、合格か、 名指しして理解された不合格として記録する。 - ゲート 3: Micro Mages のデモ (Morphcat Games) が、両方のコントローラで
ブートして遊べる: NROM 32K の二人協力プレイなので、「両方のコントローラ」は
メニューではなく実際の遊びで運動する。自由に配布されているがオープン
ライセンスではないので、ゲートはローカルで駆動し、コミットは決してしない。
reference/の中のマニュアルと同じ構えだ。ライセンスが誰かの気に障る場合の 控え: Shiru の NROM のタイトル (Lan Master)。ただしその場合、二本目の コントローラのために二つ目の ROM が要ることは受け入れる。
N6: 絵
- PPU のラダーからの
DotFrameを ntsc-crt の NES ソースへ。復号は既定で ラング C、CRT の各段は入れる。 - ゲート: 第 5 節のスコープの録音に対する、M4 の実機の捕捉の比較。カラーバーの カートリッジを実機の箱とコンソールの両方で走らせ、ntsc-oracle がすでに使って いるのと同じ整列の手順で行う。許容は測る前に述べる。
N7: 音
- AD1/AD2 の標本の流れを、書き下ろしのミキサー (回路図から取った R7、R8、R9、 R6 と RC の定数) へ入れ、それから 48 kHz への再標本化器へ。
- ゲート: 既知のレジスタプログラムの AUDIO_OUT を、スコープで録ったものと コンソールのものとで、同じ再標本化を通した後に波形として比べる。許容は測る 前に述べる。
N8: シェルと梱包
- Linux のネイティブなバイナリ一つ: コンソール、窓、シェーダの中の CRT の各段 (GPU が働きに見合う唯一の場所)、コントローラの入力、音の出力。ダイの探検器は ブラウザに残る。コンソールはそれを必要としない。
- WASM のビルドは二つ目の標的として生かし続け、別に測る。
4. 二つの GPU は何のためにあるか
コンソールのためではない。実測した GPU のラング 2 は、128,000 台の機械を それぞれ 39 h/s で走らせる。用途はこうだ:
- N8 の中の CRT のシェーダ。
- 回帰の掃き出し: ラング 0 のカーネルの上で、すべての種からすべてのオペコードを、
毎晩、
v6502-gpuがすでに走っているやり方で。 - N3 と N2 のゴールデンの生成を、順番にではなく並行に。
5. スコープのセッション
以下はすべて、名前の付いたゲートに供給される。この順で捕捉する。最初の項目 だけで ntsc-crt の M4 が閉じる。
| プローブ点 (回路図) | 必要なレート | 供給先 |
|---|---|---|
| VIDEO_OUT (AUX ポート、または Q1 の後の RF_MOD1 の入力) | 副搬送波の 4 倍以上。副搬送波の 12 倍 (42.95 MSa/s) はグリッドとちょうど一致する | ntsc-crt M4 の実機の捕捉、N6 |
| X1 / CPU_CLK / PPU_CLK (21.477272 MHz のマスタ) を、M2 (U6 のピン 31) と PPU_ALE (U5 のピン 39) と一つの時間軸で | 100 MSa/s 以上、3 チャンネル | ÷12 対 ÷4 の電源投入時の整列、N5 のゲート 1 |
| AUDIO_OUT (AUX ポート)、そして届くなら U6 のピン 1 と 2 (AD1、AD2) | 1 MSa/s で十分 | N7、ミキサーの定数 |
| カートリッジの端の ROMSEL を M2 と並べて | 100 MSa/s | N4 の 139 の B 半分の検査 |
| 電源投入時の CPU_RST、RST_PB、CIC_RST、PWR_LED | 1 MSa/s、長い記録 | N4 の書き下ろしのリセット連鎖を置き換える |
| CIRAM_CE と PPU_A13 を PPU_ALE と並べて | 100 MSa/s | カートリッジの規約のミラーリングの経路 |
セッションのための注意:
- 生の標本は、標本レートとプローブの減衰をファイル名か脇のファイルに入れて
保存する。
ntsc-source-capは WAV を読む。残りは CSV でよい。レートが 刻まれるまで、何にも名前を与えない。 - マスタクロックと M2 は同じ記録の上で捕捉する。整列が、二つの記録からの 推論ではなく測定になるように。
- VIDEO_OUT については、カラーバーの画面 (バーを描く NROM のテスト群なら何でも よい) と、ただの黒のフレームと、ただの白のフレーム。バーが M4 を閉じ、黒と白 は、DAC のゲートがすでに押さえている同期と消去期間のレベルを押さえる。
- 電源投入の捕捉は一度で済ませない。整列は電源投入ごとに変わると見込んでいる。 目にした値の集合が、N5 のスケジューラが引くべき集合だ。
- コンポジットは PPU のピンではなく、映像のバッファの後でプローブする。 コンソールはそのバッファも模しているので、比較はバッファ対バッファであるべきだ。
6. 決定の記録
v0.1 はディレクターへ四つの問いを出した。四つとも上で決着しており、理由付けが 残るようにここに記録する。
nes-busは自前のリポジトリにする (第 2 節)。nesの中のクレートは、 このかたち全体が防ぐために存在している依存を、逆さにしてしまう。- P3 はまずフレーム時間で測り、スライスはいま設計して、記録された不足が あって初めて作る (N2)。ゲートをフレーム時間へ押し込んだのは、第 1 節の 4 倍の単位の訂正だ。書き下ろしの隔たりはおよそ 9 倍で、設計するには十分に 大きく、実測なしで作るには十分でない。
- N5 のゲート 3 には Micro Mages のデモ (N5)。v0.1 は「元の名簿」を引いて いたが、一族の中にそれを定義するものは無い。代わりに基準で選ぶ (マッパー 0、 実際の遊びで両方のコントローラを使う、試すのに困らない程度に配布できる、 決してコミットしない)。
- 2A03 のダイのページはラダーの後にする (N1、N3)。あのページが載せるはず だったプローブは N3 の成果物だ。ページは見せる側で、臨界経路の外にある。
この版でディレクターに開いているものは無い。
ビルド時に nes/docs/nes-end-to-end-v0_2.md から取り込まれる。写しはリポジトリの一つだけだ。報告は独自の作業用の言葉をいくつか使う: 報告書で使われる言葉。