--- nono/vm/syncer.cpp 2026/04/29 17:05:37 1.1.1.5 +++ nono/vm/syncer.cpp 2026/04/29 17:05:42 1.1.1.6 @@ -53,6 +53,18 @@ Syncer::Init() bool fast_mode = gConfig->Find("fast-mode").AsInt(); RequestFullSpeed(fast_mode); + // クロックの同期方法 + const ConfigItem& sync_item = gConfig->Find("clock-sync"); + auto clock_sync = sync_item.AsString(); + if (clock_sync == "real") { + sync_realtime = true; + } else if (clock_sync == "virtual") { + sync_realtime = false; + } else { + sync_item.Err(); + return false; + } + scheduler->ConnectMessage(MessageID::SCHEDULER_SYNCMODE, this, ToMessageCallback(&Syncer::ChangeModeMessage)); @@ -381,12 +393,18 @@ Syncer::PutlogRealtime() // モニタ更新の下請け (Scheduler から呼ばれる) int -Syncer::MonitorUpdateSub(TextScreen& screen, uint64 vtime) +Syncer::MonitorUpdateSub(TextScreen& screen, uint64 tmp_vtime) { int y = 0; - screen.Print(0, y, "Mode: 0x%04x (", mode); - switch (mode & SYNCMODE_CPU_MASK) { + // 一応ローカルコピー。 + uint32 tmp_mode = mode; + uint64 tmp_rtime = rtime; + uint64 sync_rt_delta = tmp_rtime - rtime_epoch; + uint64 sync_vt_delta = tmp_vtime - vtime_epoch; + + screen.Print(0, y, "Mode: 0x%04x (", tmp_mode); + switch (tmp_mode & SYNCMODE_CPU_MASK) { case SYNCMODE_CPU_NORMAL: screen.Puts(14, y, TA::Off, "Run"); break; @@ -397,36 +415,34 @@ Syncer::MonitorUpdateSub(TextScreen& scr screen.Puts(14, y, TA::On, "HALT"); break; } - if ((mode & SYNCMODE_SYNC)) { + if ((tmp_mode & SYNCMODE_SYNC)) { screen.Puts(19, y, TA::On, "Sync"); } else { screen.Puts(19, y, TA::Off, "Full"); } - screen.Puts(24, y, TA::OnOff((mode & SYNCMODE_BOOT)), "Boot"); - screen.Puts(29, y, TA::OnOff((mode & SYNCMODE_KEY)), "Key"); - screen.Puts(34, y, TA::OnOff((mode & SYNCMODE_POWEROFF)), "POff"); + screen.Puts(24, y, TA::OnOff((tmp_mode & SYNCMODE_BOOT)), "Boot"); + screen.Puts(29, y, TA::OnOff((tmp_mode & SYNCMODE_KEY)), "Key"); + screen.Puts(34, y, TA::OnOff((tmp_mode & SYNCMODE_POWEROFF)), "POff"); screen.Puts(38, y, ")"); y++; - uint64 rt = rtime; - uint64 vt = vtime; - auto s_rt = TimeToStr(rt); - auto s_vt = TimeToStr(vt); - std::string s_sync_rt {}; - std::string s_sync_vt {}; - if (mode != 0) { - uint64 sync_rt = rtime - rtime_epoch; - uint64 sync_vt = vtime - vtime_epoch; - s_sync_rt = TimeToStr(sync_rt); - s_sync_vt = TimeToStr(sync_vt); - } // 日まで表示しようとするときは桁位置を動かす - int width = std::max(rt, vt) < 86400_sec ? 20 : 25; + int width = std::max(tmp_rtime, tmp_vtime) < 86400_sec ? 20 : 25; - screen.Print(0, y++, "Total Real Time: %*s", width, s_rt.c_str()); - screen.Print(4, y++, "Virtual Time: %*s", width, s_vt.c_str()); - screen.Print(0, y++, "Sync Real Time: %*s", width, s_sync_rt.c_str()); - screen.Print(4, y++, "Virtual Time: %*s", width, s_sync_vt.c_str()); + std::string trt = TimeToStr(tmp_rtime); + std::string tvt = TimeToStr(tmp_vtime); + // 012345678901234567 + screen.Print(0, y++, "Total Real Time: %*s", width, trt.c_str()); + screen.Print(4, y++, "Virtual Time: %*s", width, tvt.c_str()); + screen.Puts(0, y + 0, "Sync Real Time:"); + screen.Puts(4, y + 1, "Virtual Time:"); + if (tmp_mode != 0) { + std::string srt = TimeToStr(sync_rt_delta); + std::string svt = TimeToStr(sync_vt_delta); + screen.Print(18, y + 0, "%*s", width, srt.c_str()); + screen.Print(18, y + 1, "%*s", width, svt.c_str()); + } + y += 2; screen.Puts(0, y, "Rating MPU Speed :"); uint clock_khz = mpu->GetClockSpeed();