--- nono/vm/vm.h 2026/04/29 17:04:28 1.1 +++ nono/vm/vm.h 2026/04/29 17:04:59 1.1.1.8 @@ -1,148 +1,69 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once #include "device.h" -#include "scsi.h" + +// VM 種別 +enum vmtype_t { + VMTYPE_NONE = 0, + VMTYPE_X68030, + VMTYPE_LUNA1, + VMTYPE_LUNA88K, +}; +// VM 種別 (ビットマスク表現) +enum vmf_t { + VMF_NONE = 0, + VMF_X68030 = (1 << VMTYPE_X68030), + VMF_LUNA1 = (1 << VMTYPE_LUNA1), + VMF_LUNA88K = (1 << VMTYPE_LUNA88K), + + VMF_LUNA = VMF_LUNA1 | VMF_LUNA88K, + VMF_M68K = VMF_X68030 | VMF_LUNA1, + VMF_M88K = VMF_LUNA88K, + VMF_ALL = 0xffffffff, +}; class VM { public: - // VM 種別 - enum vmtype_t { - TYPE_NONE = 0, - TYPE_X68030, - TYPE_LUNA, - TYPE_RXZ, // human68k .r .x .z console emulation - }; - - public: - VM(vmtype_t); + VM(); virtual ~VM(); + // 明示的な後始末 + void Dispose(); + // 動的なコンストラクション bool Create(); // 初期化 - bool Init(); + virtual bool Init(); // 設定の適用 bool Apply(); - // VM 種別を取得する。 - vmtype_t GetType() const { return vmtype; } - - // 電源ボタンを押す。 - // XXX この辺はもうちょっと検討したほうがいい + // 電源ボタンを押す。(UI スレッドから呼ばれる) virtual void PowerButton() = 0; // 電源ボタンの状態を取得する。 // モーメンタリスイッチの場合は常に false。 virtual bool IsPowerButton() const { return false; } - // VM の全デバイスの電源をオフ - bool DevicePowerOff(); - - // VM 電源オフ時のコールバックを設定する。(GUI から呼ばれる) - void SetPowerOffCallback(void (*callback)()); + // ブートページを ROM に切り替える + void SwitchBootPageToROM(Device *parent) { SwitchBootPage(parent, true); } + // ブートページを RAM に切り替える + void SwitchBootPageToRAM(Device *parent) { SwitchBootPage(parent, false); } - // 外部リセットボタンを押す。 - void ResetButton() { ResetHard(); } - - // ハードウェアリセット - void ResetHard(); - - // MPU の RESET 命令によるリセット - void ResetSoft(); + // MPU の RESET 命令によるリセット (機種ごとに異なるため) + virtual void ResetByMPU() { } 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; } - - private: - // 電源ボタンの状態。オンなら true。 - bool power_button = false; - - // デバイス - XIOSpaceDevice *xiospace = NULL; -}; - -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; + // ブートページを切り替える (内部用) + virtual void SwitchBootPage(Device *parent, bool isrom); }; -extern VM *gVM; +extern std::unique_ptr gVM;