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;
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;
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)
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;
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;
#endif
return;
}
- } else if ((opcode & 0x0FB8) == 0x588) {
+ } else if ((opcode & 0x0FB8) == 0x0588) {
/* PLPA */
if (currprefs.cpu_model == 68060) {
int regno = opcode & 7;
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 */
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:
{