--- nono/m88xx0/m88200.cpp 2026/04/29 17:04:46 1.1.1.5 +++ nono/m88xx0/m88200.cpp 2026/04/29 17:04:58 1.1.1.8 @@ -8,17 +8,26 @@ #include "m88100.h" #include "m88200.h" -#include "mystring.h" // static 変数 m88200 *m88200::mbus_master = NULL; // m88200 コンストラクタ +// +// ここのオブジェクト名は仮で、ID が確定した時点でもう一度セットする +// (see SetID()) m88200::m88200() + : inherited("CMMU") { - // logname, devname は Init() で確定する + // objname 等は SetID() で確定する - monitor_size = nnSize(52, 8); + reg_monitor.func = (MonitorCallback_t)&m88200::MonitorUpdateReg; + reg_monitor.SetSize(52, 8); + atc_monitor.func = (MonitorCallback_t)&m88200::MonitorUpdateATC; + atc_monitor.SetSize(65, 38); + cache_monitor.func = (MonitorCallback_t)&m88200::MonitorUpdateCache; + cache_monitor.SetSize(82, 23); + // モニタ名も SetID() で決まるので、続きは向こうでやる // ログ表示用の名前 sapr.name = "SAPR"; @@ -67,8 +76,9 @@ m88200::Reset() uapr.stat = APR_CI; } +// モニター更新 (CMMU レジスタ) void -m88200::MonitorUpdate(TextScreen& monitor) +m88200::MonitorUpdateReg(Monitor *, TextScreen& screen) { uint32 baseaddr; uint32 reg; @@ -77,35 +87,35 @@ m88200::MonitorUpdate(TextScreen& monito baseaddr = 0xfff00000 + (id << 12); - monitor.Clear(); + screen.Clear(); x = 24; y = 0; - monitor.Print(0, y++, "$%08x IDR:%08x ID=$%02x Type=5(88200) Ver=$%x", + screen.Print(0, y++, "$%08x IDR:%08x ID=$%02x Type=5(88200) Ver=$%x", baseaddr + 0, GetIDR(), id, version); reg = GetSSR(); - monitor.Print(0, y, "$%08x SSR:%08x", baseaddr + 0x008, reg); - monitor.Puts(x, y, TA::OnOff(reg & SSR_CE), "CE"); - monitor.Puts(x + 3, y, TA::OnOff(reg & SSR_BE), "BE"); - monitor.Puts(x + 6, y, TA::OnOff(reg & SSR_WT), "WT"); - monitor.Puts(x + 9, y, TA::OnOff(reg & SSR_SP), "SP"); - monitor.Puts(x + 12, y, TA::OnOff(reg & SSR_G), "G"); - monitor.Puts(x + 14, y, TA::OnOff(reg & SSR_CI), "CI"); - monitor.Puts(x + 17, y, TA::OnOff(reg & SSR_M), "M"); - monitor.Puts(x + 19, y, TA::OnOff(reg & SSR_U), "U"); - monitor.Puts(x + 21, y, TA::OnOff(reg & SSR_WP), "WP"); - monitor.Puts(x + 24, y, TA::OnOff(reg & SSR_BH), "BH"); - monitor.Puts(x + 27, y, TA::OnOff(reg & SSR_V), "V"); + screen.Print(0, y, "$%08x SSR:%08x", baseaddr + 0x008, reg); + screen.Puts(x, y, TA::OnOff(reg & SSR_CE), "CE"); + screen.Puts(x + 3, y, TA::OnOff(reg & SSR_BE), "BE"); + screen.Puts(x + 6, y, TA::OnOff(reg & SSR_WT), "WT"); + screen.Puts(x + 9, y, TA::OnOff(reg & SSR_SP), "SP"); + screen.Puts(x + 12, y, TA::OnOff(reg & SSR_G), "G"); + screen.Puts(x + 14, y, TA::OnOff(reg & SSR_CI), "CI"); + screen.Puts(x + 17, y, TA::OnOff(reg & SSR_M), "M"); + screen.Puts(x + 19, y, TA::OnOff(reg & SSR_U), "U"); + screen.Puts(x + 21, y, TA::OnOff(reg & SSR_WP), "WP"); + screen.Puts(x + 24, y, TA::OnOff(reg & SSR_BH), "BH"); + screen.Puts(x + 27, y, TA::OnOff(reg & SSR_V), "V"); y++; - monitor.Print(0, y++, "$%08x SAR:%08x", baseaddr + 0x00c, GetSAR()); + screen.Print(0, y++, "$%08x SAR:%08x", baseaddr + 0x00c, GetSAR()); reg = GetSCTR(); - monitor.Print(0, y, "$%08x SCTR:%08x", baseaddr + 0x104, GetSCTR()); - monitor.Puts(x, y, TA::OnOff(reg & SCTR_PE), "PE"); - monitor.Puts(x + 3, y, TA::OnOff(reg & SCTR_SE), "SE"); - monitor.Puts(x + 6, y, TA::OnOff(reg & SCTR_PR), "PR"); + screen.Print(0, y, "$%08x SCTR:%08x", baseaddr + 0x104, GetSCTR()); + screen.Puts(x, y, TA::OnOff(reg & SCTR_PE), "PE"); + screen.Puts(x + 3, y, TA::OnOff(reg & SCTR_SE), "SE"); + screen.Puts(x + 6, y, TA::OnOff(reg & SCTR_PR), "PR"); y++; reg = GetPFSR(); @@ -119,17 +129,17 @@ m88200::MonitorUpdate(TextScreen& monito "Supervisor Violation", "Write Violation", }; - monitor.Print(0, y++, "$%08x PFSR:%08x %s", baseaddr + 0x108, + screen.Print(0, y++, "$%08x PFSR:%08x %s", baseaddr + 0x108, reg, codestr[fault_code]); - monitor.Print(0, y++, "$%08x PFAR:%08x", baseaddr + 0x10c, GetPFAR()); + screen.Print(0, y++, "$%08x PFAR:%08x", baseaddr + 0x10c, GetPFAR()); for (int i = 0; i < 2; i++) { int s = 1 - i; reg = GetAPR(s); - monitor.Print(0, y, "$%08x %cAPR:%08x", baseaddr + 0x200 + i * 4, + screen.Print(0, y, "$%08x %cAPR:%08x", baseaddr + 0x200 + i * 4, s ? 'S' : 'U', reg); - monitor.Print(x, y, "STBA=%05x'000 %c%c%c%c", + screen.Print(x, y, "STBA=%05x'000 %c%c%c%c", reg >> 12, (reg & APR_WT) ? 'T' : '-', (reg & APR_G) ? 'G' : '-', @@ -139,12 +149,107 @@ m88200::MonitorUpdate(TextScreen& monito } } +// モニター更新 (ATC) +void +m88200::MonitorUpdateATC(Monitor *, TextScreen& screen) +{ + int x; + int y; + + screen.Clear(); + + screen.Print(0, 0, "SAPR %05x'000 TE=%d %c%c%c", + (sapr.addr >> 12) & 0xfffff, + sapr.enable ? 1 : 0, + (sapr.stat & m88200::APR_WT) ? 'T' : '-', + (sapr.stat & m88200::APR_G) ? 'G' : '-', + (sapr.stat & m88200::APR_CI) ? 'C' : '-'); + + screen.Print(34, 0, "UAPR %05x'000 TE=%d %c%c%c", + (uapr.addr >> 12) & 0xfffff, + uapr.enable ? 1 : 0, + (uapr.stat & m88200::APR_WT) ? 'T' : '-', + (uapr.stat & m88200::APR_G) ? 'G' : '-', + (uapr.stat & m88200::APR_CI) ? 'C' : '-'); + + screen.Puts(0, 1, ""); + screen.Puts(0, 2, "No. LBA PBA Stat"); + screen.Puts(34, 2, "No. LBA PBA Stat"); + x = 0; + y = 3; + for (int i = 0; i < 10; i++) { + if (i == batc.size() / 2) { + x = 34; + y = 3; + } + if (i < 8) { + screen.Print(x, y, " %d:", i); + } else { + screen.Print(x, y, "(%d)", i); + } + + const m88200BATC& b = batc[i]; + if ((b.lba & 1) == 0) { + screen.Print(x + 4, y, "%c:%04x'0000 %04x'0000 %c%c%c%c", + (b.lba & m88200::BATC_S) ? 'S' : 'U', + b.lba >> 16, b.pba >> 16, + (b.stat & m88200::DESC_WT) ? 'T' : '-', + (b.stat & m88200::DESC_G) ? 'G' : '-', + (b.stat & m88200::DESC_CI) ? 'C' : '-', + (b.stat & m88200::DESC_WP) ? 'P' : '-'); + } + y++; + } + + screen.Puts(0, 8, ""); + screen.Puts(0, 9, "No. LPA PFA Stat"); + screen.Puts(34, 9, "No. LPA PFA Stat"); + + x = 0; + y = 10; + for (int i = 0; i < patc.size(); i++) { + if (i == patc.size() / 2) { + x = 34; + y = 10; + } + screen.Print(x, y, "%2d:", i); + + const m88200PATC& p = patc[i]; + if ((p.lpa & 1) == 0) { + screen.Print(x + 4, y, "%c:%05x'000 %05x'000 %c%c%c%c%c", + (p.lpa & m88200::PATC_S) ? 'S' : 'U', + p.lpa >> 12, p.pfa >> 12, + (p.stat & m88200::DESC_WT) ? 'T' : '-', + (p.stat & m88200::DESC_G) ? 'G' : '-', + (p.stat & m88200::DESC_CI) ? 'C' : '-', + (p.stat & m88200::DESC_WP) ? 'P' : '-', + p.m ? 'M' : '-'); + } + + y++; + } +} + +// モニター更新 (キャッシュ、概要と詳細の両方、GUI から呼ばれる) +// screen.userdata は注目しているセット番号。 +void +m88200::MonitorUpdateCache(Monitor *, TextScreen& screen) +{ + int setidx = screen.userdata; + + // 上半分(概要) + MonitorCacheOverview(screen, 0, setidx, true); + // 下半分(セット詳細) + MonitorCacheSet(screen, 18, setidx); +} + // データキャッシュの特定セットの詳細を TextScreen に出力する。 // y は開始オフセット。 // TextScreen は (70, 5) 必要。 void m88200::MonitorCacheSet(TextScreen& s, int y, int setidx) { + assertmsg(0 <= setidx && setidx < setarray.size(), "setidx=%d", setidx); const m88200CacheSet& set = setarray[setidx]; /* @@ -272,8 +377,13 @@ m88200::SetID(uint id_) { id = id_; - logname = string_format("cmmu%u", id); - devname = string_format("CMMU#%u", id); + SetName(string_format("CMMU#%u", id)); + ClearAlias(); + AddAlias(string_format("CMMU%u", id)); + + reg_monitor.Regist(ID_MONITOR_CMMU(id)); + atc_monitor.Regist(ID_MONITOR_ATC(id)); + cache_monitor.Regist(ID_SUBWIN_CACHE(id)); } // IDR の Version フィールドを設定する @@ -790,7 +900,7 @@ m88200::MBusWrite(uint32 paddr, uint32 d } // MBus に xmem トランザクションを行う。 -// paddr は size によって 1, 2, 4 バイト境界に整列していること。 +// paddr は size によって 1, 4 バイト境界に整列していること (2バイトはない)。 // MBus Acquire された状態で呼び出すこと。 // 成功すれば読み込めた値を返す。 // バスエラーが起きれば fault_code、fault_addr をセットして (uint64)-1 を返す。