HN 日本語サマリー

← 一覧へ戻る
プログラミング

MartyPC – サイクル精度を持つIBM PC/XTエミュレータ

MartyPC – A Cycle-Accurate IBM PC/XT Emulator (github.com)

17 pointsby yitchelle2 コメント

要約

MartyPCは、IBM PC/XTおよび互換機向けのサイクル精度を持つエミュレータです。Rustでゼロから開発され、デバッグツールやロギング機能が豊富に搭載されており、レトロPC開発の補助を目的としています。CPUや各種ハードウェアの正確なエミュレーションに重点が置かれており、多くのデモプログラムやOSが動作可能です。

全文翻訳

MartyPCは、初期のIBM PCおよび互換機のエミュレータです。Windows、Linux、macOSをサポートしています。

MartyPCをウェブブラウザで試す!

ユーザーガイド

MartyPCユーザーガイドはこちら

MartyPCのダウンロード

ビルドは、定期的なリリースから入手できます。より新しい自動ビルドは、Actionsタブの各ワークフロー実行のArtifactsから利用可能です(ArtifactsをダウンロードするにはGitHubにログインする必要があります)。

MartyPCのビルド

Windows以外の環境を使用している場合や、最新の最先端バージョンを使用したい場合は、ソースからMartyPCをビルドする必要があります。

  • 最終リリースバージョン: 0.4.1
  • 現在の開発バージョン: 0.5.0

ビルド手順については、MartyPC Wikiの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は8088 V2テストスイートを99.9997%のサイクル精度でパスします。

ペリフェラルエミュレーションを改善するため、広範なハードウェア調査も行われました。これには、Arduinoを使用した8253タイマーチップの調査、オシロスコープによるDMAタイミングの調査、そして最終的にはロジックアナライザを使用したバススニファの構築が含まれます。

2023年4月、MartyPCは悪名高いPCデモである8088 MPHを実行できるほどの精度になりました。

[画像: 8008mph01]

2023年5月、MartyPCはPCデモArea 5150のすべてのエフェクトをエミュレートできる最初のPCエミュレータとなりました。(ビデオはこちら: https://www.youtube.com/watch?v=zADeLm9g0Zg)

[画像: 8008mph01]

機能

現在、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からタイミングが調整されていないため、完全なサイクル精度ではなく、実際のCPUほどのパフォーマンスはありません。ネイティブモードのV20命令はすべて実装されており、ハードウェアに対して正確性がテスト済み。
  • システムハードウェア:
    • 8255 PPI - PPIとキーボードシフトレジスタを介した低レベルのキーボードエミュレーションをサポート。TurboXTクローンに見られる「ターボビット」をサポート。
    • 8259 PIC - ほぼ完成していますが、優先度ローテーションやネストモードなどの高度な機能はまだ欠けています。
    • 8253 PIT - 高精度で、PCMオーディオをサポート。
    • 8237 DMAC - ほぼ実装されていますが、DMA転送は現在「偽装」されています。DRAMリフレッシュDMAはスケジューリングシステムを使用してシミュレートされます。
    • 8250 UART - シリアルパススルーまたはマウスエミュレーションをサポート。
    • ゲームポート - 各2つのボタンを持つ2つのアナログジョイスティックをサポート。
    • パラレルポート - 基本的なパラレルポートは検出される程度にエミュレートされていますが、まだ実用的な機能はありません。
  • ビデオデバイス:
    • CGA - Motorola MC6845 CRTCコントローラを含むIBM CGAの動的なサイクルまたはキャラクタークロック実装により、MartyPCは8088MPHやArea5150のような要求の厳しいPCデモを実行できます。MartyPCは、オーバーキャンを含むディスプレイフィールド全体をシミュレートするという、PCビデオカードエミュレーションにおけるユニークなアプローチを取っています。コンポジット出力とモニターシミュレーションは、reenigne氏の優れたコンポジット変換コード(DOSBoxや86Boxでも使用)を介してサポートされています。
    • TGA - PCJrおよびTandy Graphics Video Gate Arrayのキャラクタークロック実装。開発中。
    • MDA - Motorola MC6845 CRTCコントローラ上に構築されたIBM MDAカードのキャラクタークロック実装。
    • Hercules - 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がエミュレートされており、私の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ハードディスクサポートと736KBのメモリバックフィルを提供します。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アダプタで駆動されるセカンダリモニターを実行することもできます。各ディスプレイビューポートは、独立したシェーダー構成を受け取ることができます。

[画像: dualhead]

設定サポート

MartyPCは、ベースマシンの設定プロファイルと、「オーバーレイ」と呼ばれるオプションの拡張機能(拡張カードやその他のアップグレードのインストールに似ています)を介したカスタムマシン構成をサポートしています。

デバッグサポート

MartyPCには、命令逆アセンブル、CPU状態、メモリビューア、さまざまなペリフェラル状態を含むいくつかの便利なディスプレイを備えた、包括的なデバッグGUIがあります。コードブレークポイントとメモリブレークポイントがサポートされています。MartyPCは、命令ベースおよびサイクルベースのロギングもサポートしています。

[画像: debugger01]

シェーダーサポート

基本的な設定可能なCRTシェーダーが含まれており、今後さらに追加される予定です(LibraShaderサポートが計画されています)。

[画像: shaders01]

スクリーンショット

さらに多くのスクリーンショットは、Wikiのスクリーンショットギャラリーセクションをご覧ください!

特別な感謝

感謝すべき人々はたくさんいます(Aboutボックスを参照!)、しかし特にreenigne氏の貢献に言及したいと思います。彼の8088マイクロコードのリバースエンジニアリング作業なしには、このエミュレータは決して実現しなかったでしょう。また、Ken Shirriff氏と彼の素晴らしいブログにも感謝したいと思います。そこでは、8086(そして拡張して8088)のシリコンロジックの多くがカバーされています。

JetbrainsによるMartyPCへのJetbrains製品ライセンス提供に感謝します。

[画像: JetBrains logo.]