]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
68010 prefetch bus error updates (AND.L, EOR.L, OR.L, LEA). Mask IF/DF combination...
authorToni Wilen <twilen@winuae.net>
Sat, 22 Feb 2020 19:23:20 +0000 (21:23 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 22 Feb 2020 19:23:20 +0000 (21:23 +0200)
cputest/main.c
gencpu.cpp

index 2d058702076551e1ccf50442d2ba99b75cdf20f5..1972140ac0b724cd2928032502e8f21781ad3eba 100644 (file)
@@ -1411,9 +1411,10 @@ static int compare_exception(uae_u8 *s1, uae_u8 *s2, int len, int domask, uae_u8
                return memcmp(s1, s2, len);
        } else {
                for (int i = 0; i < len; i++) {
-                       if (mask[i])
+                       uae_u8 m = mask[i];
+                       if (m == 0)
                                continue;
-                       if (s1[i] != s2[i])
+                       if ((s1[i] & m) != (s2[i] & m))
                                return 1;
                }
                return 0;
@@ -1603,6 +1604,7 @@ static uae_u8 *validate_exception(struct registers *regs, uae_u8 *p, short excnu
                                break;
                        case 8: // 68010 bus/address error
                                {
+                                       uae_u16 ssw = (p[0] << 8) | p[1];
                                        exc[8] = *p++;
                                        exc[9] = *p++;
                                        excrwp = ((exc[8] & 1) == 0) ? 1 : 0;
@@ -1628,6 +1630,9 @@ static uae_u8 *validate_exception(struct registers *regs, uae_u8 *p, short excnu
                                        sp[22] = sp[23] = 0;
                                        if (basicexcept) {
                                                exclen = 14;
+                                               mask_exception = 1;
+                                               memset(masked_exception, 0xff, sizeof(masked_exception));
+                                               masked_exception[8] = ~0x30;
                                        } else {
                                                // ignore undocumented data
                                                exclen = 26;
@@ -1647,9 +1652,9 @@ static uae_u8 *validate_exception(struct registers *regs, uae_u8 *p, short excnu
                                                        // bus error read: cpu may still read the data, depends on hardware.
                                                        // ignore input buffer contents
                                                        mask_exception = 1;
-                                                       memset(masked_exception, 0, sizeof(masked_exception));
-                                                       masked_exception[20] = 1;
-                                                       masked_exception[21] = 1;
+                                                       memset(masked_exception, 0xff, sizeof(masked_exception));
+                                                       masked_exception[20] = 0;
+                                                       masked_exception[21] = 0;
                                                }
                                                alts = 3;
                                        }
index 571de5aeab6832e447e690207bc0f384b60e123a..ad196a0d132d7e9be8186e36dc2e2a51ddb70e87 100644 (file)
@@ -5112,12 +5112,20 @@ static void gen_opcode (unsigned int opcode)
                                        if (cpu_level == 0) {
                                                c += 2;
                                        }
-                                       if (cpu_level == 1 && curi->smode == immi) {
+                                       if (cpu_level == 1 && curi->smode == imm) {
                                                c += 2;
                                        }
-                                       fill_prefetch_next_after(1, "ccr_68000_long_move_ae_LZN(src);\ndreg_68000_long_replace_low(dstreg, src);\n");
+                                       if (cpu_level == 1 && (curi->smode == imm || curi->smode == Dreg)) {
+                                               fill_prefetch_next_after(0, "m68k_dreg(regs, dstreg) = (src);\n");
+                                       } else {
+                                               fill_prefetch_next_after(1, "ccr_68000_long_move_ae_LZN(src);\ndreg_68000_long_replace_low(dstreg, src);\n");
+                                       }
                                } else {
-                                       fill_prefetch_next_after(1, "dreg_68000_long_replace_low(dstreg, src);\n");
+                                       if (cpu_level == 1) {
+                                               fill_prefetch_next_after(0, "m68k_dreg(regs, dstreg) = (src);\n");
+                                       } else {
+                                               fill_prefetch_next_after(1, "dreg_68000_long_replace_low(dstreg, src);\n");
+                                       }
                                }
                                loopmodeextra = 4;
                                next_level_000();
@@ -7128,10 +7136,15 @@ bccl_not68020:
                if (curi->smode == Ad8r || curi->smode == PC8r)
                        addcycles000(2);
                if (curi->smode == absl) {
-                       strcpy(bus_error_code, "m68k_areg(regs, dstreg) = (m68k_areg(regs, dstreg) & 0x0000ffff) | (srca & 0xffff0000);\n");
-                       strcpy(bus_error_code2, "m68k_areg(regs, dstreg) = (srca);\n");
+                       if (cpu_level == 0) {
+                               strcpy(bus_error_code, "m68k_areg(regs, dstreg) = (m68k_areg(regs, dstreg) & 0x0000ffff) | (srca & 0xffff0000);\n");
+                               strcpy(bus_error_code2, "m68k_areg(regs, dstreg) = (srca);\n");
+                       }
+                       next_level_000();
                }  else if (curi->smode != Ad8r && curi->smode != PC8r) {
-                       strcpy(bus_error_code, "m68k_areg(regs, dstreg) = (srca);\n");
+                       if (cpu_level == 0) {
+                               strcpy(bus_error_code, "m68k_areg(regs, dstreg) = (srca);\n");
+                       }
                }
                genamodedual(curi,
                        curi->smode, "srcreg", curi->size, "src", 0, GF_AA,