--- nono/vm/cmmu.cpp 2026/04/29 17:05:25 1.1.1.7 +++ nono/vm/cmmu.cpp 2026/04/29 17:05:29 1.1.1.8 @@ -60,62 +60,63 @@ CMMUDevice::Decoder(uint32 addr) } busdata -CMMUDevice::Read32(uint32 addr) +CMMUDevice::Read(busaddr addr) { - uint32 id = (addr >> 12) & 0xff; + busdata data; + uint32 paddr = addr.Addr(); + uint32 id = (paddr >> 12) & 0xff; m88200 *cmmu = GetCMMU(id); if (cmmu == NULL) { - putlog(3, "Read not-equipped CMMU[%d] $%08x", id, addr); + putlog(3, "Read not-equipped CMMU[%u] $%08x", id, paddr); return 0xffffffff; } - uint32 offset = Decoder(addr); - uint32 data; + uint32 offset = Decoder(paddr); switch (offset) { case IDR: data = cmmu->GetIDR(); - cmmu->putlogf(2, lstr("IDR -> $%08x", data)); + cmmu->putlogf(2, lstr("IDR -> $%08x", data.Data())); break; case SCR: data = cmmu->GetSCR(); - cmmu->putlogf(2, lstr("SCR -> $%08x", data)); + cmmu->putlogf(2, lstr("SCR -> $%08x", data.Data())); break; case SSR: data = cmmu->GetSSR(); - cmmu->putlogf(2, lstr("SSR -> $%08x", data)); + cmmu->putlogf(2, lstr("SSR -> $%08x", data.Data())); break; case SAR: data = cmmu->GetSAR(); - cmmu->putlogf(2, lstr("SAR -> $%08x", data)); + cmmu->putlogf(2, lstr("SAR -> $%08x", data.Data())); break; case SCTR: data = cmmu->GetSCTR(); - cmmu->putlogf(2, lstr("SCTR -> $%08x", data)); + cmmu->putlogf(2, lstr("SCTR -> $%08x", data.Data())); break; case PFSR: data = cmmu->GetPFSR(); - cmmu->putlogf(2, lstr("PFSR -> $%08x", data)); + cmmu->putlogf(2, lstr("PFSR -> $%08x", data.Data())); break; case PFAR: data = cmmu->GetPFAR(); - cmmu->putlogf(2, lstr("PFAR -> $%08x", data)); + cmmu->putlogf(2, lstr("PFAR -> $%08x", data.Data())); break; case SAPR: data = cmmu->GetSAPR(); - cmmu->putlogf(2, lstr("SAPR -> $%08x", data)); + cmmu->putlogf(2, lstr("SAPR -> $%08x", data.Data())); break; case UAPR: data = cmmu->GetUAPR(); - cmmu->putlogf(2, lstr("UAPR -> $%08x", data)); + cmmu->putlogf(2, lstr("UAPR -> $%08x", data.Data())); break; case BWP0 ... BWP7: @@ -125,33 +126,48 @@ CMMUDevice::Read32(uint32 addr) case CSSP: data = cmmu->GetCSSP(); - cmmu->putlogf(2, lstr("CSSP -> $%08x", data)); + cmmu->putlogf(2, lstr("CSSP -> $%08x", data.Data())); break; case CDP0 ... CDP3: case CTP0 ... CTP3: default: - putlog(0, "Read $%08x (NOT IMPLEMENTED)", addr); + putlog(0, "Read $%08x (NOT IMPLEMENTED)", paddr); data = 0xffffffff; } - busdata bd = data; // XXX wait? - return bd; + data |= BusData::Size4; + return data; } busdata -CMMUDevice::Write32(uint32 addr, uint32 data) +CMMUDevice::Write(busaddr addr, uint32 data) { - uint32 id = (addr >> 12) & 0xff; + uint32 paddr = addr.Addr(); + uint32 id = (paddr >> 12) & 0xff; m88200 *cmmu = GetCMMU(id); if (cmmu == NULL) { - putlog(3, "Write not-equipped CMMU[%d] $%08x <- $%08x", id, addr, data); + putlog(3, "Write not-equipped CMMU[%u] $%08x <- $%08x", + id, paddr, data); return 0; } - uint32 offset = Decoder(addr); + // 普通はロングワードアクセスしかしないはず。 + // m88k 専用なのでミスアラインアクセスは起きない。 + // 88200 p5-27 + uint32 size = addr.GetSize(); + if (size == 4) { + // nop + } else { + if (size == 1) { + data |= data << 8; + } + data |= data << 16; + } + + uint32 offset = Decoder(paddr); uint n; switch (offset) { case IDR: @@ -215,18 +231,19 @@ CMMUDevice::Write32(uint32 addr, uint32 case CDP0 ... CDP3: case CTP0 ... CTP3: default: - putlog(0, "Write $%08x <- $%08x (NOT IMPLEMENTED)", addr, data); + putlog(0, "Write $%08x <- $%08x (NOT IMPLEMENTED)", paddr, data); VMPANIC("not impl"); break; } // wait? - return 0; + busdata r = BusData::Size4; + return r; } -// Peek8() の下請け。32ビットで処理して後でバイトに分割するほうが楽。 +// Peek1() の下請け。ロングワードで処理して後でバイトに分割するほうが楽。 uint32 -CMMUDevice::Peek32(uint32 addr) const +CMMUDevice::Peek4(uint32 addr) const { uint32 id = (addr >> 12) & 0xff; @@ -281,9 +298,9 @@ CMMUDevice::Peek32(uint32 addr) const } busdata -CMMUDevice::Peek8(uint32 addr) +CMMUDevice::Peek1(uint32 addr) { - uint32 data = Peek32(addr & ~3U); + uint32 data = Peek4(addr & ~3U); switch (addr & 3) { case 0: return data >> 24;