/dmge

C++ / OpenSiv3D でゲームボーイエミュレータ

Primary LanguageC++MIT LicenseMIT

dmge - DMG Emulator

https://github.com/voidproc/dmge

C++ / OpenSiv3D でゲームボーイのエミュレータを作っています。

目次

概要

C++ / OpenSiv3D でゲームボーイのエミュレータを作っています。ゲームボーイの構造や動作原理、そしてエミュレータの開発に関する理解を深めるための、主に学習目的のプロジェクトです。

正確性や効率性、ユーザーインターフェースに関することの優先度は低く、特筆すべき機能もありません。そのため、何かのカートリッジイメージを動作させることが目的であれば、BGBSameBoy のような優れたエミュレータの使用をおすすめします。

開発環境

ダウンロード

使用方法

Windows 版

dmge.exe を起動してください。

Web 版

https://voidproc.github.io/dmge_web/

※ Web 版では、設定の保存/読み込みやセーブデータの保存/読み込みができないなどの制限があります

メニュー

右クリック、Escape キー、または左クリック長押しでメニューが表示されます。次に示す各種操作や設定変更を行うことができます。

  • リセット
  • カートリッジを開く(ダイアログ表示)
  • ポーズ(ステップ実行開始)
  • 画面サイズ変更(x1 ~ x8)
  • パレットカラーのプリセットを切替(DMG/SGB モード)
  • コントローラ設定(キーボード/ゲームパッドのボタン割り当て)
  • オーディオ有効/無効切替
  • オーディオチャンネル 1~4 のミュート切替
  • オーディオの LPF 有効/無効切替
  • デバッグモニタ表示切替
  • FPS 表示切替

メニューはキーボードまたはマウスで操作できます。

  • 選択: マウスホイール
  • 決定/値の変更: Enter左クリック
  • 値の変更(増減):
  • 戻る: Escape右クリック

キーボードショートカット

以下のキーボードショートカットが使用できます。

  • ボタン操作(カスタマイズ可能)
    • 4方向ボタン :
    • A ボタン : X
    • B ボタン : Z
    • Start ボタン : Enter
    • Select ボタン : BackSpace
  • ファイル
    • カートリッジを開くダイアログ表示 : Ctrl + O
    • リセット : Ctrl + R
  • レンダリング
    • パレットカラーのプリセットを切替(DMG/SGB モード) : Ctrl + L
  • オーディオ
    • チャンネル 1 のミュートを切替 : 1
    • チャンネル 2 のミュートを切替 : 2
    • チャンネル 3 のミュートを切替 : 3
    • チャンネル 4 のミュートを切替 : 4
    • オーディオ有効/無効切替 : 5
    • オーディオの LPF 有効/無効切替 : 6
  • デバッグ
    • デバッグモニタ表示切替 : F10
    • デバッグモニタのメモリダンプ対象アドレス設定 : Ctrl + M
    • ステップ実行を開始/終了 : Ctrl + P
    • ステップ実行 : F7
    • ステップ実行を終了 : F5
    • コンソールへ常に実行結果をダンプする : Ctrl + D

