6502tinymachines

実験ノート

印刷用: 図面一式「NES controller-port bridge, v1b」TM-NESB-001 版 P (PDF、英語)、組み上がった v1b、写真の上に検査箇所を書き出したもの (PNG)。

docs/lab-log.jsonl から tools/lab-notebook.py が生成する。あのファイルには、 各ステップを試すたびに tools/bringup.py が追記する。中身は一つも手で打たれて いない。失敗したものも含めて、すべての試行が載る。三回かかったステップこそ、 ノートの取っておく価値のある部分だからだ。

組むのは v1b、Arduino UNO の上のブリッジで、すべて 5 V (bench-v1b-uno.md)。 ステップとその検査は tools/bringup.py の中にあり、あれは記録であると同時に 手順でもある: 走らせれば組み立てを順に歩き、停留点ごとに測る。

どれもハードウェアに触れる前に、道具は代役に対して予行してある。2026-09-08 に 6 回の試行。それらは印を付けてログに入っており、以下では数えていない。

組み立てはどこまで来たか

試した 8 ステップのうち 8 が成立。試行は 21 回。

ステップ何を証明するか試行状態
0.1スコープが応答し、自分が何かを言う2成立
0.2ワークステーションがシリアルポートを開ける2成立
0.3ブリッジのファームウェアが UNO に載っていて STATUS に答える2成立
1.1コントローラのハーネスの色と、ポートのピンの対応1成立
1.2コンソールの電源を入れたときのポートのアイドルレベル1成立
2.1純正パッドのポートにスコープを当て、ゲームを走らせる3成立
5.1二つの半分をつなぎ、ゲームでラッチあたり 8 クロック7成立
6.1トリガがスコープに届く3成立

計器

0.1 スコープが応答し、自分が何かを言う

試行 1、2026-09-08 11:07:20: 成立。DS1054Z、ファームウェア 00.04.05.SP2

試行 2、2026-09-08 12:41:12: 成立。DS1054Z、ファームウェア 00.04.05.SP2

0.2 ワークステーションがシリアルポートを開ける

試行 1、2026-09-08 11:07:24: 成立しなかった。/dev/ttyACM* も /dev/ttyUSB* も無い: UNO は挿さっているか。

写真は未撮影: docs/lab/00-uno-bare.jpg。

試行 2、2026-09-08 12:41:14: 成立。socket://:6545 が開く

写真は未撮影: docs/lab/00-uno-bare.jpg。

0.3 ブリッジのファームウェアが UNO に載っていて STATUS に答える

試行 1、2026-09-08 12:41:15: 成立。# mode pass latch 482 clocks 0 held 00

試行 2、2026-09-08 12:43:11: 成立。# mode pass latch 0 clocks 0 held 00

ハーネス

1.1 コントローラのハーネスの色と、ポートのピンの対応

答えるもの: wiring.md のポート表は、このステップがこの基板の上で確認するまでは、公表されたピン配置にすぎない。

2026-09-08 13:26:56: 成立。7 本中 7 本を対応付けた。ポートのハウジングに成形されたピン番号から読んだ。番号付けはハウジング自身のもので、それを試すのはステップ 1.2 の +5V の読みだ

方法: ポートのハウジングに成形されたピン番号から読む。

ポートのピン信号線
1GND茶
2CLK赤
3OUT0橙
4D0黄
5D3白
6D4青
7+5V紫

コントローラのハーネスの色と、ポートのピンの対応

コントローラのハーネスの色と、ポートのピンの対応

写真は未撮影: docs/lab/01-board-header.jpg。

1.2 コンソールの電源を入れたときのポートのアイドルレベル

2026-09-09 21:33:50: 成立。電源 5.0 V、OUT0 のアイドルは 0.091、CLK のアイドルは 5.002、D0 は None。スコープの CH4/CH1/CH2、1x、グランドは黄色のリード線で読んだ。D0 は読んでいない

電源のリード線5 V
OUT0 のアイドル0.091 V
CLK のアイドル5.002 V

