--- nono/vm/nereid.cpp 2026/04/29 17:05:21 1.1 +++ nono/vm/nereid.cpp 2026/04/29 17:05:33 1.1.1.4 @@ -50,8 +50,8 @@ #include "nereid.h" #include "bankram.h" #include "config.h" +#include "monitor.h" #include "rtl8019as.h" -#include "x68kio.h" // // Nereid 空間担当デバイス @@ -63,9 +63,9 @@ NereidDevice::NereidDevice() : inherited(OBJ_NEREID) { - monitor.func = ToMonitorCallback(&NereidDevice::MonitorUpdate); - monitor.SetSize(41, 9); - monitor.Regist(ID_MONITOR_NEREID); + monitor = gMonitorManager->Regist(ID_MONITOR_NEREID, this); + monitor->func = ToMonitorCallback(&NereidDevice::MonitorUpdate); + monitor->SetSize(41, 9); } // デストラクタ @@ -77,9 +77,9 @@ NereidDevice::~NereidDevice() bool NereidDevice::Create() { - // ボードの有無は nereid%d-enable だけで決まる。 + // ボードの有無は nereid%u-enable だけで決まる。 for (int i = 0; i < 2; i++) { - std::string name = string_format("nereid%d-enable", i); + std::string name = string_format("nereid%u-enable", i); bool enable = gConfig->Find(name).AsInt(); if (enable) { @@ -117,73 +117,50 @@ NereidDevice::Decoder(uint32 addr) const return (addr >> 8) & 0x1f; } -uint64 -NereidDevice::Read8(uint32 addr) +busdata +NereidDevice::Read(busaddr addr) { - putlog(2, "Read $%06x.B", addr); + uint32 paddr = addr.Addr(); - uint32 cs = Decoder(addr); - for (int i = 0; i < boards.size(); i++) { - if (cs == loc[i]) { - return boards[i]->Read8(addr); - } - } - return (uint64)-1; -} - -uint64 -NereidDevice::Read16(uint32 addr) -{ - putlog(2, "Read $%06x.W", addr); + putlog(2, "Read $%06x.%c", paddr, (addr.GetSize() == 1 ? 'B' : 'W')); - uint32 cs = Decoder(addr); + uint32 cs = Decoder(paddr); for (int i = 0; i < boards.size(); i++) { if (cs == loc[i]) { - return boards[i]->Read16(addr); + return boards[i]->Read(addr); } } - return (uint64)-1; -} - -uint64 -NereidDevice::Write8(uint32 addr, uint32 data) -{ - putlog(2, "Write $%06x.B", addr); - uint32 cs = Decoder(addr); - for (int i = 0; i < boards.size(); i++) { - if (cs == loc[i]) { - return boards[i]->Write8(addr, data); - } - } - return (uint64)-1; + return BusData::BusErr; } -uint64 -NereidDevice::Write16(uint32 addr, uint32 data) +busdata +NereidDevice::Write(busaddr addr, uint32 data) { - putlog(2, "Write $%06x.W", addr); + uint32 paddr = addr.Addr(); - uint32 cs = Decoder(addr); + putlog(2, "Write $%06x.%c", paddr, (addr.GetSize() == 1 ? 'B' : 'W')); + + uint32 cs = Decoder(paddr); for (int i = 0; i < boards.size(); i++) { if (cs == loc[i]) { - return boards[i]->Write16(addr, data); + return boards[i]->Write(addr, data); } } - return (uint64)-1; + return BusData::BusErr; } -uint64 -NereidDevice::Peek8(uint32 addr) +busdata +NereidDevice::Peek1(uint32 addr) { uint32 cs = Decoder(addr); for (int i = 0; i < boards.size(); i++) { if (cs == loc[i]) { - return boards[i]->Peek8(addr); + return boards[i]->Peek1(addr); } } - return (uint64)-1; + return BusData::BusErr; } void @@ -219,7 +196,7 @@ NereidDevice::MonitorUpdate(Monitor *, T TA attr; y = 0; - screen.Print(x, y++, "#%d", i); + screen.Print(x, y++, "#%u", i); // ボードがささっているか bool installed = (bool)boards[i]; @@ -252,7 +229,7 @@ NereidDevice::MonitorUpdate(Monitor *, T if (installed) { ramsize = boards[i]->GetBankRAMSize(); if (ramsize > 0) { - screen.Print(x, y, "%d MB", ramsize); + screen.Print(x, y, "%u MB", ramsize); attr = TA::Normal; } else { screen.Puts(x, y, "Disabled"); @@ -296,8 +273,8 @@ NereidBoardDevice::~NereidBoardDevice() bool NereidBoardDevice::Create() { - std::string netname = string_format("nereid%d-net", id); - std::string ramname = string_format("nereid%d-ram-size", id); + std::string netname = string_format("nereid%u-net", id); + std::string ramname = string_format("nereid%u-ram-size", id); const ConfigItem inet = gConfig->Find(netname); bool net_enable = inet.AsInt(); @@ -336,11 +313,7 @@ NereidBoardDevice::Create() bank.reset(new BankRAMDevice(OBJ_BANKRAM(id), 0)); } else { bank.reset(new BankRAMDevice(OBJ_BANKRAM(id), ramsize_MB)); - - // メモリウィンドウ領域の登録はバンクメモリが有効な場合のみ行う。 - uint32 addr = 0xee0000 + id * 0x10000; - auto *x68kio = GetX68kIODevice(); - x68kio->AddDevice(bank.get(), addr, 0x01'0000); + // I/O 空間への登録は X68kIO 側から行っている。 } return true; } @@ -351,87 +324,85 @@ NereidBoardDevice::Decoder(uint32 addr) return addr & 0xff; } -uint64 -NereidBoardDevice::Read8(uint32 addr) +busdata +NereidBoardDevice::Read(busaddr addr) { - uint32 offset = Decoder(addr); - - if (offset < 0x40) { - if ((bool)net) { - return net->Read8(addr); - } - } else if (offset == 0xf0) { - return GetPage(); - - } else if (offset == 0xf1) { - return GetCtrl(); - } - return (uint64)-1; -} + busdata data = BusData::BusErr; -uint64 -NereidBoardDevice::Read16(uint32 addr) -{ - uint32 offset = Decoder(addr); - uint64 data; + uint32 paddr = addr.Addr(); + uint32 offset = Decoder(paddr); if (offset < 0x40) { if ((bool)net) { - return net->Read16(addr); + return net->Read(addr); } - } else if (offset == 0xf0) { - data = GetPage() << 8; - data |= GetCtrl(); - return data; - } - return (uint64)-1; -} - -uint64 -NereidBoardDevice::Write8(uint32 addr, uint32 data) -{ - uint32 offset = Decoder(addr); - - if (offset < 0x40) { - if ((bool)net) { - return net->Write8(addr, data); + } else { + uint32 reqsize = addr.GetSize(); + uint32 datasize = std::min(2 - (paddr & 1), reqsize); + if (datasize == 1) { + if (offset == 0xf0) { + data = GetPage(); + } else if (offset == 0xf1) { + data = GetCtrl(); + } + data |= BusData::Size1; + } else { + if (offset == 0xf0) { + data = GetPage() << 8; + data |= GetCtrl(); + } + data |= BusData::Size2; } - } else if (offset == 0xf0) { - SetPage(data); - return 0; - - } else if (offset == 0xf1) { - SetCtrl(data); - return 0; } - return (uint64)-1; + return data; } -uint64 -NereidBoardDevice::Write16(uint32 addr, uint32 data) +busdata +NereidBoardDevice::Write(busaddr addr, uint32 data) { - uint32 offset = Decoder(addr); + busdata r; + + uint32 paddr = addr.Addr(); + uint32 offset = Decoder(paddr); if (offset < 0x40) { if ((bool)net) { - return net->Write16(addr, data); + return net->Write(addr, data); + } + } else { + uint32 reqsize = addr.GetSize(); + uint32 datasize = std::min(2 - (paddr & 1), reqsize); + data >>= (reqsize - datasize) * 8; + if (datasize == 1) { + if (offset == 0xf0) { + SetPage(data); + } else if (offset == 0xf1) { + SetCtrl(data); + } else { + r.SetBusErr(); + } + r |= BusData::Size1; + } else { + if (offset == 0xf0) { + SetPage(data >> 8); + SetCtrl(data & 0xff); + } else { + r.SetBusErr(); + } + r |= BusData::Size2; } - } else if (offset == 0xf0) { - SetPage(data >> 8); - SetCtrl(data & 0xff); - return 0; } - return (uint64)-1; + return r; } -uint64 -NereidBoardDevice::Peek8(uint32 addr) +busdata +NereidBoardDevice::Peek1(uint32 addr) { uint32 offset = Decoder(addr); if (offset < 0x40) { if ((bool)net) { - return net->Peek8(addr); + return net->Peek1(addr); } } else if (offset == 0xf0) { return GetPage(); @@ -439,7 +410,7 @@ NereidBoardDevice::Peek8(uint32 addr) } else if (offset == 0xf1) { return GetCtrl(); } - return (uint64)-1; + return BusData::BusErr; } // バンクページ選択レジスタの値を取得。