--- nono/vm/xiospace.cpp 2026/04/29 17:04:50 1.1.1.6 +++ nono/vm/xiospace.cpp 2026/04/29 17:04:56 1.1.1.8 @@ -35,8 +35,7 @@ // // 1つの 8KB ブロックを複数のデバイスで共有する場合 -class MuxDevice - : public IODevice +class MuxDevice : public IODevice { using inherited = IODevice; public: @@ -57,8 +56,8 @@ class MuxDevice }; MuxDevice::MuxDevice() + : inherited("MuxDevice") { - logname = "none"; } MuxDevice::~MuxDevice() @@ -72,7 +71,7 @@ MuxDevice::AddDevice(IODevice *dev) { if (dev->devlen == 0) { printf("MuxDevice::AddDevice: '%s' devlen not set!\n", - dev->devname.c_str()); + dev->GetName().c_str()); exit(1); } devlist.push_back(dev); @@ -144,10 +143,8 @@ std::unique_ptr gXIOSpac // コンストラクタ XIOSpaceDevice::XIOSpaceDevice() + : inherited("IOSpace") { - logname = "xiospace"; - devname = "IOSpace"; - #define ADD_DEVICE(varname, clsname) do { \ varname.reset(new clsname); \ AddDevice(varname.get()); \ @@ -193,11 +190,10 @@ XIOSpaceDevice::Init() } // 必要なデバイスは全部埋めたので、この時点で nullptr なエントリを - // buserr に差し替える。 - IODevice *buserr = gVM->GetBusErrDevice(); + // BusErr に差し替える。 for (auto&& d : table) { if (d == nullptr) { - d = buserr; + d = gBusErr.get(); } } @@ -209,7 +205,7 @@ XIOSpaceDevice::Init() if (dynamic_cast(table[i])) { printf("MuxDevice\n"); } else { - printf("%s\n", table[i]->devname.c_str()); + printf("%s\n", table[i]->GetName().c_str()); } } } @@ -224,12 +220,12 @@ XIOSpaceDevice::AddDevice(IODevice *dev) { if (dev->devaddr == 0) { printf("XIOSpaceDevice:AddDevice: '%s' devaddr not set!\n", - dev->devname.c_str()); + dev->GetName().c_str()); exit(1); } if (dev->devlen == 0) { printf("XIOSpaceDevice:AddDevice: '%s' devlen not set!\n", - dev->devname.c_str()); + dev->GetName().c_str()); exit(1); } @@ -306,3 +302,31 @@ XIOSpaceDevice::Peek8(uint32 addr) IODevice *d = SearchDevice(addr); return d->Peek8(addr); } + +// ブートページを切り替える。 +// (VM_X68030::SwitchBootPage() の下請け) +void +XIOSpaceDevice::SwitchBootPage(bool isrom) +{ + IODevice *ram; + IODevice *rom; + + if (isrom) { + // 0x000000 からの 64KB ( 8エントリ)、 + // 0xfe0000 からの 128KB (16エントリ) のどちらも IPLROM0 が担当する。 + ram = gIPLROM0.get(); + rom = ram; + } else { + // 0x000000 からの 64KB ( 8エントリ) に RAM を見せる。 + // 0xfe0000 からの 128KB (16エントリ) に IPLROM1 を見せる。 + ram = gRAM.get(); + rom = gIPLROM1.get(); + } + + for (int i = 0; i < 8; i++) { + table[i] = ram; + } + for (int i = 0; i < 16; i++) { + table[table.size() - 16 + i] = rom; + } +}