--- nono/vm/mpu64180.cpp 2026/04/29 17:05:50 1.1.1.7 +++ nono/vm/mpu64180.cpp 2026/04/29 17:06:00 1.1.1.8 @@ -29,17 +29,17 @@ MPU64180Device::MPU64180Device() // レジスタモニター reg_monitor = gMonitorManager->Regist(ID_MONITOR_XPREG, this); - reg_monitor->func = ToMonitorCallback(&MPU64180Device::MonitorUpdateReg); + reg_monitor->SetCallback(&MPU64180Device::MonitorScreenReg); reg_monitor->SetSize(38, 6); // I/O モニター io_monitor = gMonitorManager->Regist(ID_MONITOR_XPIO, this); - io_monitor->func = ToMonitorCallback(&MPU64180Device::MonitorUpdateIO); + io_monitor->SetCallback(&MPU64180Device::MonitorScreenIO); io_monitor->SetSize(55, 20); // 割り込みモニター intr_monitor = gMonitorManager->Regist(ID_MONITOR_XPINTR, this); - intr_monitor->func = ToMonitorCallback(&MPU64180Device::MonitorUpdateIntr); + intr_monitor->SetCallback(&MPU64180Device::MonitorScreenIntr); intr_monitor->SetSize(64, 18); } @@ -59,11 +59,8 @@ MPU64180Device::putlogn(const char *fmt, int len; vt = scheduler->GetVirtTime(); - len = snprintf(buf, sizeof(buf), "%4u.%03u'%03u'%03u %04x %s ", - (uint)(vt / 1000 / 1000 / 1000), - (uint)((vt / 1000 / 1000) % 1000), - (uint)((vt / 1000) % 1000), - (uint)(vt % 1000), + len = snprintf(buf, sizeof(buf), "%16s %04x %s ", + SecToStr(vt).c_str(), GetPPC(), GetName().c_str()); @@ -111,9 +108,9 @@ MPU64180Device::Init() } // 6.144MHz = 162.76… [nsec] であり、変数導入前は 163 をハードコード // して使っていたので、それとの互換性のため四捨五入する。 - clock_nsec = 1000 * 1000 * 10 / clock_khz; - clock_nsec = (clock_nsec + 5) / 10; - if (clock_nsec < 1) { + clock_tsec = 10_msec / clock_khz; + clock_tsec = (clock_tsec + 5) / 10; + if (clock_tsec < 1) { xp_clock_item.Err("Clock speed too high"); return false; } @@ -260,7 +257,7 @@ MPU64180Device::EnterNormal() SetTrace(debugger->IsTrace()); // 3 クロック後から通常サイクル開始? (HD647180.pdf, p23) - exec_event->time = 3 * clock_nsec; + exec_event->time = 3 * clock_tsec; scheduler->RestartEvent(exec_event); } @@ -284,7 +281,7 @@ MPU64180Device::EnterWakeup() { // 復帰処理のため一旦 Wakeup へ。 SetExec(ToEventCallback(&MPU64180Device::ExecWakeup)); - exec_event->time = 3 * clock_nsec; + exec_event->time = 3 * clock_tsec; scheduler->StartEvent(exec_event); } @@ -336,8 +333,9 @@ MPU64180Device::SetExec(EventCallback_t { exec_func = new_exec; - if (exec_event->func != ToEventCallback(&MPU64180Device::ExecTrace)) { - exec_event->func = exec_func; + auto execTrace = ToEventCallback(&MPU64180Device::ExecTrace); + if (exec_event->GetCallback() != execTrace) { + exec_event->SetCallback(exec_func); } } @@ -345,14 +343,11 @@ MPU64180Device::SetExec(EventCallback_t void MPU64180Device::SetTrace(bool enable) { - EventCallback_t func; - if (enable) { - func = ToEventCallback(&MPU64180Device::ExecTrace); + exec_event->SetCallback(&MPU64180Device::ExecTrace); } else { - func = exec_func; + exec_event->SetCallback(exec_func); } - exec_event->func = func; } // IX/IY 分を考慮したサイクル数 @@ -487,7 +482,7 @@ MPU64180Device::SetSYSCALLCallback(void } void -MPU64180Device::MonitorUpdateReg(Monitor *, TextScreen& screen) +MPU64180Device::MonitorScreenReg(Monitor *, TextScreen& screen) { screen.Clear(); @@ -541,7 +536,7 @@ MPU64180Device::opmode_names[] = { }; void -MPU64180Device::MonitorUpdateIO(Monitor *, TextScreen& screen) +MPU64180Device::MonitorScreenIO(Monitor *, TextScreen& screen) { int y; uint32 val; @@ -606,11 +601,10 @@ MPU64180Device::MonitorUpdateIO(Monitor y++; for (int ch = 0; ch < timer.size(); ch++) { auto& t = timer[ch]; - uint64 reload_nsec = t.reload * clock_nsec * 20; - screen.Print(4, y++, "Timer%u: Count=$%04x Reload=$%04x(%6u.%03u usec)", + uint64 reload_tsec = t.reload * clock_tsec * 20; + screen.Print(4, y++, "Timer%u: Count=$%04x Reload=$%04x(%10.3f usec)", ch, t.count, t.reload, - (uint)(reload_nsec / 1000), - (uint)(reload_nsec % 1000)); + (double)reload_tsec / 1000); } screen.Print(0, y++, "18H FRC = $%02x", PeekFRC()); @@ -631,7 +625,7 @@ MPU64180Device::MonitorUpdateIO(Monitor } void -MPU64180Device::MonitorUpdateIntr(Monitor *, TextScreen& screen) +MPU64180Device::MonitorScreenIntr(Monitor *, TextScreen& screen) { static const struct { uint offset;