--- nono/vm/device.h 2026/04/29 17:05:38 1.1.1.17 +++ nono/vm/device.h 2026/04/29 17:05:51 1.1.1.18 @@ -30,10 +30,56 @@ assert((bool)__CONCAT(p,NAME)); \ } while (0) +// ユーザ定義リテラルを使ったサフィックス + +// ナノ秒 +static inline constexpr uint64 operator"" _nsec(unsigned long long ns) +{ + return ns; +} +static inline constexpr uint64 operator"" _nsec(long double ns) +{ + return ns; +} + +// マイクロ秒 +static inline constexpr uint64 operator"" _usec(unsigned long long us) +{ + return us * 1000_nsec; +} +static inline constexpr uint64 operator"" _usec(long double us) +{ + return us * 1000_nsec; +} + +// ミリ秒 +static inline constexpr uint64 operator"" _msec(unsigned long long ms) +{ + return ms * 1000_usec; +} +static inline constexpr uint64 operator"" _msec(long double ms) +{ + return ms * 1000_usec; +} + +// 秒 +static inline constexpr uint64 operator"" _sec(unsigned long long sec) +{ + return sec * 1000_msec; +} +static inline constexpr uint64 operator"" _sec(long double sec) +{ + return sec * 1000_msec; +} + // 前方参照 +class Device; +class Event; class MainMPUDevice; class Scheduler; +using EventCallback_t = void (Device::*)(Event *); + class Device : public Object { using inherited = Object; @@ -97,12 +143,7 @@ class Device : public Object // // 8. StartThread() ... スレッド起動 // - // 9. Apply() ... 動的設定の適用 - // 実行中に変更可能なパラメータもここで一度適用する。 - // ここで適用するのは実行中に変更可能なパラメータのみ。 - // 適用内容を表示したい時は putlog(1) が妥当か。 - // - // 10. ResetHard(true) ... 電源オン + // 9. ResetHard(true) ... 電源オン // ログの初期化。 void EarlyInit(); @@ -123,12 +164,6 @@ class Device : public Object // 系でエラーメッセージを表示して false を返すこと。 virtual bool Init(); - // 現在の設定を VM に反映させる。 - // 成功すれば true を返す。失敗なら warn() 系、あるいは gConfig->Err() - // 系でエラーメッセージを表示して false を返すこと。 - // といっても false が返されたらどうするんだろうか。 - virtual bool Apply(); - // 電源オンもしくはリセット。 // true なら電源オン、false ならリセット。 // このデバイスがどのタイミングでリセットされるかは VM による。 @@ -198,40 +233,3 @@ class IODevice : public Device // 書き込み可能なら true、書き込み不可能なら false を返す。 virtual bool Poke1(uint32 addr, uint32 data); }; - -class BusErrDevice : public IODevice -{ - using inherited = IODevice; - public: - BusErrDevice(); - ~BusErrDevice() override; - - public: - busdata Read(busaddr addr) override; - busdata Write(busaddr addr, uint32 data) override; - busdata Peek1(uint32 addr) override; -}; - -// 何もしないデバイス。 -// 読み込むと全域で 0xff が読めて、書き込んでも何も起きない。 -class NopIODevice : public IODevice -{ - using inherited = IODevice; - public: - NopIODevice(); - ~NopIODevice() override; - - public: - busdata Read(busaddr addr) override; - busdata Write(busaddr addr, uint32 data) override; - busdata Read1(uint32 addr) override; - busdata Write1(uint32 addr, uint32 data) override; - busdata Peek1(uint32 addr) override; -}; - -static inline BusErrDevice *GetBusErrDevice() { - return Object::GetObject(OBJ_BUSERR); -} -static inline NopIODevice *GetNopIODevice() { - return Object::GetObject(OBJ_NOPIO); -}