# HG changeset patch # User Mike Pavone # Date 1357666464 28800 # Node ID 68af8a56ab7a995ea24b14dad0a15c92c2bf0af9 # Parent 48eb62ba63bcf6285ac3b7718f2e62c6c83b2a0d Fix scc to set reg to 0xFF rather than 1 when the condition is true diff -r 48eb62ba63bc -r 68af8a56ab7a m68k_to_x86.c --- a/m68k_to_x86.c Sun Jan 06 22:45:45 2013 -0800 +++ b/m68k_to_x86.c Tue Jan 08 09:34:24 2013 -0800 @@ -1694,9 +1694,9 @@ dst = cycles(dst, BUS); } if (dst_op.mode == MODE_REG_DIRECT) { - dst = mov_ir(dst, cond == COND_TRUE, dst_op.base, SZ_B); + dst = mov_ir(dst, cond == COND_TRUE ? 0xFF : 0, dst_op.base, SZ_B); } else { - dst = mov_irdisp8(dst, cond == COND_TRUE, dst_op.base, dst_op.disp, SZ_B); + dst = mov_irdisp8(dst, cond == COND_TRUE ? 0xFF : 0, dst_op.base, dst_op.disp, SZ_B); } } else { uint8_t cc = CC_NZ; @@ -1741,33 +1741,24 @@ dst = or_rr(dst, FLAG_Z, SCRATCH1, SZ_B); break; } - if ((inst->dst.addr_mode == MODE_REG || inst->dst.addr_mode == MODE_AREG)) { - uint8_t *true_off = dst + 1; - dst = jcc(dst, cc, dst+2); - dst = cycles(dst, BUS); - if (dst_op.mode == MODE_REG_DIRECT) { - dst = mov_ir(dst, 0, dst_op.base, SZ_B); - } else { - dst = mov_irdisp8(dst, 0, dst_op.base, dst_op.disp, SZ_B); - } - uint8_t *end_off = dst+1; - dst = jmp(dst, dst+2); - *true_off = dst - (true_off+1); - dst = cycles(dst, 6); - if (dst_op.mode == MODE_REG_DIRECT) { - dst = mov_ir(dst, 1, dst_op.base, SZ_B); - } else { - dst = mov_irdisp8(dst, 1, dst_op.base, dst_op.disp, SZ_B); - } - *end_off = dst - (end_off+1); + uint8_t *true_off = dst + 1; + dst = jcc(dst, cc, dst+2); + dst = cycles(dst, BUS); + if (dst_op.mode == MODE_REG_DIRECT) { + dst = mov_ir(dst, 0, dst_op.base, SZ_B); } else { - dst = cycles(dst, BUS); - if (dst_op.mode == MODE_REG_DIRECT) { - dst = setcc_r(dst, cc, dst_op.base); - } else { - dst = setcc_rdisp8(dst, cc, dst_op.base, dst_op.disp); - } + dst = mov_irdisp8(dst, 0, dst_op.base, dst_op.disp, SZ_B); } + uint8_t *end_off = dst+1; + dst = jmp(dst, dst+2); + *true_off = dst - (true_off+1); + dst = cycles(dst, 6); + if (dst_op.mode == MODE_REG_DIRECT) { + dst = mov_ir(dst, 0xFF, dst_op.base, SZ_B); + } else { + dst = mov_irdisp8(dst, 0xFF, dst_op.base, dst_op.disp, SZ_B); + } + *end_off = dst - (end_off+1); } dst = m68k_save_result(inst, dst, opts); return dst;