diff 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
line wrap: on
line diff
--- a/m68k_to_x86.c	Sat Dec 29 20:33:39 2012 -0800
+++ b/m68k_to_x86.c	Sat Dec 29 21:10:07 2012 -0800
@@ -2075,20 +2075,39 @@
 	case M68K_LSR:
 		dst = translate_shift(dst, inst, &src_op, &dst_op, opts, shr_ir, shr_irdisp8, shr_clr, shr_clrdisp8, shl_ir, shl_irdisp8);
 		break;
-	/*case M68K_BCHG:
+	case M68K_BCHG:
 	case M68K_BCLR:
 	case M68K_BSET:
-		break;*/
 	case M68K_BTST:
 		dst = cycles(dst, inst->extra.size == OPSIZE_BYTE ? 4 : 6);
 		if (src_op.mode == MODE_IMMED) {
 			if (inst->extra.size == OPSIZE_BYTE) {
 				src_op.disp &= 0x7;
 			}
-			if (dst_op.mode == MODE_REG_DIRECT) {
-				dst = bt_ir(dst, src_op.disp, dst_op.base, SZ_D);
+			if (inst->op == M68K_BTST) {
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = bt_ir(dst, src_op.disp, dst_op.base, SZ_D);
+				} else {
+					dst = bt_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D);
+				}
+			} else if (inst->op == M68K_BSET) {
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = bts_ir(dst, src_op.disp, dst_op.base, SZ_D);
+				} else {
+					dst = bts_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D);
+				}
+			} else if (inst->op == M68K_BCLR) {
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = btr_ir(dst, src_op.disp, dst_op.base, SZ_D);
+				} else {
+					dst = btr_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D);
+				}
 			} else {
-				dst = bt_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D);
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = btc_ir(dst, src_op.disp, dst_op.base, SZ_D);
+				} else {
+					dst = btc_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, SZ_D);
+				}
 			}
 		} else {
 			if (src_op.mode == MODE_REG_DISPLACE8) {
@@ -2104,10 +2123,30 @@
 			if (inst->extra.size == OPSIZE_BYTE) {
 				dst = and_ir(dst, 0x7, src_op.base, SZ_B);
 			}
-			if (dst_op.mode == MODE_REG_DIRECT) {
-				dst = bt_rr(dst, src_op.base, dst_op.base, SZ_D);
+			if (inst->op == M68K_BTST) {
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = bt_rr(dst, src_op.base, dst_op.base, SZ_D);
+				} else {
+					dst = bt_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D);
+				}
+			} else if (inst->op == M68K_BSET) {
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = bts_rr(dst, src_op.base, dst_op.base, SZ_D);
+				} else {
+					dst = bts_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D);
+				}
+			} else if (inst->op == M68K_BCLR) {
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = btr_rr(dst, src_op.base, dst_op.base, SZ_D);
+				} else {
+					dst = btr_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D);
+				}
 			} else {
-				dst = bt_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D);
+				if (dst_op.mode == MODE_REG_DIRECT) {
+					dst = btc_rr(dst, src_op.base, dst_op.base, SZ_D);
+				} else {
+					dst = btc_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, SZ_D);
+				}
 			}
 		}
 		//x86 sets the carry flag to the value of the bit tested