NEStinymachines

まだページではなく、実験場

人の速さで見るファミコン

テレビに絵を一枚映すために、ファミコンがすることの全部が16.6ミリ秒で終わります。ここで動いているのは、 エンジニアたちがチップのトランジスタから組み直したコンソールです。考えている様子が見えるところまで、速度を落としてあります。

コンソールを起こしています...

走査線
·
ドット
·
ビーム
·
フレーム開始から
·
1 ドットの長さ
·
実機との比
·

同じ明るさで全色相。明るさは数秒ごとに変わります。市販のゲームではなく、絵を試すために自分たちで書いたものです。

ここから

案内つきで一周する

このページは本ではなく作業場です。部品に決まった順番はなく、どれからでも触れます。 案内が欲しいときのために、一本の道を用意しました。

テレビの絵から始まり、チップ一枚の中で終わります。各駅に、何を見ればいいかを一行だけ添えました。 案内中は下に帯が付いてきて、いつでもやめられます。

この順で 20 分ほど。テレビの映像から 1 個のトランジスタまで下りていきます。途中で抜けても、また戻ってこられます。

一本の線

絵は、長いうねり一本

ファミコンはテレビに絵を送りません。送るのは一本の線の電圧だけで、それが上下しながら一行ずつ流れ、 テレビがそこから絵を組み立てます。上のフレームの走査線をどれか選ぶと、模型がその行を符号化したとおりの波が出ます。

深く落ち込むところが同期、テレビに新しい行の始まりを知らせる合図です。その後ろの小さな波がカラーバースト、テレビが合わせる拍子です。その先が絵で、線の高さが明るさ、上に乗った速い揺れが色を運びます。

フレームを符号化しています...

色

色とは、タイミングのこと

ファミコンが出せる色は決まっています。明るさが数段階、それぞれに色相が並びます。 ここに並ぶ色は、いま、あなたのブラウザの中で、コンソールの模型が作り、テレビの模型が復号したものです。表を写したものは一つもありません。

どれか選んでください。線はカラーバーストと同じ拍子で上下し、色相を決めるのはいつ揺れるかだけです。 時計の文字盤は、各色の揺れがバーストからどれだけ進んでいるかを示します。色相ごとに、自分の時刻があります。

色を測っています...

実際のゲーム

スーパーマリオブラザーズの一フレーム

エンジニアたちは模型でスーパーマリオブラザーズを走らせ、ごく普通の一フレームについて、 ビームが画面のどこにいるとき CPU が何をしていたかを書き出しました。この地図は、その表をフレームの上に塗ったものです。

意外なのは灰色の広さです。ゲームはほとんどの時間、何もしていません。仕事を早めに終えて待っています。 画面の上のほうは、ビームがステータスバーを通り過ぎるのを待つ時間です。スコアを止めたまま、下の世界だけを動かすためです。

コンソールがフレームの形を返すのを待っています...

コントローラ

八つのボタンが、一本の線を通る

パッドの中には小さなチップが一つ入っていて、コンソールに聞かれた瞬間に八つのボタンをまとめて写し取り、 あとは一本の線で、一拍に一ビットずつ渡していきます。画面のボタンか、上のフレームを選んだ状態でキーボードを押して、読み取りを見てください。

押されたボタンは線の上では 0 です。コンソールがそれを裏返して読みます。

押すと押しっぱなしになり、もう一度押すと離します。

パッドの中: 写し取られた状態

  1. A
  2. B
  3. セレクト
  4. スタート
  5. 上
  6. 下
  7. 左
  8. 右

コンソールの中: 組み上がるバイト

  1. A
  2. B
  3. セレクト
  4. スタート
  5. 上
  6. 下
  7. 左
  8. 右

待機中。

間違い探し

ボタン一つ、一フレームだけ

コンソールを二台、同じカセット、同じボタン、フレーム単位で同じ入力。同じ機械が同じプログラムを走らせているので、 絵も同じです。そこで、片方にだけ、一フレームぶんボタンを一つ足します。

