Cヘッダーファイルだけで8ビットコンピュータを作る方法
Commodore 64やZX Spectrumのエミュレーターを書こうと思ったことがあるなら、普通はZ80やMOS 6502のプロセッサーマニュアルを длина時間かけて読み込み、タイミングを実装し、グラフィック出力との連携に苦労することになるでしょう。しかし、別の手法を提供するプロジェクトがあります——ブレッドボード上でキットを組み立てるように扱うアプローチです。
今回紹介するのは、開発者flooohによるchipsリポジトリです。純粋なCで書かれた8ビットチップエミュレーターと完成システムのコレクションです。主な特徴は、すべてがヘッダーファイルにパックされている(ヘッダーオンリー)ことで、コンポーネント間の相互作用が実際の物理ピンを模倣しています。
このプロジェクトの核心
コードを書くとき、私たちはオブジェクト、メソッド、コールバックに慣れています。chipsでは、すべてが異なった方法で動作します。著者はピンビットマスクの概念を導入しました。各チップには64ビット数値を受け取る関数があり、この数値の各ビットは特定のチップの「足」の状態を表します:アドレスバス、データバス、読み取り/書き込み信号、または割り込みです。
マスクを入力として与えると、関数はチップの1クロックサイクルを計算し、更新されたマスクを返します。コンピュータを構築するには、コード内で文字通り「配線」を引き、一方のチップの出力マスクから他方のチップの入力マスクへビットをコピーします。はんだごてを使ったことがある人や古いハードウェアの回路図を読んだことがある人なら、これは驚くほど論理的と感じられるでしょう。
箱の中身
このリポジトリには、ホームコンピュータの黄金時代からのハードウェアの十分なコレクションが含まれています。
まずはプロセッサから—— классики: Z80、6502、8080があります。それらに加えて、コンピュータが起動するために不可欠な周辺チップもあります。例えば、i8259割り込みコントローラー、i8253タイマー、MC6845ビデオコントローラーです。
個々のコンポーネントに加えて、著者は完成したアセンブリもプロジェクトに含めています。以下を実行できます:
- Amstrad CPC 464/6128
- Commodore 64
- ZX Spectrum 48/128
- Acorn Atom
- そしてソ連のRK-86さえ(というより、8080ベースの近縁モデル)
これらすべては、GCC、Clang、さらにはMSVCが問題なく処理できるC99サブセットで書かれています。外部依存関係なし——適切なヘッダーファイルをインクルードするだけです。
技術的な仕組み
ピンのシミュレーションにおける「純粋さ」の追求にもかかわらず、著者はパフォーマンスのための賢明な妥協点を設けていません。各ロジックゲートを正直にシミュレートすれば、エミュレーターは最高スペックのハードウェアでもゆっくりと動作するでしょう。そのため、システムエミュレーターでのアドレスデコードは多くの場合簡略化されています。
テストの扱い方も興味深いです。メインリポジトリにはテストはなく、それらは別プロジェクトにあります。使用例もそこにあります。ブラウザで何ができるか見たいなら、著者はWebAssemblyにコンパイルされたデモを用意しています。非常に高速に動作し、ヘッダーオンリーアプローチの実行可能性を確認できます。
実践的な利点
готовых эмуляторовが数十也存在するのに、なぜ現代の 개발자에게このプロジェクトが必要でしょうか?
第一に、カスタマイズされた specialized ツールを作成するための理想的な基盤です。古いプロセッサ用のコードをデバッグしたり、カスタムデバッガーを書いたりする必要がある場合、chipsは готовую, テスト済み、非常にコンパクトな基盤を提供します。
第二に、コンピュータアーキテクチャの優れた教科書です。乾燥した理論を読む代わりに、コードにブレークポイントを置くだけで、プロセッサからメモリへデータがバスを通じて流れる様子を正確に確認できます。
第三に、プロジェクトは組み込みシステム愛好家にも有用です。依存関係がなくリソース要件が低いため、これらのエミュレーターはマイクロコントローラー上で実行でき、「コンピュータ内のコンピュータ」を作成できます。
試してみる価値はあるか
レトロコンピューティングのファン、または美しく簡潔なCコードが好きな人なら、chipsリポジトリをチェックする価値はあります。ビットマスクアーキテクチャは、エミュレーションという古い問題への新鮮なアプローチです。
プロジェクトは生きており、アクティブに更新され、メンテナンスされています。当然、README自体のドキュメントは fairly 簡潔ですが、コードは非常にクリーンに書かれているため、自分で理解するのは容易です。もっと深く掘り下げたい人のために、著者は付随するリポジトリで回路図とマニュアルのコレクションもコンパイルしています。
注意点——これは一般ユーザー向けの「プラグアンドプレイ」ライブラリではありません。画面に画像を表示するには、SokolやSDLなどのグラフィックバックエンドをアタッチし、エミュレートされたビデオメモリからピクセルへデータを変換する方法を理解する必要があります。しかし、システムの「内脏」を掘り下げるのが好きな人にとっては、これはマイナスよりもプラスの要因です。
関連プロジェクト