--- nono/vm/sysclk.cpp 2026/04/29 17:05:20 1.1.1.13 +++ nono/vm/sysclk.cpp 2026/04/29 17:05:24 1.1.1.14 @@ -25,7 +25,7 @@ SysClkDevice::SysClkDevice() : inherited(OBJ_SYSCLK) { monitor.func = ToMonitorCallback(&SysClkDevice::MonitorUpdate); - monitor.SetSize(31, 2); + monitor.SetSize(31, 3); monitor.Regist(ID_MONITOR_SYSCLK); event.func = ToEventCallback(&SysClkDevice::Callback); @@ -49,8 +49,9 @@ SysClkDevice::Init() interrupt = GetInterruptDevice(); // クロックは機種ごとに異なる - const ConfigItem& item = gConfig->Find("!sysclk-period"); - period = item.AsInt(); + const ConfigItem& item = gConfig->Find("!sysclk-freq"); + freq = item.AsInt(); + period = 1_sec / freq; event.time = period; // クロックの同期方法 @@ -70,29 +71,32 @@ SysClkDevice::ResetHard(bool poweron) } // 電源オンですぐ起動 - sysint = false; scheduler->RestartEvent(event); } + + // さすがに割り込みネゲートくらいするよな? + sysint = false; + ChangeInterrupt(); } -uint64 +busdata SysClkDevice::Read(uint32 offset) { // 1 ポートしかない return GetInt(); } -uint64 +busdata SysClkDevice::Write(uint32 offset, uint32 data) { // 何か書き込まれたら、フラグをクリア putlog(3, "Clear system clock interrupt"); sysint = false; - interrupt->NegateINT(this); + ChangeInterrupt(); return 0; } -uint64 +busdata SysClkDevice::Peek(uint32 offset) { return GetInt(); @@ -107,6 +111,7 @@ SysClkDevice::MonitorUpdate(Monitor *, T y = 0; int width = stime < 86400_sec ? 20 : 25; + screen.Print(0, y++, "Freq: %d Hz", freq); screen.Print(0, y++, "Sync: %s", sync_rt ? "Real Time" : "Virtual Time"); screen.Print(0, y++, "Time: %*s", width, TimeToStr(stime).c_str()); } @@ -134,7 +139,7 @@ SysClkDevice::Callback(Event& ev) stime += period; sysint = true; - interrupt->AssertINT(this); + ChangeInterrupt(); if (sync_rt) { scheduler->StartRealtimeEvent(ev, stime, period); @@ -142,3 +147,10 @@ SysClkDevice::Callback(Event& ev) scheduler->StartEvent(ev); } } + +// 割り込み信号線の状態を変える。 +void +SysClkDevice::ChangeInterrupt() +{ + interrupt->ChangeINT(this, sysint); +}