--- nono/vm/xpbus.cpp 2026/04/29 17:05:18 1.1.1.1 +++ nono/vm/xpbus.cpp 2026/04/29 17:05:25 1.1.1.2 @@ -8,6 +8,21 @@ // XP プロセッサの物理バス // +// IODevice +// +-- MainbusDevice (InitMainbus() と Read/Write に FC 版がある) +// | +-- Mainbus24Device +// | | +-- LunaMainbus +// | | | +-- Luna1Mainbus +// | | | +-- Luna88kMainbus +// | | +-- NewsMainbus +// | | +-- Virt68kMainbus +// | +-- X68kMainbus +// | +-- X68kIODevice +// | +// | +-------------+ +// +-------| XPbusDevice | (これはただの IODevice) +// +-------------+ + // 00000H +-------------------+ // | 3Port RAM (128KB) | // 20000H +-------------------+ @@ -83,7 +98,7 @@ XPbusDevice::SearchDevice(uint32 addr) c return nopio; } -uint64 +busdata XPbusDevice::Read8(uint32 addr) { addr &= 0x000fffff; @@ -91,7 +106,7 @@ XPbusDevice::Read8(uint32 addr) return d->Read8(addr); } -uint64 +busdata XPbusDevice::Read16(uint32 addr) { addr &= 0x000fffff; @@ -99,7 +114,7 @@ XPbusDevice::Read16(uint32 addr) return d->Read16(addr); } -uint64 +busdata XPbusDevice::Read32(uint32 addr) { addr &= 0x000fffff; @@ -107,7 +122,7 @@ XPbusDevice::Read32(uint32 addr) return d->Read32(addr); } -uint64 +busdata XPbusDevice::Write8(uint32 addr, uint32 data) { addr &= 0x000fffff; @@ -115,7 +130,7 @@ XPbusDevice::Write8(uint32 addr, uint32 return d->Write8(addr, data); } -uint64 +busdata XPbusDevice::Write16(uint32 addr, uint32 data) { addr &= 0x000fffff; @@ -123,7 +138,7 @@ XPbusDevice::Write16(uint32 addr, uint32 return d->Write16(addr, data); } -uint64 +busdata XPbusDevice::Write32(uint32 addr, uint32 data) { addr &= 0x000fffff; @@ -131,7 +146,7 @@ XPbusDevice::Write32(uint32 addr, uint32 return d->Write32(addr, data); } -uint64 +busdata XPbusDevice::Peek8(uint32 addr) { addr &= 0x000fffff; @@ -139,11 +154,12 @@ XPbusDevice::Peek8(uint32 addr) return d->Peek8(addr); } -// このアドレスを担当する次段の IODevice を返す (IOContainerDevice 用) -IODevice * -XPbusDevice::GetDevice(uint32 addr) const +bool +XPbusDevice::Poke8(uint32 addr, uint32 data) { - return SearchDevice(addr & 0x000fffff); + addr &= 0x000fffff; + IODevice *d = SearchDevice(addr); + return d->Poke8(addr, data); } // RMCR レジスタを取得する @@ -179,28 +195,28 @@ XPRAMDevice::~XPRAMDevice() { } -uint64 +busdata XPRAMDevice::Read8(uint32 addr) { addr &= 0x1ff; return ram[addr]; } -uint64 +busdata XPRAMDevice::Read16(uint32 addr) { putlog(0, "should not be called?"); - return (uint64)-1; + return busdata::BusErr; } -uint64 +busdata XPRAMDevice::Read32(uint32 addr) { putlog(0, "should not be called?"); - return (uint64)-1; + return busdata::BusErr; } -uint64 +busdata XPRAMDevice::Write8(uint32 addr, uint32 data) { addr &= 0x1ff; @@ -208,33 +224,33 @@ XPRAMDevice::Write8(uint32 addr, uint32 return 0; } -uint64 +busdata XPRAMDevice::Write16(uint32 addr, uint32 data) { putlog(0, "should not be called?"); - return (uint64)-1; + return busdata::BusErr; } -uint64 +busdata XPRAMDevice::Write32(uint32 addr, uint32 data) { putlog(0, "should not be called?"); - return (uint64)-1; + return busdata::BusErr; } -uint64 +busdata XPRAMDevice::Peek8(uint32 addr) { addr &= 0x1ff; return ram[addr]; } -uint64 +bool XPRAMDevice::Poke8(uint32 addr, uint32 data) { if ((int32)data >= 0) { addr &= 0x1ff; ram[addr] = data; } - return 0; + return true; }