そこから先で違うところは、すべてその一押しのせいで、ほかの何のせいでもありません。 少し後でまた一致することもあれば、二度と戻らないこともあります。ソースコードが一行もなくても、 ゲームがボタンで何をしているかはこうして分かります。二回走らせて、違いを見るだけです。

校正カセットでは、ボタンは白黒のブロックの帯に、読まれた二フレーム後に印刷されます。 どのブロックが光り、どれだけ光り続けるかを見てください。

コンソールがフレームの形を返すのを待っています...

あなたのゲーム

手持ちのカセットを X 線にかける

同じやり方を、あなたのカセットで。しばらく遊んでください。ページは各フレームでどのボタンを押していたかを書き留めます。 エンジニアたちのベンチが走行を書き留めるのと同じです。そのうえで、やめた瞬間の一押しを X 線にかけます。

二台のコンソールが、電源を入れたところからあなたの操作をそのまま再生し、片方にだけ一押しが足されます。 その後で二台が違うところは、すべてその一押しのせいです。報告には、絵が最初に分かれたフレーム、画面のどこか、 どれだけ離れたか、また一致したかどうかが出ます。

カセットはこのブラウザの中だけで読まれ、どこにも送られません。

コンソールがフレームの形を返すのを待っています...

音

一つのチップに、五つの声

ファミコンの音楽は、CPU チップの中の五つの声から出ています。矩形波が二つ、三角波、ノイズ、 それに録音を鳴らすものが一つ。ゲームは時々チップに数字をいくつか書き込むことで音楽を作ります。どの音か、どれだけ大きいか、どんな形か。

ここでは、その数字をあなたが鍵盤で書き込みます。動いているのは、実チップのトランジスタから測って作られた、 エンジニアたちの音回路の模型です。各声はチップが出しているとおりに描かれ、音の高さはその波形から測った値で、決め打ちではありません。

一つ消してみると、ほかの声がわずかに変わります。チップは声を単純に足しているわけではないからです。 その混ぜ方は NES コミュニティが公開した表から書き起こしたもので、エンジニアたちは自分の実機ではまだ測っていない主張として印をつけています。 チップのピンが乗っている一定の直流分は、スピーカーに届く前に抜いてあります。

コンソールが時計を知らせるのを待っています...

遅いチップ

トランジスタが、一つずつ切り替わる

高速な絵のチップを書く前に、エンジニアたちは遅いほうを作りました。実チップのシリコン上のトランジスタを一つ残らず、 ダイの写真が示す配線のとおりに切り替える模擬です。それがいま、あなたのブラウザの中で、試験用の画面を一ドットずつ描いています。

隣は、同じ画面を高速版が描いたものです。高速版は遅いほうと全ドットで一致しなければならず、このページはそれを見ている間に確かめています。 ランプはチップ自身の配線です。ドットと走査線のカウンタが二進で数え、色がチップから出ていきます。

下の棒は、各ドットで状態が変わったトランジスタの数です。チップは数ドットごとに新しいタイルを取りに行くので、その拍子が見えます。

遅いチップ: トランジスタを 1 つずつ動かしたもの
速いチップ: 同じフレームを一度に

チップを起こしています...

走査線
·
ドット
·
描いたドット
·
速いチップと一致
·
食い違い
·
位置合わせ
·
ここでの毎秒ドット数
·
実機のチップとの比
·
このドットで切り替わったトランジスタ
·
ドット計数器·
走査線計数器·
色の出力·
クロックとバス

ドットごとに切り替わったトランジスタ。直前の 2 走査線ぶん

ダイ

チップそのものが光る

これは絵のチップのシリコンそのものです。封止を外した実チップの写真からなぞられた形で、 ここにあるすべての模型は、もともとここから来ています。いま信号を通している配線が光ります。トランジスタ単位のチップが、あなたのブラウザで動いています。

どこかを指すと、それがどの配線かが出ます。多くには、写真をなぞった人たちが付けた名前があり、 エンジニアたちの報告が「この信号が立った」「このラッチが保持した」と書くときの名前は、この名前です。

色は層です。上の金属、下のシリコン、その間の切り替えの層。

ダイの形を描いています...

  • メタル
  • 拡散層
  • 拡散層、接地へ
  • 拡散層、電源へ
  • ポリシリコン
  • いま高い
指している線
·
その高さ
·
いま高い線
·
進めた半ステップ
·

事典

どのゲームも使う手

ゲームを分解していると、同じ手が何度も出てきます。パッドの読み方、メモリの切り替え方、時間の測り方、 絵を崩さずに書き換える方法。エンジニアたちはそれをコードパターンの事典として書き留めています。

ここの絵は、各項目の仕組みを私たちが描いて動かしたものです。記録ではなく図解で、 中の番地や数値はどれも特定のゲームのものではありません。項目自身の言葉を横に添えてあり、 測定を含む全文は一クリック先にあります。

項目 1

The poll routine

パッドでは A と右を押しているABセレスタ上下左右メモリのバイト。左から埋まっていく8 回のうち 1 回目: A

ボタンがパッドから 1 つずつ出ていき、メモリのバイトへ左から並んでいくのを見てください。最後は、パッド全体が 1 つの数に収まります。

項目自身の言葉で、何をするものか: Reads the controller: strobe the shift register (a 1 then a 0 to $4016), then read $4016 eight times, each read one button on D0, shifting the bits into a RAM byte.

項目 1 を全文読む

項目 2

The bank switch: a menu's Start

カセットメニュー1 本めのゲーム切り替え書いた値0000ここの ROM のバイト0000実際に入る値0000論理積絵が出ているメニューでスタートを押す

順番を見てください。まず絵を消し、それから書き込みます。この種のカセットでは、書き込みがその場所に入っているバイトと組み合わされるので、メニューはそのバイトと元から合う場所に書きます。

項目自身の言葉で、何をするものか: A multicart's menu polls the pad, and on Start turns rendering off, writes the game's bank into the mapper's register and starts the game from its reset vector. The bytes are a commercial cartridge's, so this entry is shape only: addresses, counts, event kinds, and what the x-ray reported with every fetched byte masked.

項目 2 を全文読む

項目 3

The game loop inside the interrupt

消灯期間主なプログラム自分へ飛び続けるだけ割り込みの処理ゲーム全体処理が働き、また眠りに戻る

主なプログラムは何もしません。消灯期間が CPU の肩を叩いた瞬間に、ゲーム全体が起きて動きます。2 つめのフレームではゲームが長引き、次の合図はそのまま飛ばされます。

項目自身の言葉で、何をするものか: The main program spins on one instruction; the whole game runs in the NMI handler, which turns NMIs off at its entry and on before its RTI, so a long frame is dropped and never re-entered.

項目 3 を全文読む

項目 4

The sprite-0 split for a status bar

動かない流れる目印ゲームは待っている。目印のスプライトを見張りながら

上の帯はそのままで、下の面だけが滑っていきます。ゲームがビームの通過を知る手だては、帯の下端に目印としてスプライトを置いておくことだけです。

項目自身の言葉で、何をするものか: Waits for the sprite-0 hit flag at the bottom of a fixed status bar, then writes the level's scroll, so the bar stays and the world moves under it.

項目 4 を全文読む

項目 5

The VRAM buffer drained in the blank

描いているメモリの一覧絵のチップ描いている間: ゲームは変更を書き留める

絵を描いている間は変更が溜まっていき、消灯期間になって初めて絵のチップへ流れ込みます。チップが受け取れるのはそのときだけです。

項目自身の言葉で、何をするものか: The game's logic, running during the picture, queues nametable and palette writes in RAM; the handler writes them to $2007 in the blank, after the DMA, before rendering goes on.

項目 5 を全文読む

項目 6

The jump engine

