changeset 120:3648abc45aec

Fix decoding of CMPA
author Mike Pavone <pavone@retrodev.com>
date Fri, 28 Dec 2012 22:47:22 -0800
parents ee19ddadb398
children f848aad2abef
files 68kinst.c
diffstat 1 files changed, 27 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Fri Dec 28 22:47:10 2012 -0800
+++ b/68kinst.c	Fri Dec 28 22:47:22 2012 -0800
@@ -839,27 +839,39 @@
 	case RESERVED:
 		break;
 	case CMP_XOR:
-		size = *istream >> 6 & 0x3;
+		size = (*istream >> 6) & 0x3;
 		decoded->op = M68K_CMP;
 		if (*istream & 0x100) {
-			//CMPM or EOR
-			istream = m68k_decode_op(istream, size, &(decoded->dst));
-			if (decoded->src.addr_mode == MODE_AREG) {
-				//CMPM
-				decoded->src.addr_mode = decoded->dst.addr_mode = MODE_AREG_POSTINC;
-				decoded->src.params.regs.pri = decoded->dst.params.regs.pri;
+			//CMPM or CMPA.l or EOR
+			if (size == OPSIZE_INVALID) {
+				decoded->extra.size = OPSIZE_LONG;
+				decoded->dst.addr_mode = MODE_AREG;
 				decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
+				istream = m68k_decode_op(istream, size, &(decoded->src));
 			} else {
-				//EOR
-				decoded->op = M68K_EOR;
-				decoded->extra.size = size;
-				decoded->src.addr_mode = MODE_REG;
-				decoded->src.params.regs.pri = m68k_reg_quick_field(*istream);
+				istream = m68k_decode_op(istream, size, &(decoded->dst));
+				if (decoded->src.addr_mode == MODE_AREG) {
+					//CMPM
+					decoded->src.addr_mode = decoded->dst.addr_mode = MODE_AREG_POSTINC;
+					decoded->src.params.regs.pri = decoded->dst.params.regs.pri;
+					decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
+				} else {
+					//EOR
+					decoded->op = M68K_EOR;
+					decoded->extra.size = size;
+					decoded->src.addr_mode = MODE_REG;
+					decoded->src.params.regs.pri = m68k_reg_quick_field(*istream);
+				}
 			}
 		} else {
-			//CMP
-			decoded->extra.size = size;
-			decoded->dst.addr_mode = MODE_REG;
+			//CMP or CMPA.w
+			if (size == OPSIZE_INVALID) {
+				decoded->extra.size = OPSIZE_WORD;
+				decoded->dst.addr_mode = MODE_AREG;
+			} else {
+				decoded->extra.size = size;
+				decoded->dst.addr_mode = MODE_REG;
+			}
 			decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
 			istream = m68k_decode_op(istream, size, &(decoded->src));
 		}