--- previous/src/cpu/gencpu.c 2018/04/24 19:25:47 1.1 +++ previous/src/cpu/gencpu.c 2018/04/24 19:27:48 1.1.1.2 @@ -2077,7 +2077,7 @@ static void gen_opcode (unsigned long in case i_NOP: fill_prefetch_next (); if (using_ce020) - printf ("\tdo_cycles_ce (6 * CYCLE_UNIT);\n"); + printf ("\tdo_cycles_ce (6 * CYCLE_UNIT);\n"); break; case i_STOP: if (using_prefetch) { @@ -2114,39 +2114,42 @@ static void gen_opcode (unsigned long in setpc ("pc"); printf ("\tMakeFromSR ();\n"); } else { - int old_brace_level = n_braces; - if (next_cpu_level < 0) - next_cpu_level = 0; - printf ("\tuae_u16 newsr; uae_u32 newpc;\n"); - printf ("\tfor (;;) {\n"); - printf ("\t\tuaecptr a = m68k_areg (regs, 7);\n"); - printf ("\t\tuae_s16 sr = %s (a);\n", srcw); - printf ("\t\tuae_s32 pc = %s (a + 2);\n", srcl); - printf ("\t\tuae_s16 format = %s (a + 2 + 4);\n", srcw); - printf ("\t\tint frame = format >> 12;\n"); - printf ("\t\tint offset = 8;\n"); - printf ("\t\tnewsr = sr; newpc = pc;\n"); - printf ("\t\tif (frame == 0x0) { m68k_areg (regs, 7) += offset; break; }\n"); - printf ("\t\telse if (frame == 0x1) { m68k_areg (regs, 7) += offset; }\n"); - printf ("\t\telse if (frame == 0x2) { m68k_areg (regs, 7) += offset + 4; break; }\n"); - printf ("\t\telse if (frame == 0x4) { m68k_areg (regs, 7) += offset + 8; break; }\n"); - if (using_mmu) - printf ("\t\telse if (frame == 0x7) { m68k_do_rte_mmu (a); m68k_areg (regs, 7) += offset + 52; break; }\n"); - printf ("\t\telse if (frame == 0x8) { m68k_areg (regs, 7) += offset + 50; break; }\n"); - printf ("\t\telse if (frame == 0x9) { m68k_areg (regs, 7) += offset + 12; break; }\n"); - 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 (14, 0 ,M68000_EXC_SRC_CPU); goto %s; }\n", endlabelstr); - printf ("\t\tregs.sr = newsr; MakeFromSR ();\n}\n"); - pop_braces (old_brace_level); - printf ("\tregs.sr = newsr; MakeFromSR ();\n"); - printf ("\tif (newpc & 1) {\n"); - printf ("\t\texception3i (0x%04X, m68k_getpc (), newpc);\n", opcode); - printf ("\t\tgoto %s;\n", endlabelstr); - printf ("\t}\n"); - printf ("\t\tm68k_setpc (newpc);\n"); - printf ("\tipl_fetch ();\n"); - need_endlabel = 1; + int old_brace_level = n_braces; + if (next_cpu_level < 0) + next_cpu_level = 0; + printf ("\tuae_u16 newsr; uae_u32 newpc;\n"); + printf ("\tfor (;;) {\n"); + printf ("\t\tuaecptr a = m68k_areg (regs, 7);\n"); + printf ("\t\tuae_s16 sr = %s (a);\n", srcw); + printf ("\t\tuae_s32 pc = %s (a + 2);\n", srcl); + printf ("\t\tuae_s16 format = %s (a + 2 + 4);\n", srcw); + printf ("\t\tint frame = format >> 12;\n"); + printf ("\t\tint offset = 8;\n"); + printf ("\t\tnewsr = sr; newpc = pc;\n"); + printf ("\t\tif (frame == 0x0) { m68k_areg (regs, 7) += offset; break; }\n"); + printf ("\t\telse if (frame == 0x1) { m68k_areg (regs, 7) += offset; }\n"); + printf ("\t\telse if (frame == 0x2) { m68k_areg (regs, 7) += offset + 4; break; }\n"); + printf ("\t\telse if (frame == 0x4) { m68k_areg (regs, 7) += offset + 8; break; }\n"); + if (using_mmu) + printf ("\t\telse if (frame == 0x7) { m68k_do_rte_mmu (a); m68k_areg (regs, 7) += offset + 52; break; }\n"); + printf ("\t\telse if (frame == 0x8) { m68k_areg (regs, 7) += offset + 50; break; }\n"); + printf ("\t\telse if (frame == 0x9) { m68k_areg (regs, 7) += offset + 12; break; }\n"); + 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 (14, 0 ,M68000_EXC_SRC_CPU); goto %s; }\n", endlabelstr); + printf ("\t\tregs.sr = newsr; MakeFromSR ();\n}\n"); + pop_braces (old_brace_level); + printf ("\tregs.sr = newsr; MakeFromSR ();\n"); + printf ("\tif (newpc & 1) {\n"); + printf ("\t\texception3i (0x%04X, m68k_getpc (), newpc);\n", opcode); + printf ("\t\tgoto %s;\n", endlabelstr); + printf ("\t}\n"); + if (using_mmu) + printf ("\t\tm68k_setpc_mmu (newpc);\n"); + else + printf ("\t\tm68k_setpc (newpc);\n"); + printf ("\tipl_fetch ();\n"); + need_endlabel = 1; } /* PC is set and prefetch filled. */ m68k_pc_offset = 0; @@ -2163,18 +2166,18 @@ static void gen_opcode (unsigned long in printf ("\tm68k_areg (regs, 7) += offs;\n"); printf ("\tif (pc & 1) {\n"); printf ("\t\texception3i (0x%04X, m68k_getpc (), pc);\n", opcode); - printf ("\t\tgoto %s;\n", endlabelstr); + printf ("\t\tgoto %s;\n", endlabelstr); printf ("\t}\n"); } - printf ("\tif (pc & 1) {\n"); - printf ("\t\texception3i (0x%04X, m68k_getpc(), pc);\n", opcode); - printf ("\t\tgoto %s;\n", endlabelstr); - printf ("\t}\n"); + printf ("\tif (pc & 1) {\n"); + printf ("\t\texception3i (0x%04X, m68k_getpc(), pc);\n", opcode); + printf ("\t\tgoto %s;\n", endlabelstr); + printf ("\t}\n"); setpc ("pc"); /* PC is set and prefetch filled. */ m68k_pc_offset = 0; fill_prefetch_full (); - need_endlabel = 1; + need_endlabel = 1; break; case i_LINK: // ce confirmed @@ -2199,9 +2202,9 @@ static void gen_opcode (unsigned long in // ce confirmed if (using_mmu) { genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0); - printf ("\tuae_s32 old = get_long_mmu (src);\n"); - printf ("\tm68k_areg (regs, 7) = src + 4;\n"); - printf ("\tm68k_areg (regs, srcreg) = old;\n"); + printf ("\tuae_s32 old = get_long_mmu (src);\n"); + printf ("\tm68k_areg (regs, 7) = src + 4;\n"); + printf ("\tm68k_areg (regs, srcreg) = old;\n"); } else { genamode (curi->smode, "srcreg", curi->size, "src", 1, 0, 0); printf ("\tm68k_areg (regs, 7) = src;\n"); @@ -2224,16 +2227,19 @@ static void gen_opcode (unsigned long in printf ("\tm68k_do_rts_mmu ();\n"); else printf ("\tm68k_do_rts ();\n"); - printf ("\tif (m68k_getpc () & 1) {\n"); - printf ("\t\tuaecptr faultpc = m68k_getpc ();\n"); - printf ("\t\tm68k_setpc (pc);\n"); - printf ("\t\texception3i (0x%04X, pc, faultpc);\n", opcode); - printf ("\t\tgoto %s;\n", endlabelstr); - printf ("\t}\n"); + printf ("\tif (m68k_getpc () & 1) {\n"); + printf ("\t\tuaecptr faultpc = m68k_getpc ();\n"); + if (using_mmu) + printf ("\t\tm68k_setpc_mmu (pc);\n"); + else + printf ("\t\tm68k_setpc (pc);\n"); + printf ("\t\texception3i (0x%04X, pc, faultpc);\n", opcode); + printf ("\t\tgoto %s;\n", endlabelstr); + printf ("\t}\n"); count_read += 2; m68k_pc_offset = 0; fill_prefetch_full (); - need_endlabel = 1; + need_endlabel = 1; break; case i_TRAPV: sync_m68k_pc (); @@ -3869,6 +3875,7 @@ int main (int argc, char **argv) } else if (i == 21 || i == 22 || i == 23) { cpu_level = 3 + (23 - i); using_ce020 = 2; + using_mmu = 1; if (i == 21) { read_counts (); for (rp = 0; rp < nr_cpuop_funcs; rp++)