ゲームのコード仕掛けを呼ぶ処理 0 の番地処理 1 の番地処理 2 の番地処理 3 の番地覚書ここへ戻れ番号: 2呼び出しが行われる。表はその後ろに並んでいる

CPU には「この中から 1 つ選んでそこへ行け」という命令がありません。そこでゲームは、呼び出しが残す「戻り先の覚書」を借りて、表の場所を見つけます。

項目自身の言葉で、何をするものか: A routine called by JSR pulls its own return address, indexes the table of addresses that follows the JSR, and lands by JMP indirect: a switch on a byte with the cases written as a table right after the call.

項目 6 を全文読む

項目 7

The state dispatch

地面にいる空中にいるA を押した着地した地面の処理が走る

フレームが進むのを見てください。どの処理が毎フレーム走るかは状態が決めます。地面で 1 回押すと状態が変わり、次のフレームからは別のことをしています。

項目自身の言葉で、何をするものか: The player's state (on the ground, in the air, ...) indexes a jump-engine table; a press changes the state and the next frame runs a different routine.

項目 7 を全文読む

実機か模型か

同じ画面を、三通りで

エンジニアたちは、同じカセットのタイトル画面で実機と模型を並べ、実機のほうは二回見ました。 一度はオシロスコープで録って自前のソフトで復号し、もう一度は安価な USB キャプチャで。 一つの実信号に対する二つの目と、その隣に模型です。

実機の二枚はよく一致します。模型もほとんど一致しますが、色がいくらかずれます。シアンはやや青く、茶色はやや暖かい。 スライド、点滅、差分で見比べ、色を指して自分で測ってみてください。

原因は突き止められています。実チップの出力は明るい色ほど立ち上がりが鈍り、それが色相をずらします。 模型の信号はきれい過ぎて、そうはなりません。その不完全さを模型に教えるのは、まだ宿題です。

写真を読み込んでいます...

左の写真のここの色
·
右の写真のここの色
·
色相の隔たり
·
明るさの隔たり
·

水色の文字を指してから、茶色の看板を指してみてください。片側が模型、もう片側が実機です。

エンジニアたちがこの写真で測ったもの

比べたもの平らな面での差の平均色相、中央の値明るさの模様の一致
model against decoder0.67 of 25512.6 degrees0.95
model against grabber1.26 of 25514.1 degrees0.95

The flat blocks agree, because most of a title screen is black. The hue does not. The logo's brown is (148, 92, 0) in the model, (132, 73, 0) off the scope and (121, 69, 0) off the grabber; the lettering's cyan is (59, 200, 251) in the model against (45, 200, 205) and (67, 202, 202). Where the two eyes, two different decoders on the one signal, agree to a degree, the model sits twelve to fourteen degrees away on the same colours: bluer in the cyan, warmer in the brown.

The part's output under load. Folding the real waves by subcarrier phase shows what the model's square waves are not: on the part, the rise takes about six phases and the fall about three, the low level sits a tenth of a volt under the table's, and the cyan's plateau at 1.05 V is rounded where the brown's at 0.80 V is not. That is the 2C02's known differential phase distortion (nesdev, "NTSC video"): the PPU's output impedance depends on the level, the board's capacitance slows the higher edges, and the effective hue rotates with the voltage, brighter colours more. The wiki models it as an RC lowpass whose time constant follows the voltage; applied to the model's waves it rotates row 2 by 14.7 degrees at its amount 4 (the cyan's 14.4), but row 1 by 7.5 where the brown measured 1.8, and it rotates every hue of a row alike, as the measurements do. What the title1 session had that the earlier records did not is the grabber on the same output as the probe: a different load on the part's output stage, a stronger and more nonlinear slew than one constant fits.

バグ博物館

間違いは、全部とってある

これだけ丁寧に機械を組むということは、何度も間違え、そのたびに捕まえるということです。 エンジニアたちは片付けてしまわずに、直し方の隣に間違いをそのまま残しています。その中から何点か。

