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;
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;
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) {
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);
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) {
if (src == 0) {
divsl_divbyzero(extra, a);
- return false;
+ return 0;
}
if ((uae_u64)a == 0x8000000000000000UL && src == ~0u) {
if (src == 0) {
divul_divbyzero(extra, a);
- return false;
+ return 0;
}
rem = a % (uae_u64)src;
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 */
SET_NFLG(b < 0);
}
}
- return true;
+ return 1;
}
#endif