--- nono/vm/goldfish_pic.cpp 2026/04/29 17:05:25 1.1.1.1 +++ nono/vm/goldfish_pic.cpp 2026/04/29 17:06:00 1.1.1.5 @@ -46,10 +46,11 @@ // +- GFPICDevice(Lv1) #include "goldfish_pic.h" +#include "monitor.h" #include // コンストラクタ -GFPICDevice::GFPICDevice(int id_) +GFPICDevice::GFPICDevice(uint id_) : inherited(OBJ_GFPIC(id_)) { } @@ -63,10 +64,6 @@ GFPICDevice::~GFPICDevice() bool GFPICDevice::Init() { - if (inherited::Init() == false) { - return false; - } - interrupt = GetInterruptDevice(); return true; @@ -76,25 +73,25 @@ GFPICDevice::Init() void GFPICDevice::ResetHard(bool poweron) { + inherited::ResetHard(poweron); + intmap_enable = 0; ChangeInterrupt(); } 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 +100,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,18 +130,29 @@ 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 の下請け。上のサマリ部分。 void -GFPICDevice::MonitorUpdateSummary(TextScreen& screen, int x, int y) +GFPICDevice::MonitorScreenSummary(TextScreen& screen, int x, int y) { for (int i = 0; i < 32; i++) { uint32 bit = 0x8000'0000 >> i; @@ -164,7 +172,7 @@ GFPICDevice::MonitorUpdateSummary(TextSc // Virt68kInterrupt の下請け。下の個別部分。 int -GFPICDevice::MonitorUpdateDetail(TextScreen& screen, int y, int lv) +GFPICDevice::MonitorScreenDetail(TextScreen& screen, int y, int lv) { // 0 1 2 3 4 5 6 7 // 01234567890123456789012345678901234567890123456789012345678901234567890123456 @@ -178,7 +186,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 +195,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 +233,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);