模型の中にいたバグ、実機につながれたベンチにいたバグ、道具にいたバグ、そして測り方そのものにいたバグ。 各プレートには、何が見えたか、なぜ起きたか、どう捕まえたかが書いてあります。その下は、彼ら自身の報告から読み込んだ彼らの言葉です。

そのバグがいた場所

模型にいたバグ

GWME と出たタイトル

模型のタイトル画面。絵札が 1 枚だけ違っている
模型のタイトル画面。絵札が 1 枚だけ違っている
直したあとのタイトル画面
直したあとのタイトル画面
見えたはずのもの
スーパーマリオブラザーズのタイトル画面。1 文字を除いて完璧で、メニューには 1 PLAYER GWME と出ていました。
理由
数を足した直後、速い方の CPU の写しが、まだ届いていない古い値の方を見てしまい、読み出しが違う番地に行って A ではなく W を拾いました。当時の試験には、この 2 命令を並べたものが 1 つもありませんでした。
どう捕まえたか
エンジニアたちは、その文字を拾った読み出しまで遡り、数命令に縮めてトランジスタ単位のチップに当てました。そちらは正しく動きました。最初の直しはメニューを別の形で壊し、同じやり方で捕まりました。2 度目の直しには、遅いチップに照らした新しい試験が付いてきました。

エンジニアたちの言葉で

1 PLAYER GWME. The events file located the write: the byte sent to $2007 for that tile was $20, the letter W, where the ROM's string, read out of CHR-ROM through $2007 a moment earlier, carried $0A, the letter A. The pins walked it back: the byte came from an LDA ($00),Y whose pointer and index crossed a page, and the CPU read the un-carried address, $0300, and never did the fixed-up read at $0400 where the A had been stored. Five instructions reproduced it on the 6502 repository's own lockstep of the switch-level chip beside the fast rung: after INY, the fast rung chose its variant of the next instruction by asking Y as stored, one instruction stale, because the result of the increment was still in the ALU's hold register and lands one half-cycle later. The switch-level chip has no such question to ask; the carry falls out of the transistors with the right Y.

全文を読む

プログラムを書く

チップに用事を言いつける

プロセッサが知っている命令は数十個で、どれも小さなことしかしません。ここに数を置く、一を足す、何かと比べる、一行戻る。 ゲームはそれだけでできています。書き換えて走らせられる数行を用意しました。

動かしているのは 6502 そのもの、この工房が自前の窓口で提供しているトランジスタレベルのチップで、一命令ずつ進みます。 A、X、Y は、チップが作業中に数を置いておける三つの場所です。下の格子はメモリの最初の一ページで、プログラムがそこを書き換える様子が見えます。

これはファミコンの中のプロセッサと同じもので、すべてはここから始まりました。 コンソールのチップは、これと同じ石の上に音の回路を並べたものです。

これより小さいプログラムはありません。数を CPU に入れ、それをメモリのどこかに置きます。

試してみる

チップに渡されたもの

「チップに載せる」を押すと、組み上がったプログラムがここに出ます。各行が何をするかも一緒に。

A、主な作業レジスタ
·
X
·
Y
·
いまいる場所
·
フラグ
·
走った命令の数
·

プログラムが残したあとの、メモリの最初のページ

································································································································································································································································································································································································································································································································

ベンチ

実機を、見張る

机の上の実機がなければ、どれも決着しません。エンジニアたちはその周りにベンチを組みました。 ボタンを押す小さな基板、映像線につないだオシロスコープ、そして全体を見張るフレーム上のカメラ。 走行をそのまま繰り返せて、あとから何が起きたかを見られるようにするためです。

以下は彼ら自身の写真と、彼ら自身のキャプションです。選ぶと表示されます。下に並ぶのは、そのキャプションが挙げているものを、書かれた順に並べたものです。

組み立て全体

寄って見る

the bench from the front: the console and its TV at the left, the frame over the backing board, the scope behind it

the bench from the front: the console and its TV at the left, the frame over the backing board, the scope behind it

この写真に写っているもの

  1. the console and its TV at the left
  2. the frame over the backing board
  3. the scope behind it

