プログラミング
MartyPC – サイクル精度を持つIBM PC/XTエミュレータ
MartyPC – A Cycle-Accurate IBM PC/XT Emulator (github.com)
要約
MartyPCは、IBM PC/XTおよび互換機向けのサイクル精度を持つエミュレータです。Rustでゼロから開発され、デバッグツールやロギング機能が豊富に搭載されており、レトロPC開発の補助を目的としています。CPUや各種ハードウェアの正確なエミュレーションに重点が置かれており、多くのデモプログラムやOSが動作可能です。
全文翻訳
MartyPCは、初期のIBM PCおよび互換機のエミュレータです。Windows、Linux、macOSをサポートしています。WebブラウザでMartyPCを試してみてください!
ユーザーガイド ここをクリックしてMartyPCユーザーガイドにアクセスしてください
MartyPCのダウンロード periodic releases を通じてビルドが利用可能です。Actions タブの各ワークフロー実行のArtifactsから、より新しい自動ビルドを入手できます(ArtifactsをダウンロードするにはGitHubにログインする必要があります)。
MartyPCのビルド Windows以外の環境、または最新のbleeding-edgeバージョンが必要な場合は、ソースからMartyPCをビルドする必要があります。MartyPC WikiのBuilding MartyPCガイドでビルド手順を確認してください。
なぜ別のPCエミュレータなのか? MartyPCは、Rustプログラミング言語を学びながら、エミュレータを一から書けるかどうかを見るための趣味のプロジェクトとして始まりました。MartyPCの当初の目標は控えめでしたが、想像もできなかったレベルの機能に到達しました。MartyPCがエミュレーションの世界で意図するニッチは、レトロPC開発の補助です。デバッグツールやロギング機能が豊富に搭載されており、さらに多くの機能が計画されています。他のエミュレータほどセットアップが簡単ではないかもしれませんが、設定ファイルを編集することに慣れているなら、大きな問題はないはずです。Intel 8088向けにソフトウェアを書くプログラマーは、コードの正確なサイクルごとの実行を確認し、測定できます。
精度 MartyPCの開発は2022年4月に始まりました。2022年11月に、MartyPCの8088 CPUエミュレーションをサイクル精度にする作業を開始しました。そのために、Arduino MEGAマイクロコントローラに接続された実際の8088 CPUに対してCPUの動作を検証しました。詳細については、私のArduino8088プロジェクトを参照してください。これにより、命令をエミュレータと実際のCPUで同時に実行し、実行結果をサイクルごとに比較できます。このプロセスに関する詳細は、私のブログで説明されています。2024年6月、8088のプリフェッチキューをサポートするために、8088テストスイートを再度更新しました。さらに多くのサイクル不正確さが発見され、修正されました。MartyPCは、99.9997%のサイクル精度で8088 V2テストスイートをパスします。ペリフェラルエミュレーションを改善するために、広範なハードウェアリサーチも行われました。これには、Arduinoを使用した8253タイマーチップの調査、オシロスコープを使用したDMAタイミングの調査、そして最終的にはロジックアナライザを使用したバススニファーの構築が含まれます。2023年4月、MartyPCは悪名高いPCデモ、8088 MPHを実行できるほど正確になりました。2023年5月、MartyPCはPCデモArea 5150のすべてのエフェクトをエミュレートできる最初のPCエミュレータとなりました。(ビデオはこちら:https://www.youtube.com/watch?v=zADeLm9g0Zg)
機能 現在、MartyPCは以下のシステムをエミュレートできます:
* IBM Model 5150 (PC)
* IBM Model 5160 (XT)
* Generic Turbo XT
* IBM PCjr
* Tandy 1000
デバイスサポート MartyPCは以下のデバイスをエミュレートします:
CPU:Intel 8088 - 非同期BIU、プロセッサ命令キュー、プリフェッチロジックを含むIntel 8088のサイクル精度実装。ハードウェアに対して正確性とサイクル精度がテストされています。
NEC V20 - NEC V20 CPUの予備的な実装。サイクルベースですが、ベースとして使用された8088からのタイミングが調整されていないため、完全なサイクル精度ではなく、実際のパフォーマンスでもありません。すべてのネイティブモードV20命令が実装されており、ハードウェアに対して正確性がテストされています。
システムハードウェア:
8255 PPI - 低レベルのキーボードエミュレーションがPPIとキーボードシフトレジスタを介してサポートされています。TurboXTクローンに見られる「ターボビット」をサポートします。
8259 PIC - ほぼ完了していますが、優先度ローテーションやネストモードなどの高度な機能はまだ欠けています。
8253 PIT - PCMオーディオをサポートする、非常に正確な実装です。
8237 DMAC - ほぼ実装されていますが、DMA転送は現在「偽装」されています。DRAMリフレッシュDMAはスケジューリングシステムを使用してシミュレートされます。
8250 UART - シリアルパススルーまたはマウスエミュレーションをサポートします。
ゲームポート - 各2つのボタンを持つ2つのアナログジョイスティックをサポートします。
パラレルポート - 基本的なパラレルポートが検出される程度にエミュレートされていますが、まだ実用的な目的には機能しません。
ビデオデバイス:
CGA - IBM CGAの動的なサイクルまたはキャラクタークロック実装(Motorola MC6845 CRTCコントローラを含む)により、MartyPCは8088MPHやArea5150のような要求の厳しいPCデモを実行できます。MartyPCは、オーバースキャンを含むディスプレイフィールド全体をシミュレートするという、PCビデオカードエミュレーションにおける独自のНа abordagemを採用しています。reenigneの優れたコンポジット変換コード(DOSBoxや86Boxでも使用)を介して、コンポジット出力とモニターシミュレーションがサポートされています。
TGA - PCjrおよびTandy Graphics Video Gate Arrayのキャラクタークロック実装。開発中。
MDA - Motorola MC6845 CRTCコントローラ上に構築されたIBM MDAカードのキャラクタークロック実装。
Hercule - MDAデバイスは、Hercules Graphics Adapterのエミュレーションをオプションでサポートします。
EGA - IBM EGAのキャラクタークロック実装は、CGA開発で使用された技術を基盤としています。元のハードウェア上の各LSIチップの論理機能を再現するように構造化されています。再定義可能なフォント、vsync割り込み、スムーズなスクロールのためのスキャンラインごとのピクセルパンニングをサポートします。
VGA - IBM VGAカードのエミュレーションは開発中ですが、Mode 13hやMode Xなどのグラフィックスモードは動作しています。
サウンドデバイス:
PCスピーカー - 実際には独自のサウンドデバイスではありません。PCスピーカーはMartyPCのタイマーチップエミュレーションによって駆動されます。8088MPH、Area5150、Magic Mushroomなどのデモで、かなりの品質のPWMオーディオを生成できます。
Adlib - 元のAdlib Music Synthesizerがエミュレートされており、my opl3-rsバインディングを介してnuked-opl3によるOPL2エミュレーションが提供されます。これはCPU負荷が高いため、高速なコンピュータが必要です。
SN76489 - Tandy 1000シリーズおよびIBM PCjrに見られる3ボイスサウンドチップがエミュレートされています。各チャンネルのUVメーターとオシロスコープビューを提供する便利なデバッグディスプレイが付いています。
Disney Sound Source - Disney Sound Sourceは、16サンプルのFIFOとボリュームノブを備えた安価なパラレルDACでした。対応するゲームは多くありませんが、対応している数少ないタイトルではうまく機能します。
ストレージデバイス:
µPD765 FDC - 現在、DOSとMinixの両方のオペレーティングシステムをサポートするのに十分な堅牢性があります。MartyPCは私のディスクイメージライブラリfluxfoxを使用しており、これにより幅広いPCディスクイメージフォーマットをサポートできます。MartyPCのFDCエミュレーションはまだ私が望むほど正確ではありませんが、適切なフォーマットのディスクイメージがあれば、多くのコピープロテクトされたタイトルをサポートできます。
IBM/Xebec 20MB HDC - 基本的なVHDサポートでエミュレートされています。MartyPCは現在、このコントローラを使用する場合、20MBの単一ディスクジオメトリをサポートしています。
XT-IDE - XT-IDE Rev 2ボードのエミュレーションにより、MartyPCは幅広いハードディスクフォーマットをサポートできます。このエミュレーションはまだ初期段階であり、多少粗い部分があるかもしれません。すべてのATAコマンドが実装されているわけではありません。
jr-IDE - jr-IDEのエミュレーションは、IBM PCjrマシンにIDEハードディスクサポートと736Kのメモリバックフィルを提供します。RTCやフラッシュなどの他の機能はまだ実装されていません。
PCjrカートリッジ - PCjrカートリッジROMは、JrRipCart(.JRC)フォーマットでサポートされています。
メモリ拡張デバイス:
LoTech 2MB EMSカード - LoTech EMSボードを介して2MBのEMSメモリが利用可能です。
汎用メモリ拡張カード - ISAバスまたはPCjr SideCar拡張スロット用にメモリ拡張カードを定義できます。
入力デバイス:
キーボードサポート - IBM Model F、Tandy 1000、PCjrキーボードがエミュレートされています。
シリアルマウス - 標準のMicrosoftシリアルマウスを任意のCOMポートに接続できます。
ジョイスティック - ゲームポートジョイスティックは、設定可能なキーボードコントロールを介してエミュレートされます。
ライトペン - CGAカードおよびPCjr用にライトペンがエミュレートされています。
デュアルヘッドサポート MartyPCはデュアルビデオカードおよびマルチモニター構成をサポートしており、MDAまたはHerculesアダプタで駆動されるセカンダリモニターを、同じウィンドウ内でも実行できます。各ディスプレイビューポートは、独立したシェーダー構成を受け取ることができます。
設定サポート MartyPCは、ベースマシン構成プロファイルpを介してカスタムマシン構成をサポートしています。