# レトロPCエミュレータ共通ソースコード - 実装ドキュメント ## プロジェクト概要 このプロジェクトは、70以上の異なるレトロコンピュータシステムをエミュレートする共通ソースコードアーキテクチャです。作者の武田俊也氏によって開発され、1970年代から1990年代にかけての日本の主要なパーソナルコンピュータ、ゲーム機、専用システムを幅広くサポートしています。 ### 対応システム例 - **SHARP**: MZ-80シリーズ、X1シリーズ - **NEC**: PC-6001/8001/9801シリーズ、PC Engine - **FUJITSU**: FM-7/77シリーズ、FMRシリーズ - **CASIO**: PV-1000/2000、FP-1100など - **ASCII**: MSX1/2/2+ - **Nintendo**: Family BASIC - **SEGA**: Master System、Game Gear - 他多数 ## アーキテクチャ概要 ### 階層構造 ``` ┌─────────────────────────────┐ │ アプリケーション層 │ ← Win32/Qt/SDL対応 ├─────────────────────────────┤ │ エミュレーション層 │ ← EMU クラス ├─────────────────────────────┤ │ 仮想マシン抽象化層 │ ← VM_TEMPLATE ├─────────────────────────────┤ │ デバイス層 │ ← DEVICE 基底クラス ├─────────────────────────────┤ │ ハードウェアコア │ ← CPU/メモリ/I/O実装 └─────────────────────────────┘ ``` ### 主要コンポーネント 1. **デバイス指向アーキテクチャ**: 全てのハードウェアコンポーネントがDEVICEクラスから派生 2. **プラットフォーム抽象化**: OSDレイヤーによるOS固有機能の抽象化 3. **モジュラー設計**: 各システム固有のコンポーネントは独立したディレクトリに分離 4. **共通ハードウェアライブラリ**: CPU、チップセット、I/Oデバイスの共通実装 ## ディレクトリ構造 ### ルートディレクトリ ``` / ├── src/ # ソースコード ├── tool/ # 各システム用ツール (75システム分) ├── vc++2008/ # Visual Studio 2008プロジェクト ├── vc++2017/ # Visual Studio 2017プロジェクト ├── license/ # ライセンス情報 ├── history.txt # 変更履歴 (161KB) ├── readme.txt # プロジェクト説明書 └── readme_by_*.txt # 各開発者による説明書 ``` ### src/ ディレクトリ構造 ``` src/ ├── vm/ # 仮想マシン実装 │ ├── device.h/cpp # デバイス基底クラス │ ├── vm.h # VM定義統合ヘッダー │ ├── z80.h/cpp # Z80 CPU実装 │ ├── i8086.h/cpp # Intel 8086系CPU実装 │ ├── [system]/ # 各システム固有実装 (76ディレクトリ) │ └── [components]/ # 共通ハードウェアコンポーネント ├── win32/ # Windows固有実装 ├── qt/ # Qt固有実装 (推定) ├── sdl/ # SDL固有実装 (推定) ├── zlib-1.2.11/ # 圧縮ライブラリ ├── emu.h/cpp # エミュレーション統合インターフェース ├── common.h # 共通定義 ├── config.h # 設定管理 ├── fileio.h/cpp # ファイルI/O └── fifo.h/cpp # FIFOバッファ実装 ``` ## コアアーキテクチャの詳細 ### 1. デバイス基底クラス (DEVICE) `src/vm/device.h:46` で定義される基底クラスは、全てのハードウェアコンポーネントの基盤となります。 **主要機能:** - **デバイスチェーン管理**: 全デバイスの連結リスト構造 - **ライフサイクル管理**: initialize/release/reset - **状態管理**: save_state/load_state - **イベント管理**: プライマリイベントマネージャーとの連携 - **シグナル通信**: デバイス間の信号伝達 **シグナル定義例:** ```cpp // CPU関連シグナル #define SIG_CPU_IRQ 101 #define SIG_CPU_NMI 103 #define SIG_CPU_WAIT 106 // プリンタ関連シグナル #define SIG_PRINTER_DATA 201 #define SIG_PRINTER_STROBE 202 // SCSI関連シグナル #define SIG_SCSI_DAT 301 #define SIG_SCSI_BSY 302 ``` ### 2. 仮想マシンテンプレート (VM_TEMPLATE) 各システムは `src/vm/vm.h` で条件付きコンパイルによって選択されます。 **システム選択メカニズム:** ```cpp #ifdef _PC9801 #include "pc9801/pc9801.h" #endif #ifdef _MSX1 #include "msx/msx.h" #endif #ifdef _X1 #include "x1/x1.h" #endif ``` ### 3. エミュレーション統合レイヤー (EMU) `src/emu.h:89` で定義されるEMUクラスは、VM_TEMPLATEとOSDレイヤーを統合します。 **主要責務:** - **マルチプラットフォーム対応**: Qt/SDL/Win32の抽象化 - **デバッガ統合**: USE_DEBUGGER条件での統合 - **リソース管理**: VM/OSDインスタンスの管理 **プラットフォーム抽象化:** ```cpp #if defined(_USE_QT) #define OSD_QT #elif defined(_USE_SDL) #define OSD_SDL #elif defined(_WIN32) #define OSD_WIN32 #endif ``` ### 4. OSDレイヤー (OS Dependent) `src/win32/osd.h` で実装されるプラットフォーム固有機能: **主要機能:** - **DirectX統合**: DirectSound/DirectInput/Direct3D - **GDI+サポート**: 高品質グラフィックス描画 - **マルチスレッド対応**: Win32 APIベース - **ネットワーク**: WinSock対応 **技術仕様:** ```cpp #define DIRECTSOUND_VERSION 0x900 #define DIRECT3D_VERSION 0x900 #define DIRECTINPUT_VERSION 0x800 ``` ## CPU実装アーキテクチャ ### サポートCPU一覧 - **Z80系**: Z80, NSC800 - **Intel x86系**: 8086, 80286, 80386, 80486 - **Motorola 68xx系**: 6800, 6809 - **MOS Technology**: 6502 - **その他**: TMS9995, HuC6280など ### CPU実装例: Z80 `src/vm/z80.h:29` で定義されるZ80クラス: **主要特徴:** - **MAME 0.145ベース**: 高精度なタイミング実装 - **デバッガ対応**: ブレークポイント/ステップ実行 - **DMA対応**: シングルモードDMA統合 - **擬似BIOS**: Z80_PSEUDO_BIOSによる高速化 **デバイス接続:** ```cpp DEVICE *d_mem, *d_io, *d_pic; // メモリ/I/O/割り込みコントローラー #ifdef Z80_PSEUDO_BIOS DEVICE *d_bios; // 擬似BIOS #endif ``` ## ビルドシステム ### Visual Studio 2008/2017 対応 **プロジェクト構成:** - 76個の .vcproj/.vcxproj ファイル (各システム用) - 統合ビルドスクリプト: `build9.bat` (VS2008) / `build15.bat` (VS2017) - プラットフォーム: x86/x64対応 ### ビルド要件 **必須コンポーネント:** - Microsoft Visual C++ 2008 SP1 以降 - DirectX 9.0 SDK (December 2004推奨) - Windows SDK - dinput.lib (DirectX SDK) **ビルドプロセス:** 1. 各システムごとに個別ビルド 2. `build_xp/` フォルダに配置 3. Vista用マニフェスト適用 4. `binary_xp/` と `binary_vista/` に最終バイナリ ### 依存関係管理 **外部ライブラリ:** - **zlib 1.2.11**: 圧縮機能 - **DirectX SDK**: グラフィックス/サウンド/入力 - **Windows SDK**: システム統合 ## システム固有実装 ### 実装パターン 各システムは `src/vm/[system]/` ディレクトリに実装され、以下の共通パターンに従います: 1. **[system].h/cpp**: メインシステムクラス 2. **memory.h/cpp**: メモリ管理 3. **floppy.h/cpp**: フロッピーディスク制御 4. **keyboard.h/cpp**: キーボード制御 5. **display.h/cpp**: 表示制御 ### 実装例: PC-9801シリーズ **ディレクトリ構成:** ``` src/vm/pc9801/ ├── pc9801.h/cpp # メインシステム ├── display.h/cpp # 表示制御 (Neko Project 2ベース) ├── floppy.h/cpp # FD制御 ├── memory.h/cpp # メモリ管理 └── [その他コンポーネント] ``` **特徴:** - **EGC対応**: 高解像度グラフィックス (奥本氏の改良) - **98DOサポート**: PC-98DOの専用機能 - **SCSI対応**: ハードディスク接続 ## ハードウェアコンポーネントライブラリ ### 共通チップセット実装 **CPU支援チップ:** - **i8259**: プログラマブル割り込みコントローラー - **i8251**: UART (シリアル通信) - **i8255**: プログラマブル周辺インターフェース **メモリ・DMA:** - **upd765a**: フロッピーディスクコントローラー (M88ベース) - **upd71071**: DMAコントローラー (88VA Eternalベース) **グラフィックス:** - **upd7220**: グラフィックスディスプレイコントローラー (NP2ベース) - **hd63484**: 高機能グラフィックスコントローラー (MAMEベース) - **tms9918a**: ビデオディスプレイプロセッサー (MAMEベース) **サウンド:** - **sn76489an**: プログラマブルサウンドジェネレーター (MAMEベース) - **msm5205**: ADPCM音声合成LSI (MAMEベース) ### fmgenライブラリ統合 **FM音源エミュレーション:** - **作者**: CISC氏 (M88/fmgen) - **対応チップ**: YM2203, YM2608, YM2610 - **特徴**: 高精度なFM音源再現 ## データフォーマット対応 ### ディスクイメージ対応 - **D88**: 標準フロッピーディスクイメージ (64バンク対応) - **B77**: バブルメモリイメージ (16バンク対応) - **Teledisk**: TDLZHUFデコーダー - **CPDRead**: MESS formats/dsk_dsk.c使用 - **ImageDisk**: MESS formats/imd_dsk.c使用 ### カセットテープ対応 - **CAS**: fMSX cas形式 (MESS formats使用) - **独自形式**: 各システム固有フォーマット ### ROM管理 - **分散配置**: 各システムディレクトリにROM配置 - **パッチ機能**: システム固有の修正対応 - **マルチROM**: バリエーションサポート ## デバッグ・開発支援機能 ### 統合デバッガ ```cpp #ifdef USE_DEBUGGER class DEBUGGER; // CPU別デバッガインターフェース debugger_thread_t { EMU *emu; VM_TEMPLATE *vm; int cpu_index; bool running; }; #endif ``` **デバッグ機能:** - **ブレークポイント**: アドレス/条件指定 - **ステップ実行**: 命令単位/サイクル単位 - **メモリダンプ**: リアルタイム監視 - **レジスタ表示**: CPU状態表示 ### ログ出力システム ```cpp #ifdef _DEBUG_LOG #define _FDC_DEBUG_LOG // FDCデバッグ #define _SCSI_DEBUG_LOG // SCSIデバッグ #define _DMA_DEBUG_LOG // DMAデバッグ #define _IO_DEBUG_LOG // I/Oデバッグ #endif ``` ## パフォーマンス最適化 ### 高速化技術 1. **擬似BIOS**: 頻繁な ROM BIOS 呼び出しを高速化 2. **キャッシュ最適化**: メモリアクセスパターンの最適化 3. **イベント駆動**: 必要時のみコンポーネント更新 4. **並列処理**: マルチスレッド対応 ### メモリ管理最適化 - **バンク切り替え**: 高速なメモリマッピング - **遅延評価**: アクセス時のみメモリ初期化 - **共有リソース**: 同一ROM/RAMの共有 ## 拡張性・モジュラリティ ### プラグインアーキテクチャ - **Win32プラグイン**: `src/winplugin/` で実装 - **動的ロード**: 実行時コンポーネント追加 - **API抽象化**: プラットフォーム非依存インターフェース ### 設定管理システム ```cpp // src/config.h class CONFIG { // システム固有設定の統合管理 // INIファイル/レジストリ対応 // 動的設定変更サポート }; ``` ### 国際化対応 - **文字エンコーディング**: Shift_JIS/UTF-8対応 - **キーボードマッピング**: 各国キーボード対応 - **UI言語**: 英語/日本語対応 ## セキュリティ・安定性 ### エラーハンドリング - **例外安全**: RAII パターンの活用 - **リソースリーク防止**: スマートポインタ風実装 - **異常終了対策**: グレースフルシャットダウン ### メモリ安全性 - **境界チェック**: 配列アクセス検証 - **初期化保証**: メンバ変数の適切な初期化 - **ダングリングポインタ対策**: オブジェクトライフサイクル管理 ## ライセンス・帰属 ### プライマリライセンス - **GNU GPL v2以降**: 全体的なライセンス - **著作権**: 武田俊也氏 ### 第三者コンポーネント帰属 **MAME Project:** - i86/i286/i386, mc6800/6809, m6502, TMS9995, SN76489AN, TMS9918A - HD44102, HD63484, i8259, msm5205, sy6522, upd7801/7810, z80, z80dma **その他重要な帰属:** - **XM6/XM7/XM8**: PI.氏 (mb8877, DirectSound実装, 全体設計) - **M88**: CISC氏 (fmgen, upd765a, PC-8801実装) - **Neko Project 2**: Yui氏 (i8259, tms3631, upd7220, PC-9801表示) - **88VA Eternal**: Shinra氏 (upd71071) - **各システム専門家**: Artane.氏(FM-7), tanam氏(MSX/PC-6001), umaiboux氏(MSX2+) ## 今後の展望・拡張可能性 ### 技術的改善点 1. **モダンC++対応**: C++11/14/17機能活用 2. **64bit最適化**: x64アーキテクチャ最適化 3. **GPU活用**: シェーダーによる高速化 4. **ネットワーク機能**: リモートプレイ対応 ### 新システム対応 - **海外システム**: Commodore, Apple, Atari系 - **アーケード**: MAME連携強化 - **携帯ゲーム機**: Game Boy系統 - **16bit機**: PC Engine CD-ROM², メガドライブ ### 開発環境近代化 - **CMake対応**: クロスプラットフォームビルド - **CI/CD**: 自動ビルド・テスト - **パッケージ管理**: vcpkg/Conan統合 - **コード品質**: 静的解析ツール統合 --- ## 結論 このプロジェクトは、レトロコンピューティング分野における非常に包括的で技術的に優れた実装です。デバイス指向アーキテクチャによる高い拡張性、MAME等の実績あるコンポーネントの活用、そして多くの専門家による貢献により、70以上のシステムの高精度エミュレーションを実現しています。 プロジェクトの設計思想である「共通アーキテクチャによる多システム対応」は、エミュレーション技術の理想的な実装例として、今後の類似プロジェクトの参考となる価値を持っています。 **作成日**: 2024年11月5日 **文書バージョン**: 1.0 **基準ソースコード**: 最終更新 2024年4月28日版