6502tinymachines

コンソール全体の計画

スケッチ、版 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. 「動く」の定義

以下のすべてが同時に成り立ち、それぞれに数字が付いたとき、コンソールは動いて いると言える:

  1. NROM (マッパー 0) のプログラムが、電源投入からリセットベクタを通って、 手出し無しでブートする。
  2. 画面の絵は、2C02 のラダーが作ったコンポジットの波形から ntsc-crt が 復調したものであり、パレットから引いたものではない。
  3. コントローラは両方とも、近道ではなく 74LS368 の経路を通って働く。
  4. 音は 2A03 のラダーの AD1/AD2 のタップから、書き下ろしのミキサーを通って 出て、ホストのレートに再標本化される。
  5. フレームは、ソース自身のレートで、フレームの種類ごとに歩調を取る: フル フレームは 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 はすでにこの方針を持っている)。
  6. 箱の中のどのチップも、ゴールデンによって自分のラング 0 に押さえられ、箱の 全体は実機の NES からの実際の捕捉に押さえられる。

「動く」は、すべてのマッパー、すべてのテスト ROM、スプライトのオーバーフローの すべての隅を意味しない。水晶から蛍光体までの、一本の正直な道を意味する。

1. 一族の現在地 (引用)

箱の部分リポジトリ状況
6502 コア6502 + halfphiラング 0 が 1,725 ノードでビット厳密。ラング 3 (v6502-micro) は 39.0 M h/s、274 本のトレースがすべて正確に再生する (2026-08-31)
2C022c02P0 と P1 は 2026-09-02 に閉じた。描画を有効にして 32,900 h/s。DAC は 7,680 標本にわたって食い違いゼロ
コンポジットから蛍光体までntsc-crtM0 から 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 の中の順序:
    1. まず測る: ドットごとの表駆動のステッパ (ラダーのラングは半ステップで刻む 義務を持たない。v6502-micro はノードを持たないし、ドットごとの一歩は 一歩で半ステップ 8 個分の仕事をするので、算術がまるごと変わる)。スライスの 作業を始める前に、そのフレーム時間を記録する。
    2. ビットスライスのデータパス (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 で走らせる。用途はこうだ:

  1. N8 の中の CRT のシェーダ。
  2. 回帰の掃き出し: ラング 0 のカーネルの上で、すべての種からすべてのオペコードを、 毎晩、v6502-gpu がすでに走っているやり方で。
  3. 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/sN4 の 139 の B 半分の検査
電源投入時の CPU_RST、RST_PB、CIC_RST、PWR_LED1 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 はディレクターへ四つの問いを出した。四つとも上で決着しており、理由付けが 残るようにここに記録する。

  1. nes-bus は自前のリポジトリにする (第 2 節)。nes の中のクレートは、 このかたち全体が防ぐために存在している依存を、逆さにしてしまう。
  2. P3 はまずフレーム時間で測り、スライスはいま設計して、記録された不足が あって初めて作る (N2)。ゲートをフレーム時間へ押し込んだのは、第 1 節の 4 倍の単位の訂正だ。書き下ろしの隔たりはおよそ 9 倍で、設計するには十分に 大きく、実測なしで作るには十分でない。
  3. N5 のゲート 3 には Micro Mages のデモ (N5)。v0.1 は「元の名簿」を引いて いたが、一族の中にそれを定義するものは無い。代わりに基準で選ぶ (マッパー 0、 実際の遊びで両方のコントローラを使う、試すのに困らない程度に配布できる、 決してコミットしない)。
  4. 2A03 のダイのページはラダーの後にする (N1、N3)。あのページが載せるはず だったプローブは N3 の成果物だ。ページは見せる側で、臨界経路の外にある。

この版でディレクターに開いているものは無い。

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