--- nono/m680x0/m68040mmu.cpp 2026/04/29 17:05:40 1.1.1.3 +++ nono/m680x0/m68040mmu.cpp 2026/04/29 17:05:57 1.1.1.4 @@ -10,75 +10,76 @@ #include "m88200.h" // 読み込みのアドレス変換を行う。 -bool -MPU68040Device::TranslateRead() +busaddr +MPU68040Device::TranslateRead(busaddr laddr) { - m68040TT *tt; + const m68040TT *tt; m68040ATC *atc; putlog(3, "TranslateRead %c.$%08x", - (bus.laddr.IsSuper() ? 'S' : 'U'), bus.laddr.Addr()); + (laddr.IsSuper() ? 'S' : 'U'), laddr.Addr()); // まず TT をチェック。 - if (bus.laddr.IsData()) { + if (laddr.IsData()) { atc = atc_data.get(); - tt = CheckTT(mmu_dtt); + tt = TTMatch(mmu_dtt, laddr); } else { atc = atc_inst.get(); - tt = CheckTT(mmu_itt); + tt = TTMatch(mmu_itt, laddr); } if (tt != NULL) { putlog(3, "TranslateRead %s matched", tt->GetName()); - return true; + return laddr; } // TC がオフならここで終わり。 if (__predict_false(mmu_tc->e == false)) { putlog(3, "TranslateRead TC:E OFF"); - return true; + return laddr; } - return LookupATC(*atc); + return LookupATC(*atc, laddr); } // 書き込みのアドレス変換を行う。 -bool -MPU68040Device::TranslateWrite() +busaddr +MPU68040Device::TranslateWrite(busaddr laddr) { putlog(3, "TranslateWrite %c.$%08x", - (bus.laddr.IsSuper() ? 'S' : 'U'), bus.laddr.Addr()); + (laddr.IsSuper() ? 'S' : 'U'), laddr.Addr()); // まず TT をチェック。 - m68040TT *tt = CheckTT(mmu_dtt); + const m68040TT *tt = TTMatch(mmu_dtt, laddr); if (tt) { if (tt->w) { putlog(3, "TranslateWrite %s matched (WriteProtected)", tt->GetName()); - return false; + return BusAddr::BusErr; } else { putlog(3, "TranslateWrite %s matched", tt->GetName()); - return true; + return laddr; } } // TC がオフならここで終わり。 if (__predict_false(mmu_tc->e == false)) { putlog(3, "TranslateWrite TC:E OFF"); - return true; + return laddr; } m68040ATC *atc = atc_data.get(); - return LookupATC(*atc); + return LookupATC(*atc, laddr); } // *TTn にマッチすれば、マッチした方のポインタを返す。 // マッチしなければ NULL を返す。 m68040TT * -MPU68040Device::CheckTT(std::array, 2>& ttbase) const +MPU68040Device::TTMatch(std::array, 2>& ttbase, + const busaddr laddr) const { for (int n = 0; n < 2; n++) { m68040TT *tt = ttbase[n].get(); - if (tt->Match(bus.laddr)) { + if (tt->Match(laddr)) { return tt; } } @@ -86,8 +87,8 @@ MPU68040Device::CheckTT(std::array> mmu_tc->tic_shift) & 0xf; - tag = (bus.laddr.Get() >> 4) & atc.tag_mask; // FC2+Addr(+Index) + idx = (laddr.Addr() >> mmu_tc->tic_shift) & 0xf; + tag = (laddr.Get() >> 4) & atc.tag_mask; // FC2+Addr(+Index) m68040ATCSet& set = atc.sets[idx]; // このセットから探す。 for (n = 0; n < set.entry.size(); n++) { entry = &set.entry[n]; if (entry->tag == tag) { - if (entry->MatchStatus(bus.laddr)) { + if (entry->MatchStatus(laddr)) { // 見付かった。 goto found; } else { @@ -142,20 +143,21 @@ MPU68040Device::LookupATC(m68040ATC& atc entry->tag = tag; // テーブルサーチを行い、エントリを更新する。 - Search(entry); + Search(entry, laddr); // このエントリで再度ステータスが一致するか。(タグは一致している) - if (entry->MatchStatus(bus.laddr) == false) { + if (entry->MatchStatus(laddr) == false) { putlog(3, " LookupATC entry not matched"); - return false; + return BusAddr::BusErr; } found: - // 見付かったので bus.paddr を更新。 + // 見付かったのでこれを返す。 set.LRU = m88200CacheSet::TryUseLine(set.LRU, n); - uint32 offset = bus.laddr.Addr() & ~mmu_tc->page_mask; - bus.paddr.ChangeAddr(entry->paddr | offset); - putlog(3, " result $%08x", bus.paddr.Addr()); - return true; + uint32 offset = laddr.Addr() & ~mmu_tc->page_mask; + busaddr paddr = laddr; + paddr.ChangeAddr(entry->paddr | offset); + putlog(3, " result $%08x", paddr.Addr()); + return paddr; } // laddr がこのエントリの各種ステータスにマッチするか調べる。 @@ -191,7 +193,7 @@ m68040ATCSet::GetEntry() const // テーブルサーチを行い、entry を埋める。 void -MPU68040Device::Search(m68040ATCEntry *entry) +MPU68040Device::Search(m68040ATCEntry *entry, const busaddr laddr) { uint32 base; uint32 idx; @@ -201,8 +203,6 @@ MPU68040Device::Search(m68040ATCEntry *e uint32 pdt; busdata bd; bool acc_wp = false; - - busaddr laddr = bus.laddr; bool is_write = laddr.IsWrite(); putlog(3, " Search %c.$%08x", (laddr.IsSuper() ? 'S' : 'U'), laddr.Addr()); @@ -373,9 +373,9 @@ MPU68040Device::TranslatePeek(busaddr la // TT を自前でサーチ。 if (laddr.IsData()) { - tt = CheckTT(mmu_dtt); + tt = TTMatch(mmu_dtt, laddr); } else { - tt = CheckTT(mmu_itt); + tt = TTMatch(mmu_itt, laddr); } if (__predict_false(tt != NULL)) { if (tt->Match(laddr)) { @@ -662,7 +662,7 @@ m68040ATC::Flush(busaddr addr, bool only // モニター更新 (68040 ATC) void -MPU68040Device::MonitorUpdateATC(Monitor *, TextScreen& screen) +MPU68040Device::MonitorScreenATC(Monitor *, TextScreen& screen) { int x = 64; @@ -671,25 +671,29 @@ MPU68040Device::MonitorUpdateATC(Monitor // IDX TagAddr PAddr Stat IDX TagAddr PAddr Stat // [0] S.12345'000 12345'000 ---- [1] S.12345'000 12345'000 ---- + bool enable = mmu_tc->e; + TA attr_e = enable ? TA::Normal : TA::Disable; + screen.Clear(); - screen.Puts(0, 0, ""); - screen.Puts(x, 0, ""); + screen.Puts(0, 0, attr_e, ""); + screen.Puts(x, 0, attr_e, ""); for (int i = 0; i < 4; i++) { screen.Puts(i * 31 + (i & 2), 1, "IDX TagAddr PAddr Stat"); } - MonitorUpdateATC1(screen, 0, atc_data.get()); - MonitorUpdateATC1(screen, x, atc_inst.get()); + MonitorScreenATC1(screen, 0, enable, atc_data.get()); + MonitorScreenATC1(screen, x, enable, atc_inst.get()); } void -MPU68040Device::MonitorUpdateATC1(TextScreen& screen, int x, +MPU68040Device::MonitorScreenATC1(TextScreen& screen, int x, bool enable, const m68040ATC *atc) { int y = 2; + TA attr_e = enable ? TA::Normal : TA::Disable; for (uint i = 0; i < atc->sets.size(); i++) { const m68040ATCSet& set = atc->sets[i]; - screen.Print(x, y, "[%x]", i); + screen.Print(x, y, attr_e, "[%x]", i); // 古い順に取り出して 3-0 の順序をつける。(新しい順に表示するため) int order[4];