--- nono/vm/vm.h 2026/04/29 17:04:59 1.1.1.8 +++ nono/vm/vm.h 2026/04/29 17:05:09 1.1.1.9 @@ -4,6 +4,10 @@ // Licensed under nono-license.txt // +// +// VM (基本クラス) +// + #pragma once #include "device.h" @@ -28,6 +32,18 @@ enum vmf_t { VMF_ALL = 0xffffffff, }; +// ヘッダの依存関係を減らすための細工。 +// 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: @@ -43,6 +59,9 @@ class VM // 初期化 virtual bool Init(); + // スレッド開始 + bool StartThread(); + // 設定の適用 bool Apply(); @@ -59,11 +78,24 @@ class VM void SwitchBootPageToRAM(Device *parent) { SwitchBootPage(parent, false); } // MPU の RESET 命令によるリセット (機種ごとに異なるため) - virtual void ResetByMPU() { } + virtual void ResetByMPU(); protected: // ブートページを切り替える (内部用) virtual void SwitchBootPage(Device *parent, bool isrom); + + 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 std::unique_ptr gVM; +extern VM *gVM;