--- nono/vm/qemusysctlr.cpp 2026/04/29 17:05:24 1.1.1.1 +++ nono/vm/qemusysctlr.cpp 2026/04/29 17:05:29 1.1.1.2 @@ -11,6 +11,7 @@ // https://www.qemu.org/docs/master/specs/virt-ctlr.html #include "qemusysctlr.h" +#include "mpu.h" #include "power.h" // コンストラクタ @@ -25,28 +26,30 @@ QemuSysCtlrDevice::~QemuSysCtlrDevice() } busdata -QemuSysCtlrDevice::Read32(uint32 addr) +QemuSysCtlrDevice::ReadPort(uint32 offset) { - uint32 offset = addr & 0xff; + busdata data; if (offset == 0) { // Features (Read Only) - uint32 data = FEATURES; - putlog(2, "FEATURES -> $%08x", data); - return data; + data = FEATURES; + putlog(2, "FEATURES -> $%08x", data.Data()); } else { // 他のポートがどうなるのかは仕様に書いてない。 - putlog(1, "Read32 $%08x (BusErr)", addr); - return busdata::BusErr; + data.SetBusErr(); + putlog(1, "Read $%08x (BusErr)", mpu->GetPaddr()); } + + data |= BusData::Size4; + return data; } busdata -QemuSysCtlrDevice::Write32(uint32 addr, uint32 data) +QemuSysCtlrDevice::WritePort(uint32 offset, uint32 data) { - uint32 offset = addr & 0xff; + busdata r; - if (offset == 4) { + if (offset == 1) { // Command (Write Only) static const char *cmdname[] = { "no-op", @@ -70,26 +73,22 @@ QemuSysCtlrDevice::Write32(uint32 addr, GetPowerDevice()->PushPowerButton(); break; } - return 0; } else { // 他のポートがどうなるのかは仕様に書いてない。 - putlog(1, "Write32 $%08x <- $%08x (BusErr)", addr, data); - return busdata::BusErr; + putlog(1, "Write $%08x <- $%08x (BusErr)", mpu->GetPaddr(), data); + r.SetBusErr(); } + + r |= BusData::Size4; + return r; } busdata -QemuSysCtlrDevice::Peek8(uint32 addr) +QemuSysCtlrDevice::PeekPort(uint32 offset) { - uint32 offset = addr & 0xff; - switch (offset) { - case 0: return (FEATURES >> 24); - case 1: return (FEATURES >> 16) & 0xff; - case 2: return (FEATURES >> 8) & 0xff; - case 3: return (FEATURES ) & 0xff; - + case 0: return FEATURES; default: - return busdata::BusErr; + return BusData::BusErr; } }