--- nono/vm/vm_luna.cpp 2026/04/29 17:04:50 1.1.1.5 +++ nono/vm/vm_luna.cpp 2026/04/29 17:04:59 1.1.1.8 @@ -6,7 +6,6 @@ #include "vm_luna.h" #include "aout.h" -#include "bitmap.h" #include "bt454.h" #include "busio.h" #include "cmmu.h" @@ -17,6 +16,7 @@ #include "interrupt.h" #include "lance.h" #include "lcd.h" +#include "lunafb.h" #include "lunakbd.h" #include "mainapp.h" #include "mk48t02.h" @@ -54,7 +54,7 @@ enum { SYSCLK, ZRAM, MROM, - BITMAP, + LUNAFB, BT454, CRTC2, SCSI, @@ -74,7 +74,7 @@ VM_LUNA::VM_LUNA() gConfig->Delete("mpu-has-fpu"); // LUNA 共通だしここで作成しておく - gNull.reset(new NullDevice()); + gNopIO.reset(new NopIODevice()); } // デストラクタ @@ -89,9 +89,9 @@ VM_LUNA::MakeDevtable(const uint8 *mapta for (uint i = 0; i < countof(::devtable); i++) { IODevice *d; switch (maptable[i]) { - case NONE: d = gNull.get(); break; - case BUSERR: d = buserr.get(); break; - case PROM: d = prom.get(); break; + case NONE: d = gNopIO.get(); break; + case BUSERR: d = gBusErr.get(); break; + case PROM: d = gPROM.get(); break; case MK48: d = gRTC.get(); break; case PIO0: d = gPIO0.get(); break; case PIO1: d = gPIO1.get(); break; @@ -99,8 +99,8 @@ VM_LUNA::MakeDevtable(const uint8 *mapta case TAS: d = gTAS.get(); break; case SYSCLK: d = gSysClk.get(); break; case ZRAM: d = gZRAM.get(); break; - case MROM: d = gNull.get(); break; - case BITMAP: d = gBitmap.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; @@ -137,6 +137,9 @@ VM_LUNA::Init() ::devtable[i] = gPartialRAM.get(); } + // ブートページ切り替え用に覚えておく + ram0 = ::devtable[0]; + return true; } @@ -149,8 +152,27 @@ VM_LUNA::PowerButton() // ON PUSH (何も起きない) // OFF PUSH 電源オン - // デバイスに指示 - DevicePowerOn(); + // スケジューラに指示 + gScheduler->RequestPowerOn(); +} + +// ブートページを切り替える。 +void +VM_LUNA::SwitchBootPage(Device *parent, bool isrom) +{ + // 共通処理 + inherited::SwitchBootPage(parent, isrom); + + // ROM は 128KB しかないので 16MB まるごと切り替わったりはしないとは + // 思うけど、具体的にどの範囲が切り替わるのかを知る方法がないのと + // 大して副作用もないので、先頭の 1ブロックをまるごと切り替えておく。 + if (isrom) { + ::devtable[0x00] = gPROM0.get(); + ::devtable[0x41] = gPROM0.get(); + } else { + ::devtable[0x00] = ram0; + ::devtable[0x41] = gPROM.get(); + } } @@ -185,7 +207,7 @@ VM_LUNA::PowerButton() // a1,a3,a5,... マスクROM(なければ0xffが読める) // b1 ビットマップ // b0,b2,b4,... BUSERR -// b1,b3,b5,... ビットマップ (内訳は bitmap.cpp 参照) +// b1,b3,b5,... ビットマップ (内訳は lunafb.cpp 参照) // c1 パレット // c0,c2,c4,... BUSERR // c1,c3,c5,... パレット (B、N=4でミラー) @@ -227,8 +249,8 @@ VM_LUNA1::maptable[256] = { NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98 BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0 BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8 - BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0 - BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8 + BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0 + BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8 BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c0 BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c8 @@ -254,19 +276,20 @@ VM_LUNA1::VM_LUNA1() gConfig->Add("!sysclk-period", 16.666667_msec); // デバイス (順序に注意) - // BusErrDevice, NullDevice は親コンストラクタで作成済み。 + // BusErrDevice, NopIODevice は親コンストラクタで作成済み。 - gMPU.reset(new MPU680x0Device(0x41000000)); // required by Scheduler + 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()); + if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) { + gPROM.reset(new Luna1PROMEmuDevice()); } else { - prom.reset(new PROMDevice()); + gPROM.reset(new PROMDevice()); } + gPROM0.reset(new PROM0Device()); gRTC.reset(new BusIO_B()); gPIO0.reset(new BusIO_B()); gPIO1.reset(new BusIO_B()); @@ -274,7 +297,7 @@ VM_LUNA1::VM_LUNA1() gSysClk.reset(new BusIO_B()); gTAS.reset(new BusIO_B()); gZRAM.reset(new ZRAMDevice()); - gBitmap.reset(new BitmapDevice()); // required by BT454 + gLunafb.reset(new LunafbDevice()); // required by BT454 gBT454.reset(new BusIO_B()); gCRTC2.reset(new BusIO_B()); gSPC.reset(new BusIO_BBBB()); @@ -300,7 +323,7 @@ VM_LUNA1::~VM_LUNA1() VM_LUNA88K::maptable[256] = { // RAM は Init() で動的に配置する。 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08 + NONE, NONE, NONE, NONE, NONE, NONE, NONE, BUSERR, // 08 BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10 BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18 BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20 @@ -325,8 +348,8 @@ VM_LUNA88K::maptable[256] = { NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98 BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0 BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8 - BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0 - BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8 + BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0 + BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8 // d0 にボードチェックレジスタ? BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c0 @@ -357,18 +380,19 @@ VM_LUNA88K::VM_LUNA88K() gConfig->Delete("mpu-has-fpu"); // デバイス (順序に注意) - // BusErrDevice, NullDevice は親コンストラクタで作成済み。 + // BusErrDevice, NopIODevice は親コンストラクタで作成済み。 - gMPU.reset(new MPU88xx0Device(0x41000000)); // required by Scheduler + 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()); + if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) { + gPROM.reset(new Luna88kPROMEmuDevice()); } else { - prom.reset(new PROMDevice()); + gPROM.reset(new PROMDevice()); } + gPROM0.reset(new PROM0Device()); gRTC.reset(new BusIO_BFFF()); gPIO0.reset(new BusIO_BFFF()); gPIO1.reset(new BusIO_BFFF()); @@ -376,7 +400,7 @@ VM_LUNA88K::VM_LUNA88K() gSysClk.reset(new BusIO_BFFF()); gTAS.reset(new BusIO_BFFF()); gZRAM.reset(new ZRAMDevice()); - gBitmap.reset(new BitmapDevice()); // required by BT454 + gLunafb.reset(new LunafbDevice()); // required by BT454 gBT454.reset(new BusIO_B()); gCRTC2.reset(new BusIO_BFFF()); gSPC.reset(new BusIO_BFFF());