写真は未撮影: docs/lab/01-meter-on-port.jpg。

実物自身のタイミング

2.1 純正パッドのポートにスコープを当て、ゲームを走らせる

答えるもの: wiring.md の書き下ろし「ラッチは数 us 高、クロックは数百 ns 低、クロックの間はおよそ 7 us、1 秒に 60 ポーリング」。

試行 1、2026-09-09 21:06:59: 成立しなかった。ラッチのチャネルが平ら (255 のうち 76 から 77): プローブは当たっているか、コンソールは動いているか。

写真は未撮影: docs/lab/02-probes-on-port.jpg。

写真は未撮影: docs/lab/02-scope-screen.jpg。

試行 2、2026-09-09 21:14:12: 成立。ラッチ高 3.32 us、クロック低 0.600 us、クロック周期 10.62 us、60.10 ポーリング/s、15 ラッチにわたってラッチあたり 8 クロック

ラッチのパルス、高3.32 us
クロックのパルス、低0.6 us
クロックの間10.62 us
ポーリングの間16.639 ms
1 秒あたりのポーリング60.1
記録の中のラッチ15
ポーリングあたりのクロック8

ポーリングあたりのクロック数: 14 ポーリングで 8 クロック。

写真は未撮影: docs/lab/02-probes-on-port.jpg。

写真は未撮影: docs/lab/02-scope-screen.jpg。

試行 3、2026-09-09 21:24:27: 成立。ラッチ高 3.32 us、クロック低 0.580 us、クロック周期 10.62 us、60.10 ポーリング/s、15 ラッチにわたってラッチあたり 8 クロック

ラッチのパルス、高3.32 us
クロックのパルス、低0.58 us
クロックの間10.62 us
ポーリングの間16.639 ms
1 秒あたりのポーリング60.1
記録の中のラッチ15
ポーリングあたりのクロック8

ポーリングあたりのクロック数: 14 ポーリングで 8 クロック。

写真は未撮影: docs/lab/02-probes-on-port.jpg。

写真は未撮影: docs/lab/02-scope-screen.jpg。

つないだ

5.1 二つの半分をつなぎ、ゲームでラッチあたり 8 クロック

答えるもの: 計画の B0 ゲート 1。実物が答えることのできる最初のものだ。

試行 1、2026-09-15 15:52:06: 成立しなかった。20 s で 1203 ポーリング (60.1/s)、ポーリングあたりのクロック数 {0: 18, 1: 37, 2: 29, 3: 28, 4: 12, 5: 4, 6: 12, 7: 32, 8: 826, 9: 40, 10: 35, 11: 10, 12: 16, 13: 37, 14: 35, 15: 27, 16: 5} <- 377 ポーリングが 8 クロックではなかった

1 秒あたりのポーリング60.15
記録したポーリング1203
8 クロックのポーリング0.687

ポーリングあたりのクロック数: 0 クロックが 18 ポーリング、1 クロックが 37 ポーリング、2 クロックが 29 ポーリング、3 クロックが 28 ポーリング、4 クロックが 12 ポーリング、5 クロックが 4 ポーリング、6 クロックが 12 ポーリング、7 クロックが 32 ポーリング、8 クロックが 826 ポーリング、9 クロックが 40 ポーリング、10 クロックが 35 ポーリング、11 クロックが 10 ポーリング、12 クロックが 16 ポーリング、13 クロックが 37 ポーリング、14 クロックが 35 ポーリング、15 クロックが 27 ポーリング、16 クロックが 5 ポーリング。

写真は未撮影: docs/lab/05-bridge-joined.jpg。

写真は未撮影: docs/lab/05-console-running.jpg。

試行 2、2026-09-15 17:48:58: 成立しなかった。20 s で 1202 ポーリング (60.1/s)、ポーリングあたりのクロック数 {0: 7, 8: 1188, 16: 7} <- 14 ポーリングが 8 クロックではなかった

