--- nono/m88xx0/m88200.cpp 2026/04/29 17:05:30 1.1.1.14 +++ nono/m88xx0/m88200.cpp 2026/04/29 17:05:39 1.1.1.15 @@ -1988,10 +1988,21 @@ m88200::ReadLine(m88200CacheSet& set, ui busaddr addr = busaddr(set.tag[line] | (set.setidx << 4)) | acc_super; busdata r = mainbus->ReadBurst16(addr, &set.word[line * 4]); - parent->AddWait(r.GetWait()); - if (__predict_false(r.IsBusErr())) { - SetFault(FAULT_CODE_BUSERR, addr.Addr()); - return (uint64)-1; + if (__predict_true(r.IsBusErr() == false)) { + parent->AddWait(r.GetWait()); + return 0; + } else { + addr |= BusAddr::Size4; + for (int i = 0; i < 4; i++) { + busdata bd = mainbus->Read(addr); + parent->AddWait(r.GetWait()); + if (__predict_false(bd.IsBusErr())) { + SetFault(FAULT_CODE_BUSERR, addr.Addr()); + return (uint64)-1; + } + set.word[line * 4 + i] = bd.Data(); + addr += 4; + } } return 0; } @@ -2004,10 +2015,19 @@ m88200::CopyBackLine(m88200CacheSet& set { busaddr addr = busaddr(set.tag[line] | (set.setidx << 4)) | acc_super; busdata r = mainbus->WriteBurst16(addr, &set.word[line * 4]); - parent->AddWait(r.GetWait()); - if (__predict_false(r.IsBusErr())) { - SetFault(FAULT_CODE_BUSERR, addr.Addr()); - return (uint64)-1; + if (__predict_true(r.IsBusErr() == false)) { + parent->AddWait(r.GetWait()); + return 0; + } else { + addr |= BusAddr::Size4; + for (int i = 0; i < 4; i++) { + busdata bd = mainbus->Write(addr, set.word[line * 4 + i]); + if (__predict_false(bd.IsBusErr())) { + SetFault(FAULT_CODE_BUSERR, addr.Addr()); + return (uint64)-1; + } + addr += 4; + } } return 0; }