diff z80_to_x86.c @ 274:be2b845d3e94

Implement CPL and NEG (untested)
author Mike Pavone <pavone@retrodev.com>
date Thu, 02 May 2013 22:39:39 -0700
parents 719b9fea2fe9
children 1a7d0a964ad2
line wrap: on
line diff
--- a/z80_to_x86.c	Thu May 02 22:28:40 2013 -0700
+++ b/z80_to_x86.c	Thu May 02 22:39:39 2013 -0700
@@ -851,9 +851,23 @@
 		dst = z80_save_reg(dst, inst, opts);
 		dst = z80_save_ea(dst, inst, opts);
 		break;
-	/*case Z80_DAA:
+	//case Z80_DAA:
 	case Z80_CPL:
-	case Z80_NEG:*/
+		dst = zcycles(dst, 4);
+		dst = not_r(dst, opts->regs[Z80_A], SZ_B);
+		//TODO: Implement half-carry flag
+		dst = mov_irdisp8(dst, 1, CONTEXT, zf_off(ZF_N), SZ_B);
+		break;
+	case Z80_NEG:
+		dst = zcycles(dst, 8);
+		dst = neg_r(dst, opts->regs[Z80_A], SZ_B);
+		//TODO: Implement half-carry flag
+		dst = setcc_rdisp8(dst, CC_Z, CONTEXT, zf_off(ZF_Z));
+		dst = setcc_rdisp8(dst, CC_S, CONTEXT, zf_off(ZF_S));
+		dst = setcc_rdisp8(dst, CC_C, CONTEXT, zf_off(ZF_C));
+		dst = setcc_rdisp8(dst, CC_O, CONTEXT, zf_off(ZF_PV));
+		dst = mov_irdisp8(dst, 1, CONTEXT, zf_off(ZF_N), SZ_B);
+		break;
 	case Z80_CCF:
 		dst = zcycles(dst, 4);
 		dst = xor_irdisp8(dst, 1, CONTEXT, zf_off(ZF_C), SZ_B);