1 秒あたりのポーリング60.1
記録したポーリング1202
8 クロックのポーリング0.988

ポーリングあたりのクロック数: 0 クロックが 7 ポーリング、8 クロックが 1188 ポーリング、16 クロックが 7 ポーリング。

写真は未撮影: docs/lab/05-bridge-joined.jpg。

写真は未撮影: docs/lab/05-console-running.jpg。

試行 3、2026-09-15 17:49:58: 成立しなかった。20 s で 1202 ポーリング (60.1/s)、ポーリングあたりのクロック数 {0: 2, 8: 1198, 16: 2} <- 4 ポーリングが 8 クロックではなかった

1 秒あたりのポーリング60.1
記録したポーリング1202
8 クロックのポーリング0.997

ポーリングあたりのクロック数: 0 クロックが 2 ポーリング、8 クロックが 1198 ポーリング、16 クロックが 2 ポーリング。

写真は未撮影: docs/lab/05-bridge-joined.jpg。

写真は未撮影: docs/lab/05-console-running.jpg。

試行 4、2026-09-15 17:50:23: 成立。20 s で 1203 ポーリング (60.1/s)、ポーリングあたりのクロック数 {8: 1203} <- B0 ゲート 1 が成立

1 秒あたりのポーリング60.15
記録したポーリング1203
8 クロックのポーリング1

ポーリングあたりのクロック数: 8 クロックが 1203 ポーリング。

写真は未撮影: docs/lab/05-bridge-joined.jpg。

写真は未撮影: docs/lab/05-console-running.jpg。

試行 5、2026-09-15 17:51:24: 成立。20 s で 1202 ポーリング (60.1/s)、ポーリングあたりのクロック数 {8: 1202} <- B0 ゲート 1 が成立

1 秒あたりのポーリング60.1
記録したポーリング1202
8 クロックのポーリング1

ポーリングあたりのクロック数: 8 クロックが 1202 ポーリング。

写真は未撮影: docs/lab/05-bridge-joined.jpg。

写真は未撮影: docs/lab/05-console-running.jpg。

試行 6、2026-09-15 17:51:49: 成立。20 s で 1203 ポーリング (60.1/s)、ポーリングあたりのクロック数 {8: 1203} <- B0 ゲート 1 が成立

1 秒あたりのポーリング60.15
記録したポーリング1203
8 クロックのポーリング1

ポーリングあたりのクロック数: 8 クロックが 1203 ポーリング。

写真は未撮影: docs/lab/05-bridge-joined.jpg。

写真は未撮影: docs/lab/05-console-running.jpg。

試行 7、2026-09-15 17:52:14: 成立。20 s で 1202 ポーリング (60.1/s)、ポーリングあたりのクロック数 {8: 1202} <- B0 ゲート 1 が成立

1 秒あたりのポーリング60.1
記録したポーリング1202
8 クロックのポーリング1

ポーリングあたりのクロック数: 8 クロックが 1202 ポーリング。

写真は未撮影: docs/lab/05-bridge-joined.jpg。

写真は未撮影: docs/lab/05-console-running.jpg。

ヘッドの手

6.1 トリガがスコープに届く

試行 1、2026-09-15 15:52:46: 成立しなかった。スコープがトリガしなかった: 抵抗、BNC、EXT TRIG のレベル (1.5 V、立ち上がり) を確認する

写真は未撮影: docs/lab/06-trigger-cable.jpg。

試行 2、2026-09-15 17:38:35: 成立。TRIG 20 が CH1 でスコープを止めた

写真は未撮影: docs/lab/06-trigger-cable.jpg。

試行 3、2026-09-15 21:14:18: 成立。TRIG 20 が CH1 でスコープを止めた

写真は未撮影: docs/lab/06-trigger-cable.jpg。

ビルド時に nes-bench/docs/lab-notebook.md から取り込まれる。リポジトリが唯一の写しだ。報告書は独自の作業用語をいくつか使っている: 報告書で使われる言葉。