出典: The QA rig.

何が見ていて、何を見ているか

  • Logitech BRIOthe board eye: the hole map, the named close-ups, the timed board grabson the frame's cross-bar over the breadboards, straight down, raised and levelled 2026-09-15, gaffer-taped and velcroed
  • Logitech QuickCam Pro 9000the side eye across the board: the three chips and the UNO's leads in profile from the Pi's sideon the backing board's Pi side, low, looking across the breadboards toward the console
  • Logitech QuickCam Communicate Deluxe (OFF THE RIG 2026-09-24)was the second side eye, along the chip board's rails side from the cable end: the probe clips, the console cable's housing, U3's rails-side landingson the frame's upright at the cable end, low
  • Roxio capture (em28xx)the console's pictureon the splitter with the scope's CH3
  • Logitech BRIO`zoom_absolute``focus_absolute`, `focus_automatic_continuous`

Four phone photographs of the whole rig, 2026-09-15, after the lock (phone metadata stripped; the TV's picture blurred, since the site carries no commercial game screenshots).

作られ方

二週間ぶんの午後

最初のスケッチから、模型につながれた実機まで、コンソール全体は数週間で組み上がりました。 そのどの一歩も二度書かれています。何をどこまで確かめるかを先に書いた計画と、何が分かったかを書いた報告です。それを日付の一本の線に並べました。

形がそのまま物語です。テレビ信号はほとんど即日で片付き、二つのチップはそれぞれ数日。 一度はトランジスタの高さで、もう一度は一致しなければならない高速版として。それからコンソール、 そして実物のハードウェアでベンチを組む二週間。日数の大半はここです。

どの駅を選んでも、その文書が何についてのものか出ます。詳しく知りたければそのまま辿ってください。

  1. Where it started

  2. The chips

  3. The signal

  4. The console

  5. The desk

  6. Planning the bench

  7. Building the bench

  8. What happened at the bench

  9. Experiments at the bench

  10. Exercising the bench

全体の流れ

9月1日から9月29日まで

エンジニアたちが書いた計画と報告のすべてを、彼ら自身の区分けで、日ごとに並べたものです。色の濃い日はそれだけ多く書かれた日です。押すと、その日に何が書かれたか出ます。

文書は、その本文が最初に挙げている日付の上に置いています。たいていは作業をした日です。本文に日付を持たない 3 件は、代わりにここに挙げます: N3 plan, P2 report, Where the signal path departs from the references.

機械

少しの部品と、一つの時計

ここまで見てきたものは、全部この部品たちのやり取りです。CPU はゲームを走らせて絵のチップに指示を残し、絵のチップはカセットのタイルを読んでビームを走らせ、テレビが線の信号を光に戻します。下の各部品から、エンジニアたちがそれを分解した先へ行けます。

パッド水晶2A032C02カセットテレビ八つのボタン時を刻む頭脳と音絵のチッププログラムと絵札1 本の線から光へボタン刻み刻み音プログラム絵札音声映像
CPU と絵のチップが偶然同じ時計の刻みを共有することはありません。二つとも同じ水晶を数えていて、電源投入時に両者が取りうる位相の合い方は、エンジニアたちが全部確かめています。

次の工作

この実験場がこれから育てられるもの

約束ではなく提案です。どれもエンジニアたちがすでに測ったか作ったものの上に乗ります。

  • 実機の音と並べて

    エンジニアたちは自分たちの音を実機の録音と突き合わせています。同じ比較をここでも。模型の一音と実チップの同じ一音を続けて鳴らし、違うところに印をつける。

  • 実機の波形をオシロスコープで

    実機の映像線をオシロスコープで録ったものを、同じ画面の模型の信号と並べて描く。うねりがどれだけ近いかが目で見える。

  • カセットを開ける

    プラスチックの中身: 二つのメモリ、それを差し替える基板、そしてエンジニアたちが吸い出しのために作ったリーダー。彼らの写真つきで。