
2026/02/25 19:36
Z80/ZX Spectrum エミュレータを Claude Code で実装する Z80 アーキテクチャと ZX Spectrum のハードウェア仕様に従い、Claude Code を用いてエミュレータを構築します。以下は主要なステップです。 1. **CPU コアの作成** - Z80 の命令セット(約 158 命令)をすべて実装し、オペコードデコードロジックと実行パスを設計します。 - レジスタ (A, B, C, D, E, H, L)、プログラムカウンタ PC、インデックスレジスタ IX/ IY、フラグ R、I、IXH/L などを正確に再現します。 2. **メモリマッピング** - ZX Spectrum の RAM(通常 48 KiB)と ROM(16 KiB)領域を定義し、IO ポートへのアクセスを模倣。 - `0x4000–0x7FFF` を RAM として扱い、`0x0000–0x3FFF` は ROM へマップします。 3. **ビデオ/グラフィックス** - スペクトラムの画面は 256×192 ピクセルで、4 色(黒・青・赤・黄色)を持ちます。 - ビデオメモリ `0x5800–0x5AFF` を読み取り、ピクセルバイト単位でスクリーンに描画します。 4. **音声出力** - サウンドチャンネルは 1 チャネル(PCM)で、波形データを RAM の `0x6000–0x67FF` から取得。 - 音声バッファリングとサンプリングレート(通常 8 kHz)を実装します。 5. **IO デバイス** - キーボードは 8×16 行のマトリクスで、ポート `0xFE` を介して読み取ります。 - マウスやフロッピーディスクなどオプションデバイスも必要に応じて追加。 6. **Claude Code の活用** - 既存の Z80 エミュレータライブラリ(例: `z80emu.c`)をインポートし、エンジン部分は Claude Code でラップ。 - GUI フロントエンドは Electron や Qt を利用して、実行画面とデバッグツールを提供。 7. **テスト & デバッグ** - スペクトラム用の標準ソフトウェア(例: BASIC、ゲーム ROM)で動作確認。 - シミュレータの正確性はクロック周期単位で検証し、必要に応じてハードウェア特有のタイミングを微調整。 8. **最適化** - JIT コンパイル(例: `llvm`)や SIMD 命令で実行速度向上。 - メモリアクセスはキャッシュライン単位で整理し、レイテンシ低減。 これらを順序立てて実装すれば、高い互換性とスムーズな動作を持つ Z80/ZX Spectrum エミュレータが完成します。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
Anthropic の最近のブログ記事では、Opus 4.6 LLM を使って「クリーンルーム」環境(インターネットアクセスなし、ソースコード参照なし、ほぼゼロ誘導)で Rust で C コンパイラを作成する実験が紹介されています。著者は、この選択を批判し、C コンパイラの構築は SSA、レジスタ割り当て、命令選択などに関する事前研究が必要な複雑なグラフ操作問題であり、他の言語に適したものだと主張しています。
同じ著者は Claude Code で実験を再現し、Z80 エミュレータ(後に ZX Spectrum と CP/M エミュレータへ拡張)を同一のクリーンルーム制約下で作成しました。まずマークダウン仕様ファイルが作られ、範囲と規則(インターネットなし、簡潔なコード、テスト後にコミット、豊富なコメント、進捗ログ)が詳細化されました。その後、エージェントはウェブから Z80/Spectrum に関するすべての関連ドキュメントを取得し Markdown に保存してセッションを閉じ、汚染を防ぎました。新しいセッションで Claude Code は仕様のみを参照し、インターネットやソースコード検索なしでエミュレータをゼロから実装しました。
Z80 の場合:1,200 行の C コード(コメント込みで約 1,800 行)が全 ZEXDOC と ZEXALL テストスイートに約 20〜30 分で合格し、CP/M バイナリと Spectrum ROM に対して継続的にテストされました。実装は既存のエミュレータとは別物であり、Codex や Claude Code のチェックからコード盗用の証拠は見つかりませんでした。
ZX Spectrum の場合:ULA との相互作用、キーボードマッピング、テープ符号化などに関する詳細ドキュメントを元に、Jetpac を SDL 上で動作させるエミュレータが完成し、低 CPU 使用率を達成しました。その後、小規模なリファクタリングで TAP ファイルの読み込みもサポート。CP/M サポートは COM ファイル(ZEXALL/ZEXCOM テスト用)を調べて 3 つの必須システムコールを実装し、環境を拡張、2 MHz クロックをシミュレートすることで追加されました。
著者は、詳細な設計ヒント、包括的なドキュメント、進化するルールブックが LLM を用いた自動プログラミングの成功には不可欠であると結論付けています。彼はこれらのモデルが単に記憶したコードを再現するのではなく、既知のパターンから新しい実装を合成すると主張します。このアプローチがスケールすれば、クリーンルーム自律的コード生成は手動コーディングの労力を削減し、プロトタイピングを加速させ、開発者・ホビイスト・保存プロジェクト向けにニッチやレガシーシステムエミュレータを迅速に作成できるようになると述べています。
本文
antirez 3 days ago • 25 511 views
Anthropic は最近、最新バージョンの Opus(4.6)を使って「クリーンルーム」環境下で Rust で C コンパイラを書かせる実験について記したブログ記事を公開しました。
その手法から私は彼らが何を主張しようとしているのか疑問に思いました:
- ISA(命令セットアーキテクチャ)ドキュメントをエージェントに提供すべきでは?
- なぜ Rust なの? C コンパイラを書くことは大規模なグラフ操作問題で、Rust ではむしろ難しい。
- クリーンルーム実験では、エージェントは SSA(静的単一代入)、レジスタ割り当て、命令選択・スケジューリングなど、最適化コンパイラに関する確立済みの CS 研究をすべて利用できるはずです。これらは先に調査し「クリーンルーム」実装に備える必要があります。
インターネットアクセスや他のコンパイラソースコードへの参照を禁止した点は正しい判断でした。ほぼゼロ指示原則は、大規模プロジェクトを完全自律で書くことを示す実験には整合性がありますが、これは現場でコーディングエージェントが使われる方法ではありません。多くのユーザーは、ここそこにヒットさせれば品質が劇的に向上することを知っています。
Z80 実験
私は同様の実験を自分でも試してみました。1〜2時間以内で完結し、Claude Code Max プランに合致するものです:Z80 エミュレータを書き、その後 ZX Spectrum(そして後ほど CP/M)エミュレータを書くという流れです。結果は GitHub に公開しています:https://github.com/antirez/ZOT。
使ったプロセス
-
仕様書
Z80 エミュレータの範囲を Markdown ファイルで定義しました:- 個々のクロックステップではなく、命令全体を実行して RP2350 のような制限付きハードウェア上で動かす。
- 後に ZX Spectrum で ULA と競合するタイミング計測用に経過クロック数を追跡。
- メモリアクセスのコールバックを提供。
- 公式・非公式の Z80 命令をすべてエミュレート。
Spectrum 用には描画詳細、オプションの RGB バッファ、カセット読み込み用 EAR ビットシミュレーションなどを追加しました。
ファイルにはエージェントが従うべきルール(インターネット禁止、簡潔なクリーンコード、進捗ごとにコミット、テストスイート、コメント、プロンプトの中断なし、作業ログの維持、コンテキスト圧縮後に再読込み)も記載しています。 -
ドキュメント収集
Claude Code のセッションを立ち上げて、インターネットから Z80 と Spectrum に関する有用な資料を取得し、Markdown ファイルへまとめました。ZEXDOC/ZEXALL のバイナリテストベクトルや ROM も提供しました。すべて集めた後にセッションを削除して汚染を防ぎました。 -
実装
新しいセッションで Claude Code に仕様書とドキュメントを読み込み、厳格な「インターネット禁止/ソースコード参照禁止」ルールの下で Z80 エミュレータの実装を開始させました。遵守状況を監督しました。 -
ステアリング
Z80 にはゼロステアリング、Spectrum(特に TAP ローディング)には詳細なステアリングを行いました。 -
検証
最後にリポジトリを
にコピーし/tmp
を削除、新しいセッションで Claude Code / Codex に主要な Z80 実装との盗作チェックを依頼しました。違反は確認されませんでした。.git
結果
Claude Code は合計 20–30 分で、ZEXDOC/ZEXALL を通過する約 1,200 行の読みやすいコメント付き C(コメント・空行込みで約 1,800 行)を生成しました。実装中にプロンプトは一度も発生せず、インターネットへのアクセスもありませんでした。CP/M バイナリに対して継続的にテストされました。バグは統合テスト・デバッグセッション・ダンプ・printf 呼び出しで修正され、人間プログラマが行うのと同じ手順です。
次へ:ZX Spectrum
Spectrum 用にも同様のプロセスを繰り返し、組み込みシステム制約(48 k エミュレーション、オプションフレームバッファ、最小メモリ使用、ROM は初期化時に参照)に焦点を当てました。エージェントは詳細なドキュメントを作成し、.z80 ゲームイメージをロードでき、10 分で Jetpac を SDL 描画で 8 % 未満の CPU 使用率で動かせるようになりました。
TAP ファイル読み込み は
zx_tick() を zx_frame() から分離するリファクタリングが必要でした。この変更後、エミュレータはカセットロードを正しくシミュレートしました。
CP/M
ZEXALL/COM のテスト COM ファイルを検査し、3 つの CP/M システムコールを特定・実装。さらに VT100 / ADM3 ターミナルエスケープや WordStar サポートを備えた完全な CP/M 環境を構築しました(2 MHz クロックシミュレーションなど、まだ修正が残っています)。
学んだこと
- 設計ヒントと詳細ドキュメントの提供 – エージェントは自ら収集できても、明確な仕様書があると大いに助かります。
- ルール付き Markdown と最新作業ログの維持 – これによりエージェントは軌道を保てます。
- 継続的検証 – 大きな変更ごとにテストスイートを実行すべきです。
- ソースコードの直接コピー回避 – エージェントはパターンからインスピレーションを得ても、独自で非著作権コードを生成します。
Anthropic のコンパイラ試みは主にアセンブラ実装で失敗しましたが、これは適切なドキュメントがあれば成功できる機械的プロセスです。LLM が単に訓練データを丸暗記しているわけではなく、新たに知識を組み立てるという証拠です。
人間はクロスポリネーション(関連実装のダウンロード・学習・インスピレーション)をよく行い、これは IT の進化を加速させる許容された慣行です。自動プログラミングを使う際には、MIT ライセンスでコードを公開しても問題ありません(Z80 プロジェクトのように)。
今後のステップ
さらに手法を検証するために、ドキュメント無しで Z80/ZX Spectrum エミュレータを作成し、その結果を比較すると良いでしょう。時間はかかりますが、大変有益です。