--- nono/vm/mainbus_luna.cpp 2026/04/29 17:05:25 1.1 +++ nono/vm/mainbus_luna.cpp 2026/04/29 17:05:42 1.1.1.4 @@ -87,9 +87,7 @@ LunaMainbus::LunaMainbus() NEWDV(BusErr, new BusErrDevice()); NEWDV(NopIO, new NopIODevice()); - // 2MB ずつ 32bit 全域。 - acc.resize(2048); - monitor_accstat.SetSize(80, 2 + 32); + accstat_monitor->SetSize(80, 2 + 32); } // デストラクタ @@ -125,7 +123,7 @@ LunaMainbus::MakeDevtable(const uint8 *m case FUSE: d = GetFuseROMDevice(); break; case CMMU: d = GetCMMUDevice(); break; default: - PANIC("corrupted maptable[%d]=%d", i, maptable[i]); + PANIC("corrupted maptable[%u]=%d", i, maptable[i]); } devtable[i] = d; } @@ -139,7 +137,7 @@ LunaMainbus::InitMainbus() auto partial = dynamic_cast(pPartialRAM.get()); // RAM は容量が確定した後のここで配置。 - int ram_size_MB = mainram->GetSizeMB(); + uint ram_size_MB = mainram->GetSizeMB(); int i = 0; while (ram_size_MB >= 16) { // 16MB あれば RAM が直接担当 @@ -293,14 +291,9 @@ Luna1Mainbus::Luna1Mainbus() NEWDV(SIO, new BusIO_BB()); NEWDV(TAS, new BusIO_B()); NEWDV(SubRAM, new SubRAMDevice(128)); - NEWDV(BT45x, new BT45xDevice()); // required by Lunafb - NEWDV(PlaneVRAM, new LunafbDevice()); NEWDV(CRTC2, new BusIO_B()); NEWDV(SPC, new BusIO_BBBB()); NEWDV(Ethernet, new BusIO_W()); - - // デバイスマップから devtable を作成 - MakeDevtable(maptable); } // デストラクタ @@ -308,6 +301,25 @@ Luna1Mainbus::~Luna1Mainbus() { } +// 動的なコンストラクション +bool +Luna1Mainbus::Create() +{ + int nplane = BT45xDevice::GetConfigPlaneCount(); + if (nplane < 0) { + return false; + } + if (nplane == 8) { // required by Lunafb + NEWDV(BT45x, new BusIO_BFFF()); + } else { + NEWDV(BT45x, new BusIO_B()); + } + NEWDV(PlaneVRAM, new LunafbDevice()); + + // 全部揃ったここで、デバイスマップから devtable を作成。 + MakeDevtable(maptable); + return true; +} // // LUNA-88K @@ -428,18 +440,33 @@ Luna88kMainbus::Luna88kMainbus() NEWDV(SIO, new BusIO_BFFF()); NEWDV(TAS, new BusIO_BFFF()); NEWDV(SubRAM, new SubRAMDevice(128)); - NEWDV(BT45x, new BT45xDevice()); // required by Lunafb - NEWDV(PlaneVRAM, new LunafbDevice()); NEWDV(CRTC2, new BusIO_BFFF()); NEWDV(SPC, new BusIO_BFFF()); NEWDV(Ethernet, new BusIO_WF()); NEWDV(CMMU, new CMMUDevice()); - - // デバイスマップから devtable を作成 - MakeDevtable(maptable); } // デストラクタ Luna88kMainbus::~Luna88kMainbus() { } + +// 動的なコンストラクション +bool +Luna88kMainbus::Create() +{ + int nplane = BT45xDevice::GetConfigPlaneCount(); + if (nplane < 0) { + return false; + } + if (nplane == 8) { // required by Lunafb + NEWDV(BT45x, new BusIO_BFFF()); + } else { + NEWDV(BT45x, new BusIO_B()); + } + NEWDV(PlaneVRAM, new LunafbDevice()); + + // 全部揃ったここで、デバイスマップから devtable を作成。 + MakeDevtable(maptable); + return true; +}