--- nono/vm/sysclk.h 2026/04/29 17:04:45 1.1.1.5 +++ nono/vm/sysclk.h 2026/04/29 17:05:29 1.1.1.11 @@ -4,41 +4,73 @@ // Licensed under nono-license.txt // +// +// LUNA システムクロック +// + #pragma once #include "device.h" -#include "scheduler.h" +#include "event.h" +#include "monitor.h" + +class InterruptDevice; -class SysClkDevice - : public IODevice +class SysClkDevice : public IODevice { using inherited = IODevice; public: SysClkDevice(); - virtual ~SysClkDevice() override; + ~SysClkDevice() override; bool Init() override; - bool PowerOn() override; + void ResetHard(bool poweron) override; + + uint GetFreq() const { return freq; } protected: // BusIO インタフェース static const uint32 NPORT = 1; - uint64 Read(uint32); - uint64 Write(uint32, uint32); - uint64 Peek(uint32); + busdata ReadPort(uint32 offset); + busdata WritePort(uint32 offset, uint32 data); + busdata PeekPort(uint32 offset); + bool PokePort(uint32 offset, uint32 data); private: // イベントコールバック void Callback(Event& ev); + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + // 割り込み状態をレジスタイメージにして返す uint8 GetInt() const; + // 割り込み信号線の状態を変える。 + void ChangeInterrupt(); + // システムクロック割り込み有りなら true。 bool sysint {}; // 割り込みイベント - Event event {}; + Event event { this }; + + // システムクロック周波数 [Hz] + uint freq {}; + + // 本来のイベント間隔。機種によって異なる。 + uint64 period {}; + + // システムクロックが刻んでいる時刻 + uint64 stime {}; + + // システムクロックを実時間に同期する場合 true + bool sync_rt {}; + + InterruptDevice *interrupt {}; + + Monitor monitor { this }; }; -extern std::unique_ptr gSysClk; +static inline SysClkDevice *GetSysClkDevice() { + return Object::GetObject(OBJ_SYSCLK); +}