diff 68kinst.c @ 184:ebcbdd1c4cc8

Fix a bunch of bugs in the CPU core, add a 68K debugger
author Mike Pavone <pavone@retrodev.com>
date Sun, 13 Jan 2013 13:01:13 -0800
parents 2f08d9e90a4c
children 7c227a8ec53d
line wrap: on
line diff
--- a/68kinst.c	Wed Jan 09 22:31:07 2013 -0800
+++ b/68kinst.c	Sun Jan 13 13:01:13 2013 -0800
@@ -479,13 +479,13 @@
 					break;
 #endif
 				}
+				decoded->dst.addr_mode = MODE_REG;
+				decoded->dst.addr_mode = m68k_reg_quick_field(*istream);
 				istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src));
 				if (!istream) {
 					decoded->op = M68K_INVALID;
 					return start+1;
 				}
-				decoded->dst.addr_mode = MODE_REG;
-				decoded->dst.addr_mode = m68k_reg_quick_field(*istream);
 			} else {
 				opmode = (*istream >> 3) & 0x7;
 				if ((*istream & 0xB80) == 0x880 && opmode != MODE_REG && opmode != MODE_AREG) {
@@ -959,13 +959,13 @@
 				//SUBX
 				decoded->op = M68K_SUBX;
 				decoded->extra.size = size;
-				istream = m68k_decode_op(istream, size, &(decoded->src));
-				if (!istream) {
-					decoded->op = M68K_INVALID;
-					return start+1;
+				decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
+				decoded->src.params.regs.pri = *istream & 0x7;
+				if (*istream & 0x8) {
+					decoded->dst.addr_mode = decoded->src.addr_mode = MODE_AREG_PREDEC;
+				} else {
+					decoded->dst.addr_mode = decoded->src.addr_mode = MODE_REG;
 				}
-				decoded->dst.addr_mode = decoded->src.addr_mode;
-				decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
 			}
 		} else {
 			if (size == OPSIZE_INVALID) {
@@ -1001,6 +1001,7 @@
 					return start+1;
 				}
 			} else {
+				reg = m68k_reg_quick_field(*istream);
 				istream = m68k_decode_op(istream, size, &(decoded->dst));
 				if (!istream) {
 					decoded->op = M68K_INVALID;
@@ -1011,12 +1012,12 @@
 					//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);
+					decoded->dst.params.regs.pri = reg;
 				} else {
 					//EOR
 					decoded->op = M68K_EOR;
 					decoded->src.addr_mode = MODE_REG;
-					decoded->src.params.regs.pri = m68k_reg_quick_field(*istream);
+					decoded->src.params.regs.pri = reg;
 				}
 			}
 		} else {
@@ -1142,15 +1143,14 @@
 			} else {
 				//ADDX
 				decoded->op = M68K_ADDX;
-				//FIXME: Size is not technically correct
 				decoded->extra.size = size;
-				istream = m68k_decode_op(istream, size, &(decoded->src));
-				if (!istream) {
-					decoded->op = M68K_INVALID;
-					return start+1;
+				decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
+				decoded->src.params.regs.pri = *istream & 0x7;
+				if (*istream & 0x8) {
+					decoded->dst.addr_mode = decoded->src.addr_mode = MODE_AREG_PREDEC;
+				} else {
+					decoded->dst.addr_mode = decoded->src.addr_mode = MODE_REG;
 				}
-				decoded->dst.addr_mode = decoded->src.addr_mode;
-				decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
 			}
 		} else {
 			if (size == OPSIZE_INVALID) {