--- nono/vm/rp5c15.cpp 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/rp5c15.cpp 2026/04/29 17:04:32 1.1.1.2 @@ -36,18 +36,27 @@ RP5C15Device::InitRTC() return true; } -uint64 -RP5C15Device::Read8(uint32 addr) +// アドレスデコーダ +inline uint64 +RP5C15Device::Decoder(uint32 addr) const { - uint8 data; - int n; + // XXX 折り返しは // 偶数アドレスへのアクセスは先にエラーにする - if (addr % 2 == 0) + if ((addr & 1) == 0) return (uint64)-1; // Bank0 を 0..15、Bank1 を 16..31 に並べる - n = ((addr - devaddr) / 2) + bank * 0x10; + return ((addr - devaddr) / 2) + bank * 0x10; +} + +uint64 +RP5C15Device::Read8(uint32 addr) +{ + uint8 data; + int n; + + n = Decoder(addr); // XXX 14, 15 は write only らしいが何が読めるか @@ -86,12 +95,7 @@ RP5C15Device::Write8(uint32 addr, uint32 { int n; - // 偶数アドレスへのアクセスは先にエラーにする - if (addr % 2 == 0) - return (uint64)-1; - - // Bank0 を 0..15、Bank1 を 16..31 に並べる - n = ((addr - devaddr) / 2) + bank * 0x10; + n = Decoder(addr); putlog(2, "RTC Bank%d $%x <- $%x", bank, (n & 0x0f), (data & 0x0f)); @@ -245,12 +249,7 @@ RP5C15Device::Peek8(uint32 addr) { int n; - // 偶数アドレスへのアクセスを先に弾く - if (addr % 2 == 0) { - return (uint64)-1; - } - - n = ((addr - devaddr) / 2) + bank * 0x10; + n = Decoder(addr); switch (n) { case RP5C15::MODE_BANK1: