--- nono/vm/vm.h 2026/04/29 17:04:28 1.1 +++ nono/vm/vm.h 2026/04/29 17:05:13 1.1.1.10 @@ -1,148 +1,74 @@ // // 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" + +// ヘッダの依存関係を減らすための細工。 +// o pNAME はメンバ変数としてヘッダで宣言してあるが、vm*.h で各デバイスヘッダ +// を include したくないので、派生型ではなく Device* の unique_ptr にしたい。 +// o gNAME は各デバイスヘッダが持つ派生型のグローバルポインタ。 +// ベース型ではなく派生型で参照したい。また使いたい人が使いたいヘッダだけを +// include すれば済むよう、vm*.h とは切り離したい。 +#define NEWDV(NAME, NEW_CTOR) do { \ + __CONCAT(p,NAME).reset(NEW_CTOR); \ + __CONCAT(g,NAME) = \ + (decltype(__CONCAT(g,NAME)))(__CONCAT(p,NAME).get()); \ +} while (0) 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 StartThread(); // 設定の適用 bool Apply(); - // VM 種別を取得する。 - vmtype_t GetType() const { return vmtype; } - - // 電源ボタンを押す。 - // XXX この辺はもうちょっと検討したほうがいい - virtual void PowerButton() = 0; + // ブートページを ROM に切り替える + void SwitchBootPageToROM(Device *parent) { SwitchBootPage(parent, true); } + // ブートページを RAM に切り替える + void SwitchBootPageToRAM(Device *parent) { SwitchBootPage(parent, false); } - // 電源ボタンの状態を取得する。 - // モーメンタリスイッチの場合は常に false。 - virtual bool IsPowerButton() const { return false; } - - // VM の全デバイスの電源をオフ - bool DevicePowerOff(); - - // VM 電源オフ時のコールバックを設定する。(GUI から呼ばれる) - void SetPowerOffCallback(void (*callback)()); - - // 外部リセットボタンを押す。 - 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(); + // ブートページを切り替える (内部用) + virtual void SwitchBootPage(Device *parent, bool isrom); - private: - Human68k *human68k = NULL; + std::unique_ptr pBusErr {}; + std::unique_ptr pDebugger {}; + std::unique_ptr pInterrupt {}; + std::unique_ptr pKeyboard {}; + std::unique_ptr pMPU {}; + std::unique_ptr pNMI {}; + std::unique_ptr pPower {}; + std::unique_ptr pRenderer {}; + std::unique_ptr pRAM {}; + std::unique_ptr pScheduler {}; + std::unique_ptr pSignalThread {}; + std::unique_ptr pSync {}; }; extern VM *gVM;