こんにちは、パレイド技術部の夏目です。
前編では、ファミリーベーシックの BASIC だけで 6502 を書き上げたところまでを書きました。公式151命令が動いた。けれど 1 台の全メモリは 4,086 バイトしかなく、ゲストプログラムに渡せるのは 1,024 バイト。インタプリタが動く余地がないという結論になり、そこで止まりました。
後編は、その続きです。前提を守って目的のほうを変えたら、別のものが動きました。そして行き詰まって周辺を調べ直したら、ぶつかった問題が全部 1971〜1985 年に解かれていたという話をします。

本記事はローカル LLM による自動執筆パイプラインで生成されました。現段階ではクラウド AI(Claude 等)の補助や人間の編集が介在していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
目的のほうを変えた
結論、「汎用のファミコン ROM を動かす」は諦めました。代わりに題目を軌道修正しします。多数の単純な機械が、1 台では絶対にできないことを作り出せるか。
ここまでで、データレコーダーという媒体の性質は数字で分かっていました。1 回の転送が 21.5 秒。ただしうち同期ヘッダが 16.5 秒を占めます。中身のほうは 1 KB あたり 7.5 秒。そして放送——1 回の SAVE を全機が聞く形——なら、24.2 秒で 99 台に届き、しかも台数によらない。
ここから読み取れることが 3 つあります。
回数が試行コストのドライバであって、量ではない。 1 回 16.5 秒の固定費は、中身が 1 バイトでも 1 KB でも同じだけかかります。放送は台数に対してタダ。 1 対 N は O(1) で済むのに、N 対 1 の集約は O(N) かかる。テープは RAM ではなくテープ。 順に流すのは安く、飛び飛びに触るのは致命的です。
だから「メモリを小分けにして複数台で分担すればスケールする」という話は、この媒体とは噛み合いません。分割は細かいアクセスを生み、細かいアクセスこそテープが最も苦手とするものだからです。前編の 44,875 回という数字が、まさにそれでした。
そこで、噛み合う形のほうを探すことにしました。
| テープに向かないもの | テープに向くもの |
|---|---|
| 細粒度の共有メモリ | 放送(1 対 N が O(1)) |
| 命令ごとのフェッチ | まとめて流す |
| N 対 1 の集約 | 各台がその場で判断する(集約しない) |
連想記憶をやってみた
右の列にちょうど乗る形がひとつありました。連想記憶です。
各台が辞書の一部を持ちます。問い合わせ機がキーを放送する。そのキーを持っている台だけが答える。
肝はここです。問い合わせ機は、誰が持っているかを知らない。 知っていたら名指しで済んでしまい、連想記憶になりません。辞書は問い合わせ機の知らない式で散らして配り、持ち主かどうかの判断は各台が自分でやる。通信は放送 1 回と応答 1 回で、台数によらず 2 回。容量のほうは台数に比例します。
動きました。
| 台数 | 記憶機 | 群体の容量 | 引く時間 |
|---|---|---|---|
| 2 | 1 | 416 件 | 87.2 秒 |
| 6 | 5 | 2,080 件 | 88 秒 |
| 12 | 11 | 4,576 件 | 88.5 秒 |

容量が 11 倍になっても、引く時間の振れは 1%。
全部の台数で、正しい台だけが答えて、他は黙りました。12 台のときは 11 台すべてが問いを聞いて、答えたのは 1 台だけ。どこにも無いキーを聞いたときは、誰も答えない——受けた回数は増えるのに、答えた回数は増えません。
1 台では 416 件しか持てないものを、11 台で 4,576 件持って、同じ時間で引ける。1 台では絶対にできないことが、たしかにできました。
文章だけだと「本当に他の台は黙っているのか」が伝わらないので、4 台を 2×2 に並べて撮りました。左上が問い合わせ機、残りの 3 台が記憶機です。

見どころが 3 つあります。左上は OWNER UNKNOWN と出したまま放送します——誰が持っているかを知らないからです。3 台とも HEARD KEY 1056 と出るので、全員が同じ問いを聞いていることが分かります。そして答えるのは右下の 1 台だけで、残りの 2 台は NOT MINE と出して黙る。
持ち主が対角の右下になるキーを選んであります。隣だと「近いから答えた」ように見えてしまうからです。実際には近いも遠いもなくて、辞書を配った式 (キー×7+11) MOD 台数 が右下を指しているだけ。そしてその式は左上の台に入っていません。
この 1 往復に 94.8 秒かかっています(映像は 15 倍速)。ただしこれはエミュレータの値で、録音してから再生する模擬なので物理の 2 倍かかっています。実機なら往復 43 秒の見込みですが、そこはまだ測っていません。
調べたら、全部解かれていた
連想記憶が動いたあと、残った課題を並べました。
空振り——誰も持っていないと、問い合わせ機が答えを待ち続ける。衝突——2 台が同じキーを持つと、同時に喋って混信する。聞き逃し——放送はその瞬間に聞いている台にしか届かない(実際に 11 台中 9 台しか聞かない状態を踏みました)。誤動作——台が落ちると、持ち主が黙るので空振りと区別がつかない。捏造——誰でも答えられる設計なので、1 台が嘘の値を返しても見分けられない。
並べてから、先例がないか調べました。そして、どれもファミコンが出る前か、同じ頃に解かれていたことが分かります。

