--- nono/vm/newsctlr.cpp 2026/04/29 17:05:25 1.1.1.3 +++ nono/vm/newsctlr.cpp 2026/04/29 17:05:29 1.1.1.4 @@ -44,6 +44,7 @@ #include "ethernet.h" #include "interrupt.h" #include "scheduler.h" +#include "textscreen.h" // コンストラクタ NewsCtlrDevice::NewsCtlrDevice() @@ -51,10 +52,6 @@ NewsCtlrDevice::NewsCtlrDevice() { // ROM のうち固定のもの oidrom[0] = 0x0d; // ModelID = NWS-1750 - - timer_event.func = ToEventCallback(&NewsCtlrDevice::TimerCallback); - timer_event.time = 10_msec; - timer_event.Regist("SystemTimer"); } // デストラクタ @@ -85,6 +82,11 @@ NewsCtlrDevice::Init() putmsg(1, "macaddr=%s", macaddr.ToString(':').c_str()); memcpy(&oidrom[8], &macaddr, sizeof(macaddr)); + timer_event.func = ToEventCallback(&NewsCtlrDevice::TimerCallback); + timer_event.time = 10_msec; + timer_event.SetName("SystemTimer"); + scheduler->RegistEvent(timer_event); + return true; } @@ -106,93 +108,89 @@ NewsCtlrDevice::ResetHard(bool poweron) } busdata -NewsCtlrDevice::Read8(uint32 addr) +NewsCtlrDevice::Read(busaddr addr) { - addr |= 0xc0000000; + uint32 paddr = addr.Addr() | 0xc0000000; - if ((addr >> 16) == 0xe1c0) { - uint idx = (addr >> 8) & 3; - uint32 data; + if ((paddr >> 16) == 0xe1c0) { + uint idx = (paddr >> 8) & 3; + busdata data; switch (idx) { case 0: // e1c0'00xx - data = GetIDROM(addr); - putlog(2, "$%08x.B (IDROM) -> $%02x", addr, data); + data = GetIDROM(paddr); + putlog(2, "$%08x.B (IDROM) -> $%02x", paddr, data.Data()); break; case 2: // e1c0'02xx // 割り込みステータス data = interrupt->PeekStatus(); - putlog(1, "$%08x.B (IntStat) -> $%02x", addr, data); + putlog(1, "$%08x.B (IntStat) -> $%02x", paddr, data.Data()); break; default: // e1c0'01xx // DIP-SW data = GetDIPSW(); - putlog(1, "$%08x.B (DIPSW) -> $%02x", addr, data); + putlog(1, "$%08x.B (DIPSW) -> $%02x", paddr, data.Data()); break; } + data |= BusData::Size1; return data; } - VMPANIC("Read8($%08x)", addr); + VMPANIC("Read($%08x)", paddr); } busdata -NewsCtlrDevice::Write8(uint32 addr, uint32 data) +NewsCtlrDevice::Write(busaddr addr, uint32 data) { - addr |= 0xc0000000; + uint32 paddr = addr.Addr() | 0xc0000000; + uint32 reqsize = addr.GetSize(); + data >>= (reqsize - 1) * 8; - if (addr == 0xe0c8'0000) { + if (paddr == 0xe0c8'0000) { // PWS-1560 FDC? putlog(0, "FDC <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe0dc'0000) { + + } else if (paddr == 0xe0dc'0000) { WriteLED(data); - return 0; - } - if (addr == 0xe100'0000) { + + } else if (paddr == 0xe100'0000) { WriteTimer(data); - return 0; - } - if (addr == 0xe108'0000) { + + } else if (paddr == 0xe108'0000) { // Parity enable? putlog(0, "Parity enable? <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe118'0000) { + + } else if (paddr == 0xe118'0000) { // Level2 Interrupt ? putlog(0, "Lv2 Interrupt disable? <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe128'0000) { + + } else if (paddr == 0xe128'0000) { putlog(0, "AST disable? <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe130'0000) { + + } else if (paddr == 0xe130'0000) { putlog(0, "L2 cache enable? <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe138'0000) { + + } else if (paddr == 0xe138'0000) { putlog(0, "Power Control <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe190'0000) { + + } else if (paddr == 0xe190'0000) { putlog(0, "L2 cache disable? <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe1a0'0000) { + + } else if (paddr == 0xe1a0'0000) { putlog(0, "Parity disable? <- $%02x (NOT IMPLEMENTED)", data); - return 0; - } - if (addr == 0xe1c0'0200) { + + } else if (paddr == 0xe1c0'0200) { // XXX たぶん 0xe1c0'02ff まで全部同じかも putlog(0, "Parity Vector? <- $%02x (NOT IMPLEMENTED)", data); - return 0; + + } else { + VMPANIC("Write($%08x) <- $%02x", paddr, data); } - VMPANIC("Write8($%08x) <- $%02x", addr, data); + busdata r = BusData::Size1; + return r; } busdata -NewsCtlrDevice::Peek8(uint32 addr) +NewsCtlrDevice::Peek1(uint32 addr) { addr |= 0xc0000000; @@ -208,7 +206,7 @@ NewsCtlrDevice::Peek8(uint32 addr) } } - return busdata::BusErr; + return BusData::BusErr; } // NewsIO の下請けとして呼ばれる。