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;
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;
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;
// 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;
}
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();
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,