Mercurial > repos > blastem
comparison m68k_to_x86.c @ 123:bd3858121ab0
Implement the rest of the bit instructions
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 29 Dec 2012 21:10:07 -0800 |
parents | 0a6da6c7c463 |
children | da95566514f3 |
comparison
equal
deleted
inserted
replaced
122:0a6da6c7c463 | 123:bd3858121ab0 |
---|---|
2073 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, sar_ir, sar_irdisp8, sar_clr, sar_clrdisp8, NULL, NULL); | 2073 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, sar_ir, sar_irdisp8, sar_clr, sar_clrdisp8, NULL, NULL); |
2074 break; | 2074 break; |
2075 case M68K_LSR: | 2075 case M68K_LSR: |
2076 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, shr_ir, shr_irdisp8, shr_clr, shr_clrdisp8, shl_ir, shl_irdisp8); | 2076 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, shr_ir, shr_irdisp8, shr_clr, shr_clrdisp8, shl_ir, shl_irdisp8); |
2077 break; | 2077 break; |
2078 /*case M68K_BCHG: | 2078 case M68K_BCHG: |
2079 case M68K_BCLR: | 2079 case M68K_BCLR: |
2080 case M68K_BSET: | 2080 case M68K_BSET: |
2081 break;*/ | |
2082 case M68K_BTST: | 2081 case M68K_BTST: |
2083 dst = cycles(dst, inst->extra.size == OPSIZE_BYTE ? 4 : 6); | 2082 dst = cycles(dst, inst->extra.size == OPSIZE_BYTE ? 4 : 6); |
2084 if (src_op.mode == MODE_IMMED) { | 2083 if (src_op.mode == MODE_IMMED) { |
2085 if (inst->extra.size == OPSIZE_BYTE) { | 2084 if (inst->extra.size == OPSIZE_BYTE) { |
2086 src_op.disp &= 0x7; | 2085 src_op.disp &= 0x7; |
2087 } | 2086 } |
2088 if (dst_op.mode == MODE_REG_DIRECT) { | 2087 if (inst->op == M68K_BTST) { |
2089 dst = bt_ir(dst, src_op.disp, dst_op.base, SZ_D); | 2088 if (dst_op.mode == MODE_REG_DIRECT) { |
2090 } else { | 2089 dst = bt_ir(dst, src_op.disp, dst_op.base, SZ_D); |
2091 dst = bt_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D); | 2090 } else { |
2091 dst = bt_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D); | |
2092 } | |
2093 } else if (inst->op == M68K_BSET) { | |
2094 if (dst_op.mode == MODE_REG_DIRECT) { | |
2095 dst = bts_ir(dst, src_op.disp, dst_op.base, SZ_D); | |
2096 } else { | |
2097 dst = bts_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D); | |
2098 } | |
2099 } else if (inst->op == M68K_BCLR) { | |
2100 if (dst_op.mode == MODE_REG_DIRECT) { | |
2101 dst = btr_ir(dst, src_op.disp, dst_op.base, SZ_D); | |
2102 } else { | |
2103 dst = btr_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D); | |
2104 } | |
2105 } else { | |
2106 if (dst_op.mode == MODE_REG_DIRECT) { | |
2107 dst = btc_ir(dst, src_op.disp, dst_op.base, SZ_D); | |
2108 } else { | |
2109 dst = btc_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D); | |
2110 } | |
2092 } | 2111 } |
2093 } else { | 2112 } else { |
2094 if (src_op.mode == MODE_REG_DISPLACE8) { | 2113 if (src_op.mode == MODE_REG_DISPLACE8) { |
2095 if (dst_op.base == SCRATCH1) { | 2114 if (dst_op.base == SCRATCH1) { |
2096 dst = push_r(dst, SCRATCH2); | 2115 dst = push_r(dst, SCRATCH2); |
2102 } | 2121 } |
2103 } | 2122 } |
2104 if (inst->extra.size == OPSIZE_BYTE) { | 2123 if (inst->extra.size == OPSIZE_BYTE) { |
2105 dst = and_ir(dst, 0x7, src_op.base, SZ_B); | 2124 dst = and_ir(dst, 0x7, src_op.base, SZ_B); |
2106 } | 2125 } |
2107 if (dst_op.mode == MODE_REG_DIRECT) { | 2126 if (inst->op == M68K_BTST) { |
2108 dst = bt_rr(dst, src_op.base, dst_op.base, SZ_D); | 2127 if (dst_op.mode == MODE_REG_DIRECT) { |
2109 } else { | 2128 dst = bt_rr(dst, src_op.base, dst_op.base, SZ_D); |
2110 dst = bt_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D); | 2129 } else { |
2130 dst = bt_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D); | |
2131 } | |
2132 } else if (inst->op == M68K_BSET) { | |
2133 if (dst_op.mode == MODE_REG_DIRECT) { | |
2134 dst = bts_rr(dst, src_op.base, dst_op.base, SZ_D); | |
2135 } else { | |
2136 dst = bts_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D); | |
2137 } | |
2138 } else if (inst->op == M68K_BCLR) { | |
2139 if (dst_op.mode == MODE_REG_DIRECT) { | |
2140 dst = btr_rr(dst, src_op.base, dst_op.base, SZ_D); | |
2141 } else { | |
2142 dst = btr_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D); | |
2143 } | |
2144 } else { | |
2145 if (dst_op.mode == MODE_REG_DIRECT) { | |
2146 dst = btc_rr(dst, src_op.base, dst_op.base, SZ_D); | |
2147 } else { | |
2148 dst = btc_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D); | |
2149 } | |
2111 } | 2150 } |
2112 } | 2151 } |
2113 //x86 sets the carry flag to the value of the bit tested | 2152 //x86 sets the carry flag to the value of the bit tested |
2114 //68K sets the zero flag to the complement of the bit tested | 2153 //68K sets the zero flag to the complement of the bit tested |
2115 dst = setcc_r(dst, CC_NC, FLAG_Z); | 2154 dst = setcc_r(dst, CC_NC, FLAG_Z); |