From: Toni Wilen Date: Mon, 6 Jul 2020 19:28:14 +0000 (+0300) Subject: DIVL causing exception should only reset (an)+/-(an) if 68060 unimplemented. X-Git-Tag: 4900~357 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=edf73ea6e30321cbd09f366c47d246b31e7b8821;p=francis%2Fwinuae.git DIVL causing exception should only reset (an)+/-(an) if 68060 unimplemented. --- diff --git a/gencpu.cpp b/gencpu.cpp index 6eaf372c..971ecd43 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -8568,9 +8568,13 @@ bccl_not68020: genamode(curi, curi->smode, "srcreg", curi->size, "extra", 1, 0, 0); genamode(curi, curi->dmode, "dstreg", curi->size, "dst", 1, 0, 0); sync_m68k_pc(); - out("if (!m68k_divl(opcode, dst, extra)) {\n"); - if (mmufixupcnt) + out("int e = m68k_divl(opcode, dst, extra);\n"); + out("if (e <= 0) {\n"); + if (mmufixupcnt) { + out("if (e < 0) {\n"); out("cpu_restore_fixup();\n"); + out("}\n"); + } write_return_cycles(0); out("}\n"); break; @@ -8578,9 +8582,13 @@ bccl_not68020: genamode(curi, curi->smode, "srcreg", curi->size, "extra", 1, 0, 0); genamode(curi, curi->dmode, "dstreg", curi->size, "dst", 1, 0, 0); sync_m68k_pc(); - out("if (!m68k_mull(opcode, dst, extra)) {\n"); - if (mmufixupcnt) + out("int e = m68k_mull(opcode, dst, extra);\n"); + out("if (e <= 0) {\n"); + if (mmufixupcnt) { + out("if (e < 0) {\n"); out("cpu_restore_fixup();\n"); + out("}\n"); + } write_return_cycles(0); out("}\n"); break; @@ -8610,7 +8618,7 @@ bccl_not68020: genamode(curi, curi->dmode, "dstreg", sz_long, "dst", 2, 0, 0); out("uae_u32 bdata[2];\n"); out("uae_s32 offset = extra & 0x800 ? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f;\n"); - out("int width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) -1) & 0x1f) +1;\n"); + out("int width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) - 1) & 0x1f) + 1;\n"); if (curi->mnemo == i_BFFFO) out("uae_u32 offset2 = offset;\n"); if (curi->dmode == Dreg) { diff --git a/include/newcpu.h b/include/newcpu.h index ecd781ff..3c818a9e 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -680,8 +680,8 @@ extern void doint (void); extern void dump_counts (void); extern int m68k_move2c (int, uae_u32 *); extern int m68k_movec2 (int, uae_u32 *); -extern bool m68k_divl (uae_u32, uae_u32, uae_u16); -extern bool m68k_mull (uae_u32, uae_u32, uae_u16); +extern int m68k_divl (uae_u32, uae_u32, uae_u16); +extern int m68k_mull (uae_u32, uae_u32, uae_u16); extern void init_m68k (void); extern void m68k_go (int); extern void m68k_dumpstate(uaecptr *, uaecptr); diff --git a/newcpu_common.cpp b/newcpu_common.cpp index ec19665a..25b268ea 100644 --- a/newcpu_common.cpp +++ b/newcpu_common.cpp @@ -1239,11 +1239,11 @@ static void divul_divbyzero(uae_u16 extra, uae_s64 a) Exception_cpu(5); } -bool m68k_divl (uae_u32 opcode, uae_u32 src, uae_u16 extra) +int m68k_divl(uae_u32 opcode, uae_u32 src, uae_u16 extra) { if ((extra & 0x400) && currprefs.int_no_unimplemented && currprefs.cpu_model == 68060) { op_unimpl (opcode); - return false; + return -1; } if (extra & 0x800) { @@ -1258,7 +1258,7 @@ bool m68k_divl (uae_u32 opcode, uae_u32 src, uae_u16 extra) if (src == 0) { divsl_divbyzero(extra, a); - return false; + return 0; } if ((uae_u64)a == 0x8000000000000000UL && src == ~0u) { @@ -1292,7 +1292,7 @@ bool m68k_divl (uae_u32 opcode, uae_u32 src, uae_u16 extra) if (src == 0) { divul_divbyzero(extra, a); - return false; + return 0; } rem = a % (uae_u64)src; @@ -1308,15 +1308,15 @@ bool m68k_divl (uae_u32 opcode, uae_u32 src, uae_u16 extra) m68k_dreg (regs, (extra >> 12) & 7) = (uae_u32)quot; } } - return true; + return 1; } -bool m68k_mull (uae_u32 opcode, uae_u32 src, uae_u16 extra) +int m68k_mull (uae_u32 opcode, uae_u32 src, uae_u16 extra) { if ((extra & 0x400) && currprefs.int_no_unimplemented && currprefs.cpu_model == 68060) { op_unimpl (opcode); - return false; + return -1; } if (extra & 0x800) { /* signed */ @@ -1379,7 +1379,7 @@ bool m68k_mull (uae_u32 opcode, uae_u32 src, uae_u16 extra) SET_NFLG(b < 0); } } - return true; + return 1; } #endif