--- nono/vm/nereid.cpp 2026/04/29 17:05:25 1.1.1.2 +++ nono/vm/nereid.cpp 2026/04/29 17:05:43 1.1.1.5 @@ -50,6 +50,7 @@ #include "nereid.h" #include "bankram.h" #include "config.h" +#include "monitor.h" #include "rtl8019as.h" // @@ -62,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); } // デストラクタ @@ -76,13 +77,20 @@ 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) { - boards[i].reset(new NereidBoardDevice(i)); + try { + boards[i].reset(new NereidBoardDevice(i)); + } catch (...) { } + if ((bool)boards[i] == false) { + warnx("Failt to initialize NereidBoardDevice(%u) at %s", + i, __method__); + return false; + } // 配置場所 if (i == 0) { @@ -117,72 +125,49 @@ NereidDevice::Decoder(uint32 addr) const } busdata -NereidDevice::Read8(uint32 addr) +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 busdata::BusErr; -} - -busdata -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 busdata::BusErr; -} -busdata -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 busdata::BusErr; + return BusData::BusErr; } busdata -NereidDevice::Write16(uint32 addr, uint32 data) +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 busdata::BusErr; + return BusData::BusErr; } busdata -NereidDevice::Peek8(uint32 addr) +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 busdata::BusErr; + return BusData::BusErr; } void @@ -218,7 +203,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]; @@ -251,7 +236,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"); @@ -295,8 +280,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(); @@ -325,17 +310,30 @@ NereidBoardDevice::Create() } else { vector = 0xf8; } - net.reset(new RTL8019ASDevice(id, vector)); + try { + net.reset(new RTL8019ASDevice(id, vector)); + } catch (...) { } + if ((bool)net == false) { + warnx("Failed to initialize RTL8019ASDevice(%u) at %s", + id, __method__); + return false; + } } // バンクメモリは (DIPSW によって) 有効/無効どちらであっても // BankRAMDevice インスタンスの生成自体は行う。 // ページレジスタは存在している(はずの)ため。 - if (ramsize_MB <= 0) { - bank.reset(new BankRAMDevice(OBJ_BANKRAM(id), 0)); - } else { - bank.reset(new BankRAMDevice(OBJ_BANKRAM(id), ramsize_MB)); - // I/O 空間への登録は X68kIO 側から行っている。 + try { + if (ramsize_MB <= 0) { + bank.reset(new BankRAMDevice(OBJ_BANKRAM(id), 0)); + } else { + bank.reset(new BankRAMDevice(OBJ_BANKRAM(id), ramsize_MB)); + // I/O 空間への登録は X68kIO 側から行っている。 + } + } catch (...) { } + if ((bool)bank == false) { + warnx("Failed to initialize BankRAMDevice(%u) at %s", id, __method__); + return false; } return true; } @@ -347,87 +345,84 @@ NereidBoardDevice::Decoder(uint32 addr) } busdata -NereidBoardDevice::Read8(uint32 addr) +NereidBoardDevice::Read(busaddr addr) { - uint32 offset = Decoder(addr); + busdata data = BusData::BusErr; - if (offset < 0x40) { - if ((bool)net) { - return net->Read8(addr); - } - } else if (offset == 0xf0) { - return GetPage(); - - } else if (offset == 0xf1) { - return GetCtrl(); - } - return busdata::BusErr; -} - -busdata -NereidBoardDevice::Read16(uint32 addr) -{ - uint32 offset = Decoder(addr); - uint32 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(); - // XXX wait? - return data; - } - return busdata::BusErr; -} - -busdata -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 busdata::BusErr; + return data; } busdata -NereidBoardDevice::Write16(uint32 addr, uint32 data) +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 busdata::BusErr; + return r; } busdata -NereidBoardDevice::Peek8(uint32 addr) +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(); @@ -435,7 +430,7 @@ NereidBoardDevice::Peek8(uint32 addr) } else if (offset == 0xf1) { return GetCtrl(); } - return busdata::BusErr; + return BusData::BusErr; } // バンクページ選択レジスタの値を取得。