--- nono/vm/mpu88xx0.cpp 2026/04/29 17:04:42 1.1.1.4 +++ nono/vm/mpu88xx0.cpp 2026/04/29 17:04:45 1.1.1.5 @@ -13,17 +13,14 @@ std::unique_ptr gMPU88200ATC[2]; // コンストラクタ -MPU88xx0Device::MPU88xx0Device(uint32 addr) +MPU88xx0Device::MPU88xx0Device(uint32 reset_vector) { monitor_size = nnSize(79, 18); - // リセットベクタアドレスは Reset() で指定するので保持しておく - reset_vector = addr; - - cpu.reset(new m88kcpu()); + cpu.reset(new m88kcpu(reset_vector)); // リセット例外イベントコールバック設定 - reset_event.func = (DeviceCallback_t)&MPU88xx0Device::ResetCallback; + event.func = (DeviceCallback_t)&MPU88xx0Device::Callback; // LUNA88K では CMMU の ID は次のように割り振ってあるようだ。 // OpenBSD の sys/arch/luna68k/include/board.h より。 @@ -51,16 +48,29 @@ MPU88xx0Device::~MPU88xx0Device() { } +bool +MPU88xx0Device::Init() +{ + // 親クラス + if (inherited::Init() == false) { + return false; + } + // MPU クロックは親 Init() で読み込んで、ここで cpu にセットする + cpu->SetClockSpeed(clock_khz); + + return true; +} + // リセット例外イベントコールバック void -MPU88xx0Device::ResetCallback(Event& ev) +MPU88xx0Device::Callback(Event& ev) { - cpu->Reset(reset_vector); + cpu->RequestReset(); } // アクセスウェイトを加算 void -MPU88xx0Device::AddCycle(uint64 cycle) +MPU88xx0Device::AddCycle(int32 cycle) { // 今アクセスしてきている(= バスマスターの) CMMU に対して加算する m88200 *cmmu = m88200::GetBusMaster(); @@ -70,15 +80,9 @@ MPU88xx0Device::AddCycle(uint64 cycle) // Interrupt void -MPU88xx0Device::Interrupt(Object *src, int level) +MPU88xx0Device::Interrupt(int level) { - // XXX: なぜか 1 レベルずれている? - level++; - if (gSysCtlr->GetIntMask(0) & (1 << level)) { - putlog(1, "Interrupt from %s", src->devname.c_str()); - gSysCtlr->TellIntLevel(0, 1 << level); - cpu->Interrupt(); - } + cpu->Interrupt(level); } // モニター更新 @@ -165,7 +169,6 @@ MPU88xx0Device::MonitorUpdate(TextScreen monitor.Print(x, y++, "vbr (cr7):%08x", reg.vbr); // MMU レジスタ(下段) - x = 0; y = 15; for (int i = 0; i <= 2; i++) { int dt = 8 + i * 3;