--- nono/vm/vm_x68k.cpp 2026/04/29 17:05:14 1.1.1.9 +++ nono/vm/vm_x68k.cpp 2026/04/29 17:05:17 1.1.1.10 @@ -9,13 +9,14 @@ // #include "vm_x68k.h" -#include "bus.h" #include "config.h" #include "dmac.h" +#include "extram.h" #include "fdc.h" #include "human68k.h" #include "interrupt.h" #include "mainapp.h" +#include "mainbus.h" #include "mfp.h" #include "mpu680x0.h" #include "nmi.h" @@ -28,8 +29,8 @@ #include "romimg_x68k.h" #include "scheduler.h" #include "spc.h" +#include "x68kio.h" #include "x68kkbd.h" -#include "xiospace.h" // コンストラクタ VM_X68030::VM_X68030() @@ -46,9 +47,10 @@ VM_X68030::VM_X68030() // BusErrDevice は親コンストラクタで作成済み。 NEWDV(MPU, new MPU680x0Device()); NEWDV(Interrupt, new X68030Interrupt()); - NEWDV(RAM, new RAMDevice()); // required by XIOSpace - NEWDV(XIOSpace, new XIOSpaceDevice()); + NEWDV(MainRAM, new MainRAMDevice()); // req. by X68kIO,Human68k + NEWDV(X68kIO, new X68kIODevice()); NEWDV(IPLROM0, new IPLROM0Device()); + NEWDV(ExtRAM, new ExtRAMDevice()); NEWDV(NMI, new NMIDevice()); NEWDV(Keyboard, new X68030Keyboard()); @@ -58,11 +60,7 @@ VM_X68030::VM_X68030() NEWDV(Human68k, new Human68k()); } - // 割り当て - // 今は拡張メモリがないので、今は上位8ビット全領域がミラーになっている。 - for (int i = 0; i < countof(::devtable); i++) { - ::devtable[i] = gXIOSpace; - } + // デバイスの割り当ては Init() で行っている。 } // デストラクタ @@ -70,6 +68,53 @@ VM_X68030::~VM_X68030() { } +bool +VM_X68030::Init() +{ + if (inherited::Init() == false) { + return false; + } + + // 拡張メモリのサイズが確定したので、ここで配置。 + auto mainbus = dynamic_cast(pMainbus.get()); + auto xiospace = dynamic_cast(pX68kIO.get()); + auto extram = dynamic_cast(pExtRAM.get()); + int extsize = extram->GetSizeMB(); + + if (extsize == 0) { + // 拡張メモリがない場合は、上位8ビット全域がミラーになる。 + for (int i = 0; i < mainbus->devtable.size(); i++) { + mainbus->SetDevice(i, xiospace); + } + } else if (extsize == 16) { + // TS-6BE16 互換 (16MB) なら、 + // $00: X68kIO + // $01: ExtRAM + // で、その後ろは? + mainbus->SetDevice(0, xiospace); + mainbus->SetDevice(1, extram); + for (int i = 2; i < mainbus->devtable.size(); i++) { + mainbus->SetDevice(i, pBusErr.get()); + } + } else { + // 060turbo 互換。とりあえず 128MB/256MB のみ。この場合は + // $00: X68kIO + // $01..$0f: BusErr? + // $10..$17: ExtRAM (128MB) + // $18..$1f: ExtRAM (256MB) + // で、その後ろは? + mainbus->SetDevice(0, xiospace); + for (int i = 1; i < mainbus->devtable.size(); i++) { + mainbus->SetDevice(i, pBusErr.get()); + } + for (int i = 0x10, end = i + (extsize / 16); i < end; i++) { + mainbus->SetDevice(i, extram); + } + } + + return true; +} + // ブートページを切り替える。 void VM_X68030::SwitchBootPage(Device *parent, bool isrom) @@ -83,8 +128,9 @@ VM_X68030::SwitchBootPage(Device *parent // 共通処理 inherited::SwitchBootPage(parent, isrom); - // X68030 では XIOSpace が担当している - gXIOSpace->SwitchBootPage(isrom); + // X68030 では X68kIO が担当している + auto xiospace = dynamic_cast(pX68kIO.get()); + xiospace->SwitchBootPage(isrom); } // リセットについて @@ -134,11 +180,17 @@ VM_X68030::SwitchBootPage(Device *parent void VM_X68030::ResetByMPU() { - gDMAC->ResetHard(false); - gFDC->ResetHard(false); - gMFP->ResetHard(false); - gPEDEC->ResetHard(false); - gPluto->ResetHard(false); - gPPI->ResetHard(false); - gSPC->ResetHard(false); + std::vector ids { + OBJ_DMAC, + OBJ_FDC, + OBJ_MFP, + OBJ_PEDEC, + OBJ_PLUTO, + OBJ_PPI, + OBJ_SPC, + }; + for (auto id : ids) { + auto dev = gMainApp.GetObject(id); + dev->ResetHard(false); + } }