]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
68030 MMU update part 2, real cause for problem was side-effect of unaligned VBR...
authorToni Wilen <twilen@winuae.net>
Thu, 29 Nov 2018 19:47:18 +0000 (21:47 +0200)
committerToni Wilen <twilen@winuae.net>
Thu, 29 Nov 2018 19:47:18 +0000 (21:47 +0200)
cpummu30.cpp
newcpu.cpp

index 88375bf655b0897b119d864c10458873edac091f..99393b97b546d5fe3577d27b3702a7bc6f16112c 100644 (file)
@@ -1759,6 +1759,8 @@ void mmu030_page_fault(uaecptr addr, bool read, int flags, uae_u32 fc)
        regs.mmu_ssw |= read ? MMU030_SSW_RW : 0;
        regs.mmu_ssw |= flags;
        regs.mmu_ssw |= fc;
+       // store in wb3_data because stack frame creation may modify data buffer.
+       regs.wb3_data = mmu030_data_buffer_out;
     bBusErrorReadWrite = read; 
        mm030_stageb_address = addr;
 
@@ -2830,7 +2832,7 @@ void m68k_do_rte_mmu030 (uaecptr a7)
                        }
 #endif
 
-#if 0
+#if MMU030_DEBUG
                        write_log(_T("%08x %08x %08x %08x %08x %d %d %d %08x %08x\n"),
                                mmu030_state[1], mmu030_state[2], mmu030_disp_store[0], mmu030_disp_store[1],
                                addr, read, size, fc, mmu030_data_buffer_out, mmu030_ad[idxsize].val);
@@ -2860,8 +2862,6 @@ void m68k_do_rte_mmu030 (uaecptr a7)
                                        mmu030_ad[idxsize].done = true;
                                }
                        } else {
-                               // NeXTstep 1.0a modifies DOB and it must be ignored.
-                               mmu030_data_buffer_out = mmu030_ad[mmu030_idx].val;
                                if (mmu030_state[1] & MMU030_STATEFLAG1_SUBACCESS0) {
                                        mmu030_unaligned_write_continue(addr, fc, mmu030_put_generic);
                                } else {
index eaf53d85e07f28e632838569b8ee3970fbf5b950..82246f944c8c91452b6e0dc28d7a3e4f11121c69 100644 (file)
@@ -3204,8 +3204,7 @@ static void Exception_build_stack_frame (uae_u32 oldpc, uae_u32 currpc, uae_u32
                        }
 #endif
                        if (!(ssw & MMU030_SSW_RW)) {
-                               // NeXTstep 1.0a modifies DOB so store value in storage too.
-                               mmu030_ad[mmu030_idx].val = mmu030_data_buffer_out;
+                               mmu030_ad[mmu030_idx].val = regs.wb3_data;
                        }
                        for (i = 0; i < mmu030_idx + 1; i++) {
                                m68k_areg (regs, 7) -= 4;
@@ -3266,7 +3265,7 @@ static void Exception_build_stack_frame (uae_u32 oldpc, uae_u32 currpc, uae_u32
                        x_put_long (m68k_areg (regs, 7), mmu030_disp_store[0]);
                        m68k_areg (regs, 7) -= 4;
                        // Data output buffer = value that was going to be written
-                       x_put_long (m68k_areg (regs, 7), mmu030_data_buffer_out);
+                       x_put_long (m68k_areg (regs, 7), regs.wb3_data);
                        m68k_areg (regs, 7) -= 4;
                        x_put_long (m68k_areg (regs, 7), (mmu030_opcode & 0xffff) | (regs.prefetch020[0] << 16));  // Internal register (opcode storage)
                        m68k_areg (regs, 7) -= 4;