| ぶつかった課題 | 先行研究 | 年 |
|---|---|---|
| 放送で問い、持ち主だけが答える | ARP | 1982 |
| 衝突 | ALOHAnet | 1971 |
| 喋る前に聞く・退いて待つ | CSMA/CD → Ethernet | 1973〜76 |
| 誤動作・捏造 | ビザンチン将軍問題 | 1982 |
| 連想記憶を並列計算の土台にする | Linda / タプル空間 | 1985 |

ファミリーコンピュータは 1983 年、ファミリーベーシックは 1984 年、V3 は 1985 年です。
ARP は構造が完全に一致していた
RFC 826(1982 年 11 月)。イーサネット上で「この IP アドレスを持っているのは誰か」を放送し、持っている装置だけが返す仕組みです。
「連想記憶」と呼んで設計したものと、同じ形でした。問い合わせ側が持ち主を知らないところも、持ち主が自分で名乗るところも、持っていない者が黙るところも、空振りをタイムアウトで扱うところも一致します。ARP を、1984 年の機材で作り直していたわけです。
衝突は 1971 年の問題だった
ALOHAnet はハワイ大学が 1971 年に作ったもので、共有された放送路で複数が勝手に喋るという、このテープバスとまったく同じ状況を最初に扱ったものです。
| 方式 | 最大効率 |
|---|---|
| 純 ALOHA(相手を気にせず喋る) | 18.4% |
| スロット ALOHA(喋り出す時刻を揃える) | 36.8% |
| CSMA/CD(喋る前に聞く・衝突を検出して退く) | ほぼ 100% |
このテープバスは、いまのところ純 ALOHA に相当します。 喋る前に聞いていないし、喋りながら衝突を検出することもできない(SAVE の最中にテープ入力を読めない)。
ただし「喋る前に聞く」ことはできそうです。テープ入力の有無は $4016 を読めば分かるはずなので、CSMA までは届く可能性がある。ここはまだ測っていません。
捏造への定石は、この成果と正面衝突する
ビザンチン将軍問題(Lamport, Shostak, Pease, 1982)は、一部の参加者が嘘をつく状況で、正しい者たちが合意に達せるかを問うものです。口伝えのメッセージしか使えないなら、忠実な者が 3 分の 2 を超えていないと解けない。
この連想記憶は「誰でも答えられる」設計なので、そのままでは 1 台の嘘を見分けられません。定石は冗長に持たせて多数決を取ることですが、それは通信を増やします。
「引く時間が台数によらない」という、さっき喜んだばかりの性質と正面から衝突する。 答えを 1 つ得るのに 3 台に持たせて 3 つ聞けば、それはもう O(1) ではない。正しさと速さのどちらを取るかという、まったく同じ問題が 1982 年に定式化されていました。
Linda —— 連想記憶を並列計算の土台にする
Gelernter が 1985 年に出したモデルで、物理的には共有されていないメモリを、連想的に共有されているように見せます。プロセスはタプルを「置く・読む・取る」だけで協調する。
ここでやったのは、タプル空間を 1984 年の機材とカセットテープで作ることだった、と言ってよさそうです。
それで、何をやったことになるのか
新しい問題を見つけたわけではありませんでした。考えてみれば当たり前で、共有された放送路という条件が同じなら、出てくる問題も同じになるからです。
やったのは、こういうことだと思います。既知の問題に、当時の機材で、当時は誰もやらなかった形で正面からぶつかった。 そして、教科書の数字が、実物の秒数として出てきた。
純 ALOHA の 18.4% も、ビザンチンの 3 分の 2 も、論文の中では記号でした。ここでは「16.5 秒の同期ヘッダ」であり、「88.5 秒で引ける 4,576 件」であり、前編でいえば「8 秒の再生に 5.5 日」です。
そして最後にもうひとつ。6502 を BASIC で書き上げた。動いた。それでも動かせなかった。 足りなかったのは知恵でも時間でもなく、1984 年の 4,086 バイトでした。
その先へ行く道は 1 本だけあって、それを通ると企画が終わる。だから通りませんでした。
付録: 後編で使った実測値
| 値 | |
|---|---|
| テープ 1 回 | 21.5 秒(うち同期ヘッダ 16.5 秒) |
| 中身の転送 | 1 KB あたり 7.5 秒 |
| 放送 | 24.2 秒で 99 台(台数によらない) |
| 連想記憶 1 台の容量 | 416 件(1 件 3 バイト) |
| 連想記憶 11 台の容量 | 4,576 件 |
| 引く時間 | 87.2〜88.5 秒(容量 11 倍で振れ 1%) |
| リグのフレーム進行 | 58〜60 フレーム/秒(実機 60.10 の 96〜100%) |
先行研究の出典は次のとおり。