From: Toni Wilen Date: Sun, 7 May 2017 12:03:57 +0000 (+0300) Subject: RTE emulation was not fully model specific. X-Git-Tag: 3500~36 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=29d2e4e014155a204952b4a31710ef76e4ea84b8;p=francis%2Fwinuae.git RTE emulation was not fully model specific. --- diff --git a/gencpu.cpp b/gencpu.cpp index 2420d64e..d602cbc9 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -3884,13 +3884,15 @@ static void gen_opcode (unsigned int opcode) } else if (cpu_level >= 4) { printf ("\t\telse if (frame == 0x7) { m68k_areg (regs, 7) += offset + 52; break; }\n"); } - printf ("\t\telse if (frame == 0x9) { m68k_areg (regs, 7) += offset + 12; break; }\n"); - if (using_mmu == 68030) { - printf ("\t\telse if (frame == 0xa) { m68k_do_rte_mmu030 (a); break; }\n"); - printf ("\t\telse if (frame == 0xb) { m68k_do_rte_mmu030 (a); break; }\n"); - } else { - printf ("\t\telse if (frame == 0xa) { m68k_areg (regs, 7) += offset + 24; break; }\n"); - printf ("\t\telse if (frame == 0xb) { m68k_areg (regs, 7) += offset + 84; break; }\n"); + if (cpu_level == 2 || cpu_level == 3) { // 68020/68030 only + printf ("\t\telse if (frame == 0x9) { m68k_areg (regs, 7) += offset + 12; break; }\n"); + if (using_mmu == 68030) { + printf ("\t\telse if (frame == 0xa) { m68k_do_rte_mmu030 (a); break; }\n"); + printf ("\t\telse if (frame == 0xb) { m68k_do_rte_mmu030 (a); break; }\n"); + } else { + printf ("\t\telse if (frame == 0xa) { m68k_areg (regs, 7) += offset + 24; break; }\n"); + printf ("\t\telse if (frame == 0xb) { m68k_areg (regs, 7) += offset + 84; break; }\n"); + } } printf ("\t\telse { m68k_areg (regs, 7) += offset; Exception_cpu(14); goto %s; }\n", endlabelstr); printf ("\t\tregs.sr = newsr;\n"); @@ -3913,6 +3915,7 @@ static void gen_opcode (unsigned int opcode) tail_ce020_done = true; fill_prefetch_full_ntx(); branch_inst = 1; + next_cpu_level = cpu_level - 1; break; case i_RTD: addop_ce020 (curi, 0); @@ -5351,7 +5354,7 @@ bccl_not68020: if (using_mmu) printf ("\tflush_mmu%s(m68k_areg (regs, opcode & 3), (opcode >> 6) & 3);\n", mmu_postfix); printf ("\tif (opcode & 0x80)\n"); - printf ("\t\tflush_icache(m68k_areg (regs, opcode & 3), (opcode >> 6) & 3);\n"); + printf ("\t\tflush_icache((opcode >> 6) & 3);\n"); break; case i_MOVE16: