From: Toni Wilen Date: Sun, 5 Jan 2020 15:06:49 +0000 (+0200) Subject: Fix 68030 MMU regression. X-Git-Tag: 4400~191 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=574f8f4eca50b9c181d12d40431ace5dd3ea5831;p=francis%2Fwinuae.git Fix 68030 MMU regression. --- diff --git a/cpummu30.cpp b/cpummu30.cpp index 59bf1217..21825925 100644 --- a/cpummu30.cpp +++ b/cpummu30.cpp @@ -2842,7 +2842,7 @@ void m68k_do_rte_mmu030 (uaecptr a7) uae_u16 v = get_word_mmu030(a7 + 0x36); idxsize = v & 0xff; idxsize_done = (v >> 8) & 0xff; - for (int i = 0; i < idxsize_done; i++) { + for (int i = 0; i < idxsize_done + 1; i++) { mmu030_ad_v[i].val = get_long_mmu030(a7 + 0x5c - (i + 1) * 4); } @@ -2860,8 +2860,9 @@ void m68k_do_rte_mmu030 (uaecptr a7) } else { if (ssw & MMU030_SSW_RW) { // Read and no DF: use value in data input buffer - mmu030_ad_v[idxsize_done++].val = mmu030_data_buffer_in_v; - } + mmu030_ad_v[idxsize_done].val = mmu030_data_buffer_in_v; + } // else: use value idxsize_done that was saved from regs.wb3_data; + idxsize_done++; } unalign_clear(); } @@ -2897,7 +2898,7 @@ void m68k_do_rte_mmu030 (uaecptr a7) mmu030_data_buffer_out = mmu030_data_buffer_out_v; mmu030_idx = idxsize; mmu030_idx_done = idxsize_done; - for (int i = 0; i < idxsize_done; i++) { + for (int i = 0; i < idxsize_done + 1; i++) { mmu030_ad[i].val = mmu030_ad_v[i].val; } @@ -3289,7 +3290,7 @@ void m68k_do_rte_mmu030c (uaecptr a7) uae_u16 v = get_word_mmu030c(a7 + 0x36); idxsize = v & 0xff; idxsize_done = (v >> 8) & 0xff; - for (int i = 0; i < idxsize_done; i++) { + for (int i = 0; i < idxsize_done + 1; i++) { mmu030_ad_v[i].val = get_long_mmu030c(a7 + 0x5c - (i + 1) * 4); } @@ -3307,8 +3308,9 @@ void m68k_do_rte_mmu030c (uaecptr a7) } else { if (ssw & MMU030_SSW_RW) { // Read and no DF: use value in data input buffer - mmu030_ad_v[idxsize_done++].val = mmu030_data_buffer_in_v; + mmu030_ad_v[idxsize_done].val = mmu030_data_buffer_in_v; } + idxsize_done++; } unalign_clear(); } @@ -3353,7 +3355,7 @@ void m68k_do_rte_mmu030c (uaecptr a7) mmu030_data_buffer_out = mmu030_data_buffer_out_v; mmu030_idx = idxsize; mmu030_idx_done = idxsize_done; - for (int i = 0; i < idxsize_done; i++) { + for (int i = 0; i < idxsize_done + 1; i++) { mmu030_ad[i].val = mmu030_ad_v[i].val; } diff --git a/newcpu_common.cpp b/newcpu_common.cpp index 2dbb8545..cbda5895 100644 --- a/newcpu_common.cpp +++ b/newcpu_common.cpp @@ -1408,9 +1408,11 @@ void Exception_build_stack_frame(uae_u32 oldpc, uae_u32 currpc, uae_u32 ssw, int } #endif if (!(ssw & MMU030_SSW_RW)) { - mmu030_ad[mmu030_idx].val = regs.wb3_data; + // written value that caused fault but was not yet written to memory + // this value is used in cpummu030 when write is retried. + mmu030_ad[mmu030_idx_done].val = regs.wb3_data; } - for (i = 0; i < mmu030_idx_done; i++) { + for (i = 0; i < mmu030_idx_done + 1; i++) { m68k_areg(regs, 7) -= 4; x_put_long(m68k_areg(regs, 7), mmu030_ad[i].val); }