メイン基板の糊
N4 の報告。作業の後に書かれた。
走行スタンプ: 2026-09-05、rustc 1.97.1、nes-bus v0.1.1。cargo test --workspace: 16 テストが緑、テストファイルは五つ、部品ごとに一つ。ここには halfphi を通るものが何も無く、ダイから測ったものも何も無い。コンソールのスケッチ (第 3 節、N4) が求めているのはまさにそれだ: 各部品を数行で、データシートに押さえ、書き下ろしと札を付け、自前の小さなテストを添える。このクレートは crates/nes-glue だ。
部品
| 部品 | NES-001 での配線 | 何に押さえたか |
|---|---|---|
| U3、74LS139 | A 側: 1G = A15、1A = A13、1B = A14。よって 1Y0 が /RAM CS ($0000..$1FFF)、1Y1 が /PPU CS ($2000..$3FFF)。B 側: 2G は接地、2A = M2、2B = A15。よって 2Y3 が /ROMSEL = not (A15 and M2) | SN74LS139A の機能表を一行ずつ、二つの窓を 256 バイトページすべてにわたって、そして M2 の項: A15 が高で M2 が低のとき、カートリッジを選択してはならない |
| U8、74LS373 | LE = PPU ALE、D = AD0..AD7、/OE は接地。Q はカートリッジ端での PPU A0..A7 | 高の間は透過、立ち下がりから保持。そして 2C02 のハーネスの立ち上がりエッジ標本と結果が違う唯一の場合 (パルスの内側で AD が動く) を示し、データシートは立ち下がりの値を保つ |
| U1 と U4、TMM2115 | CPU の WRAM は /RAM CS の後ろにあり、この部品に無い線のぶんだけ 4 回ミラーされる。PPU の CIRAM はカートリッジの /CIRAM CE と CIRAM A10 の後ろ | アドレス線 11 本、/CS と /WE はデータシートの言うとおり、電源投入時の充填は見て明らかにデータではないもの。-12 等級の 120 ns アクセス時間は記録され、使われていない |
| U9 と U10、74LS368 | /OE1 と /OE2 で有効化。D0 は各ポートのデータ線を反転したもの、D3 と D4 (ポート 1) と D1..D4 (ポート 2) は拡張ポートから | 反転。駆動されていないビットはどれもバス自身の値であり、取り込んで回して返すもので、決して発明しない |
| コントローラ、4021 | ポートの反対側 | OUT0 が高の間は読み込み続け、その立ち下がりでラッチし (そのときのボタンの状態)、A B Select Start Up Down Left Right を 1 回の読み出しごとに 1 ビット送り出し、8 回目の読み出しより先では線が低を示す (D0 = 1)。文書どおり |
| 74HC04 | PPU A13 を反転してカートリッジのピン 58 へ | 反転 |
| リセット鎖 | RST_PB と CIC のリセット出力が /RESET へ | ボタンが押されている間はアサート。電源が良好になった後とボタンが離れた後は HOLD_MASTER_CYCLES のあいだ保持 |
テストが教えたこと
六つの部品のうち二つは最初の書き下ろしが間違っていて、テストがそう言った。コードに対してではなくデータシートに対してテストを書く意味はそこにある:
- コントローラはストローブの立ち下がりでラッチする。 最初の草稿は OUT0 の立ち上がりでレジスタを読み込んでいた。それではストローブが高の間に押されたボタンが取りこぼされる。4021 は並列/直列入力が高の間は連続して読み込み、その入力が落ちるときに抱えているものを保つ。そして 8 回目の読み出しより先ではポートの線は低に座るので、CPU は D0 に 1 を読む。最初の草稿はそれを離されたボタンとしていた。nesdev のページが主張の出どころで、モジュールのコメントは今、線がどの水準を示すかとその理由を述べている。
- 生の A12 監視は 1 行につき 8 回の立ち上がりを見る。 PPU の実測フェッチ日程 (P3 計画の位置: 背景はパターンテーブル 0 から、スプライトはドット 257..320 でテーブル 1 から、各スプライトのパターン対の前にゴミのネームテーブル取得が二つ) からなる合成の 1 行の上では、A12 はスプライトごとに立ち上がる。ゴミの取得が、その間でラッチの立ち下がり二つぶん A12 を低にするからだ。MMC3 が 1 行に 1 回と数えるのは、低の期間が短い立ち上がりを濾すからだ (M2 の立ち下がり 3 回以上、ドットで約 9 個と述べられている)。
A12Watcherはそのフィルタをラッチの立ち下がり数で抱えていて、テストは両方の計数、生の 8 x 240 と濾した後の 240 を押さえる。だからフィルタの理由は文ではなく数字だ。
書き下ろして札を付け、ベンチを待っているもの
reset::HOLD_MASTER_CYCLESは仮置きだ: マスタクロックで約 50 ms、ロックアウトの握手にかかる範囲の内側の丸い数字。スケッチの第 5 節がこれを置き換える捕捉を名指している (電源投入時の CPU_RST、RST_PB、CIC_RST と PWR_LED、1 MSa/s、長い記録)。テストはこの数字をその札に釘付けしているので、変更には新しい札か、両方を退役させる捕捉が付いてくる。sram::ACCESS_TIME_NS_GRADE_12は何にも使われていないデータシートの転記だ。誰かが競合を模型にするなら、そこがこれの行き先になる。- コントローラの 9 回目の読み出しの水準と、拡張線の待機水準は nesdev の主張であって、測定ではない。
持ち越し
- バス調停、値としてのオープンバス、マスタクロック、そして二つのチップの位相合わせは N5 のものだ: このクレートは水準を受け取って水準を返すだけで、チップを一つも知らない。
- カートリッジ自身の $6000..$7FFF の解読と、NROM を超えるマッパーは、スケッチの言うとおり範囲外だ。
ビルド時に nes/docs/n4-report.md から取り込まれる。写しはリポジトリの一つだけだ。報告は独自の作業用の言葉をいくつか使う: 報告書で使われる言葉。