--- 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:53 1.1.1.6 @@ -90,7 +90,7 @@ VM_LUNA::MakeDevtable(const uint8 *mapta IODevice *d; switch (maptable[i]) { case NONE: d = gNull.get(); break; - case BUSERR: d = buserr.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; @@ -149,8 +149,25 @@ 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[0] = prom.get(); + } else { + ::devtable[0] = gRAM.get(); + } } @@ -256,7 +273,7 @@ VM_LUNA1::VM_LUNA1() // デバイス (順序に注意) // BusErrDevice, NullDevice は親コンストラクタで作成済み。 - 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 @@ -300,7 +317,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 @@ -359,7 +376,7 @@ VM_LUNA88K::VM_LUNA88K() // デバイス (順序に注意) // BusErrDevice, NullDevice は親コンストラクタで作成済み。 - 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