--- nono/vm/vm_luna.cpp 2026/04/29 17:04:56 1.1.1.7 +++ nono/vm/vm_luna.cpp 2026/04/29 17:05:11 1.1.1.10 @@ -4,8 +4,12 @@ // Licensed under nono-license.txt // +// +// VM (LUNA) +// + #include "vm_luna.h" -#include "aout.h" +#include "bus.h" #include "bt454.h" #include "busio.h" #include "cmmu.h" @@ -22,7 +26,9 @@ #include "mk48t02.h" #include "mpu680x0.h" #include "mpu88xx0.h" +#include "nmi.h" #include "pio.h" +#include "power.h" #include "prom.h" #include "ram.h" #include "ram_partial.h" @@ -67,6 +73,9 @@ enum { // コンストラクタ VM_LUNA::VM_LUNA() { + // RTC epoch は NetBSD/luna68k, OpenBSD/luna88k をデフォルトにしておく。 + gConfig->SetDefault("rtc-epoch-year", 1970); + // この機種に不要なパラメータはここで削除する // (機種が決まるより前に全機種の設定の和集合を用意してあるため)。 // o LUNA-I は 68881 固定なので不要。 @@ -74,7 +83,7 @@ VM_LUNA::VM_LUNA() gConfig->Delete("mpu-has-fpu"); // LUNA 共通だしここで作成しておく - gNopIO.reset(new NopIODevice()); + NEWDV(NopIO, new NopIODevice()); } // デストラクタ @@ -89,25 +98,25 @@ VM_LUNA::MakeDevtable(const uint8 *mapta for (uint i = 0; i < countof(::devtable); i++) { IODevice *d; switch (maptable[i]) { - case NONE: d = gNopIO.get(); break; - case BUSERR: d = gBusErr.get(); break; - case PROM: d = prom.get(); break; - case MK48: d = gRTC.get(); break; - case PIO0: d = gPIO0.get(); break; - case PIO1: d = gPIO1.get(); break; - case SIO: d = gSIO.get(); break; - case TAS: d = gTAS.get(); break; - case SYSCLK: d = gSysClk.get(); break; - case ZRAM: d = gZRAM.get(); break; - case MROM: d = gNopIO.get(); break; - case LUNAFB: d = gLunafb.get(); break; - case BT454: d = gBT454.get(); break; - case CRTC2: d = gCRTC2.get(); break; - case SCSI: d = gSPC.get(); break; - case LANCE: d = gEthernet.get(); break; - case FUSE: d = gFuseROM.get(); break; - case SYSCTL: d = gInterrupt.get(); break; - case CMMU: d = gCMMU.get(); break; + case NONE: d = gNopIO; break; + case BUSERR: d = gBusErr; break; + case PROM: d = gPROM; break; + case MK48: d = gRTC; break; + case PIO0: d = gPIO0; break; + case PIO1: d = gPIO1; break; + case SIO: d = gSIO; break; + case TAS: d = gTAS; break; + case SYSCLK: d = gSysClk; break; + case ZRAM: d = gZRAM; break; + case MROM: d = gNopIO; break; + case LUNAFB: d = gPlaneVRAM; break; + case BT454: d = gBT454; break; + case CRTC2: d = gCRTC2; break; + case SCSI: d = gSPC; break; + case LANCE: d = gEthernet; break; + case FUSE: d = gFuseROM; break; + case SYSCTL: d = gInterrupt; break; + case CMMU: d = gCMMU; break; default: __unreachable(); } @@ -129,14 +138,17 @@ VM_LUNA::Init() int i = 0; while (ram_size_MB >= 16) { // 16MB あれば RAM が直接担当 - ::devtable[i++] = gRAM.get(); + ::devtable[i++] = gRAM; ram_size_MB -= 16; } // 16MB 未満なら PartialRAM が担当 if (ram_size_MB > 0) { - ::devtable[i] = gPartialRAM.get(); + ::devtable[i] = gPartialRAM; } + // ブートページ切り替え用に覚えておく + ram0 = ::devtable[0]; + return true; } @@ -149,8 +161,7 @@ VM_LUNA::PowerButton() // ON PUSH (何も起きない) // OFF PUSH 電源オン - // スケジューラに指示 - gScheduler->RequestPowerOn(); + gPower->MakePowerOn(); } // ブートページを切り替える。 @@ -164,9 +175,11 @@ VM_LUNA::SwitchBootPage(Device *parent, // 思うけど、具体的にどの範囲が切り替わるのかを知る方法がないのと // 大して副作用もないので、先頭の 1ブロックをまるごと切り替えておく。 if (isrom) { - ::devtable[0] = prom.get(); + ::devtable[0x00] = gPROM0; + ::devtable[0x41] = gPROM0; } else { - ::devtable[0] = gRAM.get(); + ::devtable[0x00] = ram0; + ::devtable[0x41] = gPROM; } } @@ -273,32 +286,33 @@ VM_LUNA1::VM_LUNA1() // デバイス (順序に注意) // BusErrDevice, NopIODevice は親コンストラクタで作成済み。 - gMPU.reset(new MPU680x0Device()); // required by Scheduler - gScheduler.reset(new Scheduler()); // required by * - gInterrupt.reset(new LunaInterrupt()); - gRAM.reset(new RAMDevice()); // required by PartialRAM - gPartialRAM.reset(new PartialRAMDevice()); - gEthernet.reset(new BusIO_W()); // required by PROM - if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) { - prom.reset(new Luna1PROMEmuDevice()); + NEWDV(MPU, new MPU680x0Device()); + NEWDV(Interrupt, new LunaInterrupt()); + NEWDV(RAM, new RAMDevice()); // required by PartialRAM + NEWDV(PartialRAM, new PartialRAMDevice()); + NEWDV(Ethernet, new BusIO_W()); // required by PROM + if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) { + NEWDV(PROM, new Luna1PROMEmuDevice()); } else { - prom.reset(new PROMDevice()); + NEWDV(PROM, new PROMDevice()); } - gRTC.reset(new BusIO_B()); - gPIO0.reset(new BusIO_B()); - gPIO1.reset(new BusIO_B()); - gSIO.reset(new BusIO_BB()); - gSysClk.reset(new BusIO_B()); - gTAS.reset(new BusIO_B()); - gZRAM.reset(new ZRAMDevice()); - gLunafb.reset(new LunafbDevice()); // required by BT454 - gBT454.reset(new BusIO_B()); - gCRTC2.reset(new BusIO_B()); - gSPC.reset(new BusIO_BBBB()); - - gLCD.reset(new LCDDevice()); - gKeyboard.reset(new LunaKeyboard()); - gRenderer.reset(new LunaRenderer()); + NEWDV(PROM0, new PROM0Device()); + NEWDV(RTC, new BusIO_B()); // required by Sysclk + NEWDV(PIO0, new BusIO_B()); + NEWDV(PIO1, new BusIO_B()); + NEWDV(SIO, new BusIO_BB()); + NEWDV(SysClk, new BusIO_B()); + NEWDV(TAS, new BusIO_B()); + NEWDV(ZRAM, new ZRAMDevice()); + NEWDV(PlaneVRAM, new LunafbDevice()); // required by BT454 + NEWDV(BT454, new BusIO_B()); + NEWDV(CRTC2, new BusIO_B()); + NEWDV(SPC, new BusIO_BBBB()); + + NEWDV(NMI, new NMIDevice()); + NEWDV(LCD, new LCDDevice()); + NEWDV(Keyboard, new LunaKeyboard()); + NEWDV(Renderer, new LunaRenderer()); // デバイスマップから devtable を作成 MakeDevtable(maptable); @@ -309,6 +323,7 @@ VM_LUNA1::~VM_LUNA1() { } + // // LUNA88K // @@ -376,34 +391,35 @@ VM_LUNA88K::VM_LUNA88K() // デバイス (順序に注意) // BusErrDevice, NopIODevice は親コンストラクタで作成済み。 - gMPU.reset(new MPU88xx0Device()); // required by Scheduler - gScheduler.reset(new Scheduler()); // required by * - gInterrupt.reset(new SysCtlrDevice()); - gRAM.reset(new RAMDevice()); // required by PartialRAM - gPartialRAM.reset(new PartialRAMDevice()); - if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) { - prom.reset(new Luna88kPROMEmuDevice()); + NEWDV(MPU, new MPU88xx0Device()); + NEWDV(Interrupt, new SysCtlrDevice()); + NEWDV(RAM, new RAMDevice()); // required by PartialRAM + NEWDV(PartialRAM, new PartialRAMDevice()); + NEWDV(Ethernet, new BusIO_WF()); // required by FuseROM + NEWDV(FuseROM, new BusIO_BFFF()); + if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) { + NEWDV(PROM, new Luna88kPROMEmuDevice()); } else { - prom.reset(new PROMDevice()); + NEWDV(PROM, new PROMDevice()); } - gRTC.reset(new BusIO_BFFF()); - gPIO0.reset(new BusIO_BFFF()); - gPIO1.reset(new BusIO_BFFF()); - gSIO.reset(new BusIO_BFFF()); - gSysClk.reset(new BusIO_BFFF()); - gTAS.reset(new BusIO_BFFF()); - gZRAM.reset(new ZRAMDevice()); - gLunafb.reset(new LunafbDevice()); // required by BT454 - gBT454.reset(new BusIO_B()); - gCRTC2.reset(new BusIO_BFFF()); - gSPC.reset(new BusIO_BFFF()); - gEthernet.reset(new BusIO_WF()); // required by FuseROM - gFuseROM.reset(new BusIO_BFFF()); - gCMMU.reset(new CMMUDevice()); - - gLCD.reset(new LCDDevice()); - gKeyboard.reset(new LunaKeyboard()); - gRenderer.reset(new LunaRenderer()); + NEWDV(PROM0, new PROM0Device()); + NEWDV(RTC, new BusIO_BFFF()); + NEWDV(PIO0, new BusIO_BFFF()); + NEWDV(PIO1, new BusIO_BFFF()); + NEWDV(SIO, new BusIO_BFFF()); + NEWDV(SysClk, new BusIO_BFFF()); + NEWDV(TAS, new BusIO_BFFF()); + NEWDV(ZRAM, new ZRAMDevice()); + NEWDV(PlaneVRAM, new LunafbDevice()); // required by BT454 + NEWDV(BT454, new BusIO_B()); + NEWDV(CRTC2, new BusIO_BFFF()); + NEWDV(SPC, new BusIO_BFFF()); + NEWDV(CMMU, new CMMUDevice()); + + NEWDV(NMI, new NMIDevice()); + NEWDV(LCD, new LCDDevice()); + NEWDV(Keyboard, new LunaKeyboard()); + NEWDV(Renderer, new LunaRenderer()); // デバイスマップから devtable を作成 MakeDevtable(maptable);