]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
68040/060 MMU register differences.
authorToni Wilen <twilen@winuae.net>
Sat, 3 Feb 2018 09:14:31 +0000 (11:14 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 3 Feb 2018 09:14:31 +0000 (11:14 +0200)
cpummu.cpp
include/cpummu.h
newcpu.cpp
newcpu_common.cpp

index f7c30724fc7e35f32935dd1c517ecd7d49cfce3f..6bdf14b0d52875093aa12dd7781661c5c9c461f1 100644 (file)
@@ -176,6 +176,7 @@ static void mmu_dump_table(const char * label, uaecptr root_ptr)
        ULONG pagemask = (1 << page_size) - 1;
        ULONG descmask = pagemask & ~(0x08 | 0x10); // mask out unused and M bits
 
+       root_ptr &= 0xfffffe00;
        console_out_f(_T("MMU dump start. Root = %08x. Page = %d\n"), root_ptr, 1 << page_size);
        totalpages = 1 << (32 - page_size);
        startaddr = 0;
@@ -1468,10 +1469,14 @@ void REGPARAM2 mmu_reset(void)
        mmu_set_funcs();
 }
 
-void REGPARAM2 mmu_set_tc(uae_u16 tc)
+uae_u16 REGPARAM2 mmu_set_tc(uae_u16 tc)
 {
-       if (currprefs.mmu_ec)
+       if (currprefs.mmu_ec) {
                tc &= ~(0x8000 | 0x4000);
+               // at least 68EC040 always returns zero when TC is read.
+               if (currprefs.cpu_model == 68040)
+                       tc = 0;
+       }
 
        regs.mmu_enabled = (tc & 0x8000) != 0;
        mmu_pagesize_8k = (tc & 0x4000) != 0;
@@ -1498,7 +1503,8 @@ void REGPARAM2 mmu_set_tc(uae_u16 tc)
 
        mmu_flush_atc_all(true);
 
-       write_log(_T("%d MMU: enabled=%d page8k=%d PC=%08x\n"), currprefs.mmu_model, regs.mmu_enabled, mmu_pagesize_8k, m68k_getpc());
+       write_log(_T("%d MMU: TC=%04x enabled=%d page8k=%d PC=%08x\n"), tc, currprefs.mmu_model, regs.mmu_enabled, mmu_pagesize_8k, m68k_getpc());
+       return tc;
 }
 
 void REGPARAM2 mmu_set_super(bool super)
index f7f306e7e7b44b1ff8845324922f76b4d8fbb879..7ff8f95d270275baac5eda90a18530a75dd92105 100644 (file)
@@ -225,7 +225,7 @@ extern void REGPARAM3 mmu_op_real(uae_u32 opcode, uae_u16 extra) REGPARAM;
 
 extern void REGPARAM3 mmu_reset(void) REGPARAM;
 extern void REGPARAM3 mmu_set_funcs(void) REGPARAM;
-extern void REGPARAM3 mmu_set_tc(uae_u16 tc) REGPARAM;
+extern uae_u16 REGPARAM3 mmu_set_tc(uae_u16 tc) REGPARAM;
 extern void REGPARAM3 mmu_set_super(bool super) REGPARAM;
 extern void REGPARAM3 mmu_flush_cache(void) REGPARAM;
 
index 05d6acacba936b406117182a82e50ebdc48b9509..c5bbddbdd26da06d3c408259fe5acd09a96d6491 100644 (file)
@@ -4287,7 +4287,7 @@ void mmu_op (uae_u32 opcode, uae_u32 extra)
                write_log (_T("PFLUSH\n"));
 #endif
                return;
-       } else if ((opcode & 0x0FD8) == 0x548) {
+       } else if ((opcode & 0x0FD8) == 0x0548) {
                if (currprefs.cpu_model < 68060) { /* PTEST not in 68060 */
                        /* PTEST */
                        int regno = opcode & 7;
@@ -4306,7 +4306,7 @@ void mmu_op (uae_u32 opcode, uae_u32 extra)
 #endif
                        return;
                }
-       } else if ((opcode & 0x0FB8) == 0x588) {
+       } else if ((opcode & 0x0FB8) == 0x0588) {
                /* PLPA */
                if (currprefs.cpu_model == 68060) {
                        int regno = opcode & 7;
index 9cd97e13dc7f179b6b082030146b8f0225b5d3a3..e0286ac15708bcc67965c44d02e0b772b50cd770 100644 (file)
@@ -131,7 +131,7 @@ int m68k_move2c (int regno, uae_u32 *regp)
                case 3:
                        regs.tcr = *regp & (currprefs.cpu_model == 68060 ? 0xfffe : 0xc000);
                        if (currprefs.mmu_model)
-                               mmu_set_tc (regs.tcr);
+                               regs.tcr = mmu_set_tc (regs.tcr);
                        break;
 
                        /* no differences between 68040 and 68060 */
@@ -149,9 +149,9 @@ int m68k_move2c (int regno, uae_u32 *regp)
                case 0x804: regs.isp = *regp; if (regs.m == 0) m68k_areg (regs, 7) = regs.isp; break;
                        /* 68040 only */
                case 0x805: regs.mmusr = *regp; break;
-                       /* 68040/060 */
-               case 0x806: regs.urp = *regp & 0xfffffe00; break;
-               case 0x807: regs.srp = *regp & 0xfffffe00; break;
+                        /* 68040 stores all bits, 68060 zeroes low 9 bits */
+               case 0x806: regs.urp = *regp & (currprefs.cpu_model == 68060 ? 0xfffffe00 : 0xffffffff); break;
+               case 0x807: regs.srp = *regp & (currprefs.cpu_model == 68060 ? 0xfffffe00 : 0xffffffff); break;
                        /* 68060 only */
                case 0x808:
                        {