--- nono/vm/newsctlr.cpp 2026/04/29 17:05:38 1.1.1.5 +++ nono/vm/newsctlr.cpp 2026/04/29 17:05:42 1.1.1.6 @@ -44,6 +44,7 @@ #include "ethernet.h" #include "interrupt.h" #include "scheduler.h" +#include "syncer.h" #include "textscreen.h" // コンストラクタ @@ -65,6 +66,9 @@ NewsCtlrDevice::Init() { dipsw = GetDipswDevice(); + // クロックの同期方法。 + sync_rt = GetSyncer()->GetSyncRealtime(); + // ステータス読み出しのためにキャストしたのを持っておく interrupt = dynamic_cast(GetInterruptDevice()); assert(interrupt); @@ -79,7 +83,7 @@ NewsCtlrDevice::Init() memcpy(&oidrom[8], &macaddr, sizeof(macaddr)); timer_event.func = ToEventCallback(&NewsCtlrDevice::TimerCallback); - timer_event.time = 10_msec; + timer_event.time = TIMER_PERIOD; timer_event.SetName("SystemTimer"); scheduler->RegistEvent(timer_event); @@ -99,6 +103,9 @@ NewsCtlrDevice::ResetHard(bool poweron) // たぶん電源オンで即起動? 知らんけど。 if (poweron) { + if (sync_rt) { + stime = GetSyncer()->GetRealTime(); + } scheduler->StartEvent(timer_event); } } @@ -317,8 +324,13 @@ NewsCtlrDevice::TimerCallback(Event& ev) timer_intr = true; ChangeInterrupt(); - // XXX clock-sync はまた後ほど - scheduler->RestartEvent(ev); + // 足す前は前回の割り込み発生時刻なので period を足すと現在時刻。 + if (sync_rt) { + stime += TIMER_PERIOD; + scheduler->StartRealtimeEvent(ev, stime, TIMER_PERIOD); + } else { + scheduler->RestartEvent(ev); + } } // 割り込み信号線の状態を変える