--- nono/vm/vm.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/vm.h 2026/04/29 17:05:49 1.1.1.15 @@ -1,148 +1,58 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// VM (基本クラス) // #pragma once #include "device.h" -#include "scsi.h" class VM { + protected: + explicit VM(const char *vmname_); public: - // VM 種別 - enum vmtype_t { - TYPE_NONE = 0, - TYPE_X68030, - TYPE_LUNA, - TYPE_RXZ, // human68k .r .x .z console emulation + enum CreationPhase : bool { + First = false, + Second = true, }; public: - VM(vmtype_t); virtual ~VM(); + // 明示的な後始末 + void Dispose(); + // 動的なコンストラクション - bool Create(); + bool Create(CreationPhase); // 初期化 bool Init(); - // 設定の適用 - bool Apply(); - - // VM 種別を取得する。 - vmtype_t GetType() const { return vmtype; } - - // 電源ボタンを押す。 - // XXX この辺はもうちょっと検討したほうがいい - virtual void PowerButton() = 0; - - // 電源ボタンの状態を取得する。 - // モーメンタリスイッチの場合は常に false。 - virtual bool IsPowerButton() const { return false; } - - // VM の全デバイスの電源をオフ - bool DevicePowerOff(); - - // VM 電源オフ時のコールバックを設定する。(GUI から呼ばれる) - void SetPowerOffCallback(void (*callback)()); + // スレッド開始 + bool StartThread(); - // 外部リセットボタンを押す。 - void ResetButton() { ResetHard(); } - - // ハードウェアリセット - void ResetHard(); - - // MPU の RESET 命令によるリセット - void ResetSoft(); + // VM 名取得 (ウィンドウタイトル用) + const char *GetVMName() const { return vmname; } protected: - // VM の全デバイスの電源をオン - bool DevicePowerOn(); - - vmtype_t vmtype {}; - BusErrDevice *buserr = NULL; - void (*poweroff_callback)() = NULL; -}; - -class VM_X68030 : public VM -{ - typedef VM inherited; - public: - VM_X68030(); - virtual ~VM_X68030(); - - // 電源ボタンを押す - virtual void PowerButton(); - - // 電源ボタンの状態を取得。オンなら true。 - bool IsPowerButton() const { return power_button; } + std::unique_ptr pDebugger {}; + std::unique_ptr pEventManager {}; + std::unique_ptr pKeyboard {}; + std::unique_ptr pMainbus {}; + std::unique_ptr pMPU {}; + std::unique_ptr pNMI {}; + std::unique_ptr pPower {}; + std::unique_ptr pRenderer {}; + std::unique_ptr pScheduler {}; + std::unique_ptr pSignalThread {}; + std::unique_ptr pSyncer {}; private: - // 電源ボタンの状態。オンなら true。 - bool power_button = false; - - // デバイス - XIOSpaceDevice *xiospace = NULL; + const char *vmname {}; // VM 機種名(表示名) }; - -class VM_LUNA : public VM -{ - typedef VM inherited; - public: - VM_LUNA(); - virtual ~VM_LUNA(); - - // 電源ボタンを押す。 - virtual void PowerButton(); - - private: - // デバイスマップ用の識別子 - enum { - NONE, - BUSERR, - RAM, - PROM, - MK48, - PIO0, - PIO1, - SIO, - TAS, - SYSCLK, - ZRAM, - MROM, - BITMAP, - BT454, - CRTC2, - SCSI, - LANCE, - }; - - CRTC2Device *crtc2 = NULL; - MK48T02Device *mk48 = NULL; - PIO0Device *pio0 = NULL; - PIO1Device *pio1 = NULL; - SysClkDevice *sysclk = NULL; - MaskROMDevice *maskrom = NULL; - NullDevice *nulldev = NULL; - - static const uint8 maptable[256]; -}; - -class VM_RXZ : public VM -{ - typedef VM inherited; - public: - VM_RXZ(const char *file, const char *arg); - virtual ~VM_RXZ(); - - // 電源ボタンを押す。 - virtual void PowerButton(); - - private: - Human68k *human68k = NULL; -}; - -extern VM *gVM;