--- nono/vm/cmmu.cpp 2026/04/29 17:04:35 1.1 +++ nono/vm/cmmu.cpp 2026/04/29 17:05:25 1.1.1.7 @@ -4,23 +4,20 @@ // Licensed under nono-license.txt // +// // M88200 CMMU の I/O デバイス部分 +// -#include "cmmu.h" -#include "mpu88xx0.h" - -// CMMU が確定したらそっちのデバイスログから出力する。 // CMMU が確定しない場合はこのデバイスのログを使う。 +// CMMU が確定したらそっちのデバイスログから出力する。 -std::unique_ptr gCMMU; +#include "cmmu.h" +#include "m88200.h" // コンストラクタ CMMUDevice::CMMUDevice() + : inherited(OBJ_CMMUIO) { - // m88200 側の logname が "cmmu7" とかなので、こっちを "cmmu" で - // 受け付けてしまうのは紛らわしそうなので。 - logname = "cmmudev"; - devname = "CMMU"; } // デストラクタ @@ -28,12 +25,18 @@ CMMUDevice::~CMMUDevice() { } +// 初期化 bool CMMUDevice::Init() { + if (inherited::Init() == false) { + return false; + } + // CMMU をポイントしておく - cmmus[7] = &gMPU88xx0->GetCPU()->cmmu[0]; - cmmus[6] = &gMPU88xx0->GetCPU()->cmmu[1]; + for (int i = 0; i < cmmus.size(); i++) { + cmmus[i] = gMainApp.FindObject(OBJ_M88200(i)); + } return true; } @@ -56,14 +59,14 @@ CMMUDevice::Decoder(uint32 addr) return offset; } -uint64 +busdata CMMUDevice::Read32(uint32 addr) { uint32 id = (addr >> 12) & 0xff; m88200 *cmmu = GetCMMU(id); if (cmmu == NULL) { - putlog(3, "未搭載 CMMU[%d] 読み込み $%08x", id, addr); + putlog(3, "Read not-equipped CMMU[%d] $%08x", id, addr); return 0xffffffff; } @@ -72,77 +75,79 @@ CMMUDevice::Read32(uint32 addr) switch (offset) { case IDR: data = cmmu->GetIDR(); - cmmu->putlog(2, "IDR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("IDR -> $%08x", data)); + break; case SCR: data = cmmu->GetSCR(); - cmmu->putlog(2, "SCR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("SCR -> $%08x", data)); + break; case SSR: data = cmmu->GetSSR(); - cmmu->putlog(2, "SSR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("SSR -> $%08x", data)); + break; case SAR: data = cmmu->GetSAR(); - cmmu->putlog(2, "SAR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("SAR -> $%08x", data)); + break; case SCTR: data = cmmu->GetSCTR(); - cmmu->putlog(2, "SCTR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("SCTR -> $%08x", data)); + break; case PFSR: data = cmmu->GetPFSR(); - cmmu->putlog(2, "PFSR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("PFSR -> $%08x", data)); + break; case PFAR: data = cmmu->GetPFAR(); - cmmu->putlog(2, "PFAR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("PFAR -> $%08x", data)); + break; case SAPR: data = cmmu->GetSAPR(); - cmmu->putlog(2, "SAPR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("SAPR -> $%08x", data)); + break; case UAPR: data = cmmu->GetUAPR(); - cmmu->putlog(2, "UAPR -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("UAPR -> $%08x", data)); + break; case BWP0 ... BWP7: // BWP は書き込み専用 (何が読めるだろうか) - return 0xffffffff; - - case CDP0 ... CDP3: - case CTP0 ... CTP3: + data = 0xffffffff; break; case CSSP: data = cmmu->GetCSSP(); - cmmu->putlog(2, "CSSP -> $%08x", data); - return data; + cmmu->putlogf(2, lstr("CSSP -> $%08x", data)); + break; + case CDP0 ... CDP3: + case CTP0 ... CTP3: default: - break; + putlog(0, "Read $%08x (NOT IMPLEMENTED)", addr); + data = 0xffffffff; } - putlog(0, "未実装読み込み $%08x", addr); - return 0xffffffff; + + busdata bd = data; + // XXX wait? + return bd; } -uint64 +busdata CMMUDevice::Write32(uint32 addr, uint32 data) { uint32 id = (addr >> 12) & 0xff; m88200 *cmmu = GetCMMU(id); if (cmmu == NULL) { - putlog(3, "未搭載 CMMU[%d] 書き込み $%08x <- $%08x", id, addr, data); + putlog(3, "Write not-equipped CMMU[%d] $%08x <- $%08x", id, addr, data); return 0; } @@ -153,67 +158,69 @@ CMMUDevice::Write32(uint32 addr, uint32 { uint32 newid = data >> 24; if (id != newid) { - cmmu->putlog(1, "ID 更新 $%02x", newid); - cmmu->SetID(newid); + // 後から ID を変更するのはサポートしない。というか実際無理では。 + cmmu->putlogf(0, lstr( + "IDR <- $%08x (change ID $%02x to $%02x; NOT SUPPORTED)", + data, id, newid)); } else { - cmmu->putlog(2, "IDR 書き込み(ID変更なし) <- $%08x", data); + cmmu->putlogf(2, lstr("IDR <- $%08x", data)); } - return 0; + break; } case SCR: cmmu->SetSCR(data); - return 0; + break; case SSR: - cmmu->putlog(1, "SSR <- $%08x", data); + cmmu->putlogf(1, lstr("SSR <- $%08x", data)); cmmu->SetSSR(data); - return 0; + break; case SAR: - cmmu->putlog(2, "SAR <- $%08x", data); + cmmu->putlogf(2, lstr("SAR <- $%08x", data)); cmmu->SetSAR(data); - return 0; + break; case SCTR: cmmu->SetSCTR(data); - return 0; + break; case PFSR: cmmu->SetPFSR(data); - return 0; + break; case PFAR: cmmu->SetPFAR(data); - return 0; + break; case SAPR: cmmu->SetSAPR(data); - return 0; + break; case UAPR: cmmu->SetUAPR(data); - return 0; + break; case BWP0 ... BWP7: n = (offset - BWP0) / 4; assert(n < 8); - cmmu->SetBATC(n, data); - return 0; - - case CDP0 ... CDP3: - case CTP0 ... CTP3: + cmmu->SetBWP(n, data); break; case CSSP: cmmu->SetCSSP(data); - return 0; + break; + case CDP0 ... CDP3: + case CTP0 ... CTP3: default: + putlog(0, "Write $%08x <- $%08x (NOT IMPLEMENTED)", addr, data); + VMPANIC("not impl"); break; } - putlog(0, "未実装書き込み $%08x <- $%08x", addr, data); - PANIC(" "); + + // wait? return 0; } @@ -273,7 +280,7 @@ CMMUDevice::Peek32(uint32 addr) const return 0xffffffff; } -uint64 +busdata CMMUDevice::Peek8(uint32 addr) { uint32 data = Peek32(addr & ~3U); @@ -286,6 +293,7 @@ CMMUDevice::Peek8(uint32 addr) return (data >> 8) & 0xff; case 3: return data & 0xff; + default: + return 0xff; } - __unreachable(); }