--- nono/vm/extarea.cpp 2026/04/29 17:05:25 1.1.1.1 +++ nono/vm/extarea.cpp 2026/04/29 17:05:29 1.1.1.2 @@ -15,7 +15,6 @@ // (本来は MuxDevice で分離すべき) #include "extarea.h" -#include "mpu.h" #include "x68kio.h" // コンストラクタ @@ -53,74 +52,66 @@ ExtAreaDevice::ResetHard(bool poweron) } busdata -ExtAreaDevice::Read8(uint32 addr) +ExtAreaDevice::Read(busaddr addr) { - if (addr >= 0xeaff80) { - // 拡張エリアセット部分は書き込み専用で読み出しはすべてバスエラー。 - putlog(2, "Read $%06x.B (BusErr)", addr); + uint32 reqsize = addr.GetSize(); + uint32 paddr = addr.Addr(); + uint32 offset = paddr & 1; + uint32 datasize = std::min(2 - offset, reqsize); + + if (paddr >= 0xeaff80) { + // 拡張エリアセット部分は書き込み専用なので読み出しはすべてバスエラー。 + putlog(2, "Read $%06x.%c (BusErr)", + paddr, (datasize == 1 ? 'B' : 'W')); + } else { + // それ以外の部分も何もないのでバスエラー。 } - // 他はすべてバスエラー。 - // XXX wait? - return busdata::BusErr; -} -busdata -ExtAreaDevice::Read16(uint32 addr) -{ - if (addr >= 0xeaff80) { - // 拡張エリアセット部分は書き込み専用で読み出しはすべてバスエラー。 - putlog(2, "Read $%06x.W (BusErr)", addr); - } - // 他はすべてバスエラー。 - // XXX wait? - return busdata::BusErr; + busdata data = BusData::BusErr; + // XXX wait + data |= busdata::Size(datasize); + return data; } busdata -ExtAreaDevice::Write8(uint32 addr, uint32 data) +ExtAreaDevice::Write(busaddr addr, uint32 data) { busdata r; - if (addr >= 0xeaff80) { - // 拡張エリアセット内は16バイト単位でミラー。 - uint32 offset = addr & 0x0f; + uint32 reqsize = addr.GetSize(); + uint32 paddr = addr.Addr(); + uint32 offset = paddr & 1; + uint32 datasize = std::min(2 - offset, reqsize); + if (paddr >= 0xeaff80) { + // 拡張エリアセット内は16バイト(8ワード)単位でミラー。 // 偶数アドレスはバスエラー。 - // 奇数アドレスはレジスタ部分は書き込み可能。以降はバスエラー。 - switch (offset) { - case 0x01: - case 0x03: - case 0x05: - case 0x07: - case 0x09: - offset >>= 1; - putlog(1, "$%06x [%d] <- $%02x", addr, offset, data); - x68kio->SetExtarea(offset, data); - r = 0; - break; - default: - putlog(2, "Write $%06x.B (BusErr)", addr); - r.SetBusErr(); - break; + if (datasize == 1 && offset == 0) { + r = BusData::BusErr; + } else { + uint32 regno = (paddr >> 1) & 7; + if (regno < 6) { + putlog(1, "$%06x [%u] <- $%02x", paddr, regno, data & 0xff); + x68kio->SetExtarea(regno, data); + } else { + r = BusData::BusErr; + } + } + if (r.IsBusErr()) { + putlog(2, "Write $%06x.%c (BusErr)", + paddr, (datasize == 1 ? 'B' : 'W')); } } else { - // 他はすべてバスエラー。 - r.SetBusErr(); + // それ以外の部分も何もないのでバスエラー。 + r = BusData::BusErr; } - // XXX wait? - return r; -} - -busdata -ExtAreaDevice::Write16(uint32 addr, uint32 data) -{ - // 拡張エリアセット内は EB 構造。 - return Write8(addr + 1, data & 0xff); + r |= busdata::Size(datasize); + return data; } busdata -ExtAreaDevice::Peek8(uint32 addr) +ExtAreaDevice::Peek1(uint32 addr) { - return busdata::BusErr; + return BusData::BusErr; }