--- nono/vm/mpu88xx0.cpp 2026/04/29 17:04:39 1.1.1.3 +++ nono/vm/mpu88xx0.cpp 2026/04/29 17:04:42 1.1.1.4 @@ -22,6 +22,9 @@ MPU88xx0Device::MPU88xx0Device(uint32 ad cpu.reset(new m88kcpu()); + // リセット例外イベントコールバック設定 + reset_event.func = (DeviceCallback_t)&MPU88xx0Device::ResetCallback; + // LUNA88K では CMMU の ID は次のように割り振ってあるようだ。 // OpenBSD の sys/arch/luna68k/include/board.h より。 // @@ -48,14 +51,23 @@ MPU88xx0Device::~MPU88xx0Device() { } -// リセット -// (MPU が動くのはこの後 Scheduler::Run() を発行した後) +// リセット例外イベントコールバック void -MPU88xx0Device::ResetHard() +MPU88xx0Device::ResetCallback(Event& ev) { cpu->Reset(reset_vector); } +// アクセスウェイトを加算 +void +MPU88xx0Device::AddCycle(uint64 cycle) +{ + // 今アクセスしてきている(= バスマスターの) CMMU に対して加算する + m88200 *cmmu = m88200::GetBusMaster(); + assert(cmmu); + cmmu->AddCycle(cycle); +} + // Interrupt void MPU88xx0Device::Interrupt(Object *src, int level) @@ -145,12 +157,12 @@ MPU88xx0Device::MonitorUpdate(TextScreen // 制御レジスタ(右中) x = 55; y = 9; - monitor.Print(x, y++, "ssbr(cr3):%08x", reg.ssbr); - monitor.Print(x, y++, "vbr (cr7):%08x", reg.vbr); for (int i = 0; i < 4; i++) { int rn = 17 + i; - monitor.Print(x, y + i, "sr%d(cr%d):%08x", i, rn, reg.cr[rn]); + monitor.Print(x, y++, "sr%d(cr%d):%08x", i, rn, reg.cr[rn]); } + monitor.Print(x, y++, "ssbr(cr3):%08x", reg.ssbr); + monitor.Print(x, y++, "vbr (cr7):%08x", reg.vbr); // MMU レジスタ(下段) x = 0;