設定(config.ini

各種設定は起動時に config.ini から読み込まれ、アプリケーション終了時に上書き保存されます

設定変更は上記のメニューから行うことができます。または config.ini ファイルを直接編集することも可能です。

設定項目は次のとおりです(config.example.ini を参考にしてください)。

  • カートリッジ関連
    • CartridgePath : 読み込むカートリッジファイルのパス
    • OpenCartridgeDirectory : カートリッジを開くダイアログのデフォルトディレクトリ
    • DetectCGB : カートリッジが対応していれば CGB モードで実行する(1=有効、0=無効)
    • DetectSGB : カートリッジが対応していれば SGB モードで実行する(1=有効、0=無効)
    • BootROM : Bootstrap ROM のパス
  • 画面表示関連
    • Scale : 画面の表示倍率
    • ShowFPS : 画面上部にFPSを表示する(1=有効、0=無効)
    • PalettePreset : パレットカラーのプリセット番号(0~8、0番はカスタムカラー) (DMG/SGB)
    • PaletteColor0PaletteColor3 : カスタムカラー (DMG/SGB)
    • CGBColorGamma : CGB モードでのカラー補正(ガンマ値)
  • デバッグモニタ関連
    • ShowDebugMonitor : デバッグモニタを表示する(1=有効、0=無効)
  • 入力関連
    • Keyboard**** : キーボードの割り当て
      • KeyboardRight, KeyboardLeft, KeyboardUp, KeyboardDown, KeyboardA, KeyboardB, KeyboardSelect, KeyboardStart
    • GamepadButton**** : ゲームパッドのボタン割り当て
      • GamepadButtonA, GamepadButtonB, GamepadButtonSelect, GamepadButtonStart
  • オーディオ関連
    • EnableAudioLPF : オーディオにローパスフィルタを適用する(1=有効、0=無効)
    • AudioLPFConstant : ローパスフィルタの定数(0~1)
  • デバッグ関連
    • ShowConsole : コンソールを表示する(1=有効、0=無効)
    • Breakpoint : ブレークポイント(コンマ区切りで複数指定可能)
    • MemoryWriteBreakpoint : メモリ書き込み時ブレークポイント(コンマ区切りで複数指定可能)
    • BreakOnLDBB : LD B,B 実行時にブレークする(1=有効、0=無効)
    • EnableBreakpoint : 上記ブレークポイントの有効/無効の切替(1=有効、0=無効)
    • DumpAddress : ブレーク時のメモリダンプ先アドレス(コンマ区切りで複数指定可能)
    • TraceDumpStartAddress : トレースダンプを開始するアドレス(コンマ区切りで複数指定可能)
    • LogFilePath : トレースダンプなどの出力先のパス
    • TestMode : テスト ROM 実行モード(1=有効、0=無効)

実装状況

  • CPU
    • 一般的な命令の実装
    • テスト ROM (cpu_instrs / instr_timing) による検証
    • STOP
      • 倍速モード (CGB) の切り替え
      • STOP 状態の遷移
  • MBC
    • ROM Only
    • MBC1 (マルチカートを除く)
    • MBC2
    • MBC3
      • RTC
      • MBC30
    • MBC5 (Rumble を除く)
    • HuC1 (赤外線通信を除く)
    • その他
  • PPU
    • DMG
    • CGB
    • テスト ROM (dmg-acid2 / cgb-acid2) による検証
  • APU
    • ひととおりの機能の実装
    • テスト ROM (dmg_sound) による検証
  • Joypad
    • キーボードによる操作
    • ゲームパッドによる操作
  • シリアル通信
    • 相手がいない場合の内部クロック通信・割り込み
    • それ以外
  • その他
    • SGB
      • 一部の SGB コマンドに対応
        • PAL 系(PAL_PRI を除く)
        • ATTR_***
        • MASK_EN, MLT_REQ
      • カラー表示
      • ボーダー
    • Bootstrap ROM の読み込み
      • DMG
      • CGB
    • Joypad 割り込み
    • 倍速モード (CGB)
    • その他

スクリーンショット

View more...

ZELDA

HOSHINOKA-BI

menu

テスト ROM 実行結果

Test Result
✅ blarg/​cpu_instrs cpu_instrs
✅ blarg/instr_timing instr_timing
✅ blarg/interrupt_time interrupt_time
❌ blarg/dmg_sound Failed: 03#3, 05#4, 07#5, 09, 10, 12
✅ acid/dmg-acid2 dmg-acid2
✅ acid/cgb-acid2 cgb-acid2
✅ ax6/​rtc3test-1 rtc3test_basic
✅ ax6/​rtc3test-2 rtc3test_range
✅ ax6/​rtc3test-3 rtc3test_subsec
✅ mooneye/​acceptance/​timer Pass
✅ mooneye/manual-only/sprite_priority sprite_priority