]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
DIVL causing exception should only reset (an)+/-(an) if 68060 unimplemented.
authorToni Wilen <twilen@winuae.net>
Mon, 6 Jul 2020 19:28:14 +0000 (22:28 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 6 Jul 2020 19:28:14 +0000 (22:28 +0300)
gencpu.cpp
include/newcpu.h
newcpu_common.cpp

index 6eaf372c05aaa3a378fd198498f68514fe4c9727..971ecd431a5c7620114ebd5ef87ff27df76bf6a4 100644 (file)
@@ -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) {
index ecd781ff7e9a83716dea029e5fce22f47037408c..3c818a9e8a2e25111aa7317a5a7c7d8b743ebe32 100644 (file)
@@ -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);
index ec19665aca510d3862ec1b4ef72d2068f48c0b35..25b268ea0c68642ad456c2a43e8933671d851331 100644 (file)
@@ -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