comparison m68k_to_x86.c @ 179:68af8a56ab7a

Fix scc to set reg to 0xFF rather than 1 when the condition is true
author Mike Pavone <pavone@retrodev.com>
date Tue, 08 Jan 2013 09:34:24 -0800
parents 48eb62ba63bc
children 3b4ef459aa8d
comparison
equal deleted inserted replaced
178:48eb62ba63bc 179:68af8a56ab7a
1692 dst = cycles(dst, 6); 1692 dst = cycles(dst, 6);
1693 } else { 1693 } else {
1694 dst = cycles(dst, BUS); 1694 dst = cycles(dst, BUS);
1695 } 1695 }
1696 if (dst_op.mode == MODE_REG_DIRECT) { 1696 if (dst_op.mode == MODE_REG_DIRECT) {
1697 dst = mov_ir(dst, cond == COND_TRUE, dst_op.base, SZ_B); 1697 dst = mov_ir(dst, cond == COND_TRUE ? 0xFF : 0, dst_op.base, SZ_B);
1698 } else { 1698 } else {
1699 dst = mov_irdisp8(dst, cond == COND_TRUE, dst_op.base, dst_op.disp, SZ_B); 1699 dst = mov_irdisp8(dst, cond == COND_TRUE ? 0xFF : 0, dst_op.base, dst_op.disp, SZ_B);
1700 } 1700 }
1701 } else { 1701 } else {
1702 uint8_t cc = CC_NZ; 1702 uint8_t cc = CC_NZ;
1703 switch (cond) 1703 switch (cond)
1704 { 1704 {
1739 dst = mov_rr(dst, FLAG_V, SCRATCH1, SZ_B); 1739 dst = mov_rr(dst, FLAG_V, SCRATCH1, SZ_B);
1740 dst = xor_rr(dst, FLAG_N, SCRATCH1, SZ_B); 1740 dst = xor_rr(dst, FLAG_N, SCRATCH1, SZ_B);
1741 dst = or_rr(dst, FLAG_Z, SCRATCH1, SZ_B); 1741 dst = or_rr(dst, FLAG_Z, SCRATCH1, SZ_B);
1742 break; 1742 break;
1743 } 1743 }
1744 if ((inst->dst.addr_mode == MODE_REG || inst->dst.addr_mode == MODE_AREG)) { 1744 uint8_t *true_off = dst + 1;
1745 uint8_t *true_off = dst + 1; 1745 dst = jcc(dst, cc, dst+2);
1746 dst = jcc(dst, cc, dst+2); 1746 dst = cycles(dst, BUS);
1747 dst = cycles(dst, BUS); 1747 if (dst_op.mode == MODE_REG_DIRECT) {
1748 if (dst_op.mode == MODE_REG_DIRECT) { 1748 dst = mov_ir(dst, 0, dst_op.base, SZ_B);
1749 dst = mov_ir(dst, 0, dst_op.base, SZ_B); 1749 } else {
1750 } else { 1750 dst = mov_irdisp8(dst, 0, dst_op.base, dst_op.disp, SZ_B);
1751 dst = mov_irdisp8(dst, 0, dst_op.base, dst_op.disp, SZ_B); 1751 }
1752 } 1752 uint8_t *end_off = dst+1;
1753 uint8_t *end_off = dst+1; 1753 dst = jmp(dst, dst+2);
1754 dst = jmp(dst, dst+2); 1754 *true_off = dst - (true_off+1);
1755 *true_off = dst - (true_off+1); 1755 dst = cycles(dst, 6);
1756 dst = cycles(dst, 6); 1756 if (dst_op.mode == MODE_REG_DIRECT) {
1757 if (dst_op.mode == MODE_REG_DIRECT) { 1757 dst = mov_ir(dst, 0xFF, dst_op.base, SZ_B);
1758 dst = mov_ir(dst, 1, dst_op.base, SZ_B); 1758 } else {
1759 } else { 1759 dst = mov_irdisp8(dst, 0xFF, dst_op.base, dst_op.disp, SZ_B);
1760 dst = mov_irdisp8(dst, 1, dst_op.base, dst_op.disp, SZ_B); 1760 }
1761 } 1761 *end_off = dst - (end_off+1);
1762 *end_off = dst - (end_off+1);
1763 } else {
1764 dst = cycles(dst, BUS);
1765 if (dst_op.mode == MODE_REG_DIRECT) {
1766 dst = setcc_r(dst, cc, dst_op.base);
1767 } else {
1768 dst = setcc_rdisp8(dst, cc, dst_op.base, dst_op.disp);
1769 }
1770 }
1771 } 1762 }
1772 dst = m68k_save_result(inst, dst, opts); 1763 dst = m68k_save_result(inst, dst, opts);
1773 return dst; 1764 return dst;
1774 } 1765 }
1775 1766