--- nono/vm/vicon.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/vicon.cpp 2026/04/29 17:04:32 1.1.1.2 @@ -5,7 +5,7 @@ #include "vicon.h" -ViconDevice *gVicon; +std::unique_ptr gVicon; ViconDevice::ViconDevice() { @@ -19,10 +19,18 @@ ViconDevice::~ViconDevice() { } +// アドレスデコーダ +inline uint64 +ViconDevice::Decoder(uint32 addr) const +{ + // 折り返しは? + return addr - baseaddr; +} + uint64 ViconDevice::Read8(uint32 addr) { - uint32 offset = addr - baseaddr; + uint32 offset = Decoder(addr); uint32 data; if (offset < 0x400) { @@ -60,7 +68,7 @@ ViconDevice::Read8(uint32 addr) uint64 ViconDevice::Read16(uint32 addr) { - uint32 offset = addr - baseaddr; + uint32 offset = Decoder(addr); uint32 data; if (offset < 0x400) { @@ -91,7 +99,7 @@ ViconDevice::Read16(uint32 addr) uint64 ViconDevice::Write8(uint32 addr, uint32 data) { - uint32 offset = addr - baseaddr; + uint32 offset = Decoder(addr); if (offset < 0x400) { putlog(3, "パレット $%06x.B <- $%02x", addr, data); @@ -131,7 +139,7 @@ ViconDevice::Write8(uint32 addr, uint32 uint64 ViconDevice::Write16(uint32 addr, uint32 data) { - uint32 offset = addr - baseaddr; + uint32 offset = Decoder(addr); if (offset < 0x400) { if (offset < 0x200) { @@ -171,7 +179,7 @@ ViconDevice::Write16(uint32 addr, uint32 uint64 ViconDevice::Peek8(uint32 addr) { - uint32 offset = addr - baseaddr; + uint32 offset = Decoder(addr); uint32 data; if (offset < 0x400) { @@ -205,31 +213,31 @@ ViconDevice::Peek8(uint32 addr) } uint32 -ViconDevice::read_r0() +ViconDevice::read_r0() const { return vicon.r0; } uint32 -ViconDevice::read_r1H() +ViconDevice::read_r1H() const { return vicon.r1 >> 8; } uint32 -ViconDevice::read_r1L() +ViconDevice::read_r1L() const { return vicon.r1 & 0xff; } uint32 -ViconDevice::read_r2H() +ViconDevice::read_r2H() const { return vicon.r2 >> 8; } uint32 -ViconDevice::read_r2L() +ViconDevice::read_r2L() const { return vicon.r2 & 0xff; }