--- nono/vm/goldfish_pic.cpp 2026/04/29 17:05:25 1.1.1.1 +++ nono/vm/goldfish_pic.cpp 2026/04/29 17:05:29 1.1.1.2 @@ -49,7 +49,7 @@ #include // コンストラクタ -GFPICDevice::GFPICDevice(int id_) +GFPICDevice::GFPICDevice(uint id_) : inherited(OBJ_GFPIC(id_)) { } @@ -81,20 +81,18 @@ GFPICDevice::ResetHard(bool poweron) } busdata -GFPICDevice::Read32(uint32 addr) +GFPICDevice::ReadPort(uint32 offset) { - uint32 offset = addr & 0xfff; busdata data; switch (offset) { case STATUS: - data = __builtin_popcount(intmap_status); + data = GetSTATUS(); putlog(2, "STATUS -> $%08x", data.Data()); break; case PENDING: - // 一番下の立っているビットだけにして返す。 - data = intmap_status & -intmap_status; + data = GetPENDING(); putlog(2, "PENDING -> $%08x", data.Data()); break; @@ -103,13 +101,13 @@ GFPICDevice::Read32(uint32 addr) break; } + data |= BusData::Size4; return data; } busdata -GFPICDevice::Write32(uint32 addr, uint32 data) +GFPICDevice::WritePort(uint32 offset, uint32 data) { - uint32 offset = addr & 0xfff; busdata r; switch (offset) { @@ -133,13 +131,24 @@ GFPICDevice::Write32(uint32 addr, uint32 r.SetBusErr(); break; } + + r |= BusData::Size4; return r; } busdata -GFPICDevice::Peek8(uint32 addr) +GFPICDevice::PeekPort(uint32 offset) { - return busdata::BusErr; + switch (offset) { + case STATUS: + return GetSTATUS(); + + case PENDING: + return GetPENDING(); + + default: + return BusData::BusErr; + } } // Virt68kInterrupt の下請け。上のサマリ部分。 @@ -178,7 +187,7 @@ GFPICDevice::MonitorUpdateDetail(TextScr int irq = 32 - clz; const char *name = GetIntName(intmap); - screen.Print(0, y, "GFPIC%d IRQ%2d", lv, irq); + screen.Print(0, y, "GFPIC%u IRQ%2u", lv, irq); screen.Puts(13, y, TA::OnOff(intmap_status & intmap), name); screen.Print(51, y, "%26s", format_number(counter[clz]).c_str()); y++; @@ -187,6 +196,21 @@ GFPICDevice::MonitorUpdateDetail(TextScr return y; } +// STATUS レジスタを返す。 +uint32 +GFPICDevice::GetSTATUS() const +{ + return __builtin_popcount(intmap_status); +} + +// PENDING レジスタを返す。 +uint32 +GFPICDevice::GetPENDING() const +{ + // 一番下の立っているビットだけにして返す。 + return intmap_status & -intmap_status; +} + busdata GFPICDevice::InterruptAcknowledge(int lv) { @@ -210,7 +234,7 @@ GFPICDevice::RegistIRQ(int irq, const ch { uint32 intmap = 1U << (irq - 1); - assertmsg((intmap_avail & intmap) == 0, "IRQ=%d already registered", irq); + assertmsg((intmap_avail & intmap) == 0, "IRQ=%u already registered", irq); RegistINT(intmap, name, source);