--- nono/vm/xiospace.cpp 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/xiospace.cpp 2026/04/29 17:04:32 1.1.1.2 @@ -5,6 +5,7 @@ #include #include "areaset.h" +#include "busio.h" #include "crtc.h" #include "dmac.h" #include "fdc.h" @@ -12,9 +13,10 @@ #include "iocon.h" #include "mfp.h" #include "pluto.h" -#include "ppi.h" +#include "pio.h" #include "printer.h" #include "ram.h" +#include "romimg_x68k.h" #include "rp5c15.h" #include "scc.h" #include "spc.h" @@ -24,7 +26,6 @@ #include "tvram.h" #include "vicon.h" #include "vm.h" -#include "x68krom.h" #include "xiospace.h" // @@ -32,19 +33,17 @@ // // デバイス -AreaSetDevice *areaset; -CGROMDevice *cgrom; -CRTCDevice *crtc; -DMACDevice *dmac; -FDCDevice *fdc; -IPLROM1Device *iplrom1; -IPLROM2Device *iplrom2; -PlutoDevice *pluto; -PPIDevice *ppi; -PrinterDevice *printer; -SCCDevice *scc; -SpriteDevice *sprite; -SysportDevice *sysport; +std::unique_ptr areaset; +std::unique_ptr cgrom; +std::unique_ptr crtc; +std::unique_ptr fdc; +std::unique_ptr iplrom1; +std::unique_ptr iplrom2; +std::unique_ptr pluto; +std::unique_ptr ppi; +std::unique_ptr printer; +std::unique_ptr sprite; +std::unique_ptr sysport; // 1つの 8KB ブロックを複数のデバイスで共有する場合 class MuxDevice @@ -61,7 +60,7 @@ class MuxDevice virtual uint64 Write16(uint32 addr, uint32 data); virtual uint64 Peek8(uint32 addr); - IODevice *SearchDevice(uint32 addr); + IODevice *SearchDevice(uint32 addr) const; void AddDevice(IODevice *dev); @@ -90,7 +89,7 @@ MuxDevice::AddDevice(IODevice *dev) } IODevice * -MuxDevice::SearchDevice(uint32 addr) +MuxDevice::SearchDevice(uint32 addr) const { for (const auto& d : devlist) { if (d->devaddr <= addr && addr < d->devaddr + d->devlen) { @@ -162,19 +161,19 @@ XIOSpaceDevice::XIOSpaceDevice() // 場合や上位8ビットに値が入っていて 24bit にミラーされたアドレスへの // アクセスになる場合はここを通る。 for (int i = 0; i < ram_size / 8192; i++) { - table[i] = gRAM; + table[i] = gRAM.get(); } #define ADD_DEVICE(varname, clsname) do { \ - varname = new clsname; \ - AddDevice(static_cast(varname)); \ + varname.reset(new clsname); \ + AddDevice(varname.get()); \ } while (0) // デバイスクラス作成 (順序に注意) ADD_DEVICE(areaset, AreaSetDevice()); ADD_DEVICE(cgrom, CGROMDevice()); ADD_DEVICE(crtc, CRTCDevice()); - ADD_DEVICE(dmac, DMACDevice()); + ADD_DEVICE(gDMAC, DMACDevice()); ADD_DEVICE(fdc, FDCDevice()); ADD_DEVICE(gGVRAM, GVRAMDevice()); ADD_DEVICE(gIOCon, IOConDevice()); @@ -182,11 +181,11 @@ XIOSpaceDevice::XIOSpaceDevice() ADD_DEVICE(iplrom2, IPLROM2Device()); ADD_DEVICE(gMFP, MFPDevice()); ADD_DEVICE(pluto, PlutoDevice()); - ADD_DEVICE(ppi, PPIDevice()); + ADD_DEVICE(ppi, BusIO_EB()); ADD_DEVICE(printer, PrinterDevice()); ADD_DEVICE(gRTC, RP5C15Device()); - ADD_DEVICE(scc, SCCDevice()); - ADD_DEVICE(gSPC, SPCDevice(0xe96000)); + ADD_DEVICE(gSCC, SCCDevice()); + ADD_DEVICE(gSPC, BusIO_X68kSPC()); ADD_DEVICE(sprite, SpriteDevice()); ADD_DEVICE(gSRAM, SRAMDevice()); ADD_DEVICE(sysport, SysportDevice());