changeset 50:4836d1f3841a

Fix shift rotate instruction decoding and improve disassembly of move USP and conditional branch instructions
author Mike Pavone <pavone@retrodev.com>
date Thu, 13 Dec 2012 09:47:40 -0800
parents d2e43d64e999
children 937b47c9b79b
files 68kinst.c
diffstat 1 files changed, 24 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Wed Dec 12 23:21:11 2012 -0800
+++ b/68kinst.c	Thu Dec 13 09:47:40 2012 -0800
@@ -1008,11 +1008,14 @@
 			decoded->extra.size = (*istream >> 6) & 0x3;
 			immed = (*istream >> 9) & 0x7;
 			if (*istream & 0x100) {
-				decoded->src.addr_mode = MODE_IMMEDIATE;
-				decoded->src.params.immed = immed;
-			} else {
 				decoded->src.addr_mode = MODE_REG;
 				decoded->src.params.regs.pri = immed;
+			} else {
+				decoded->src.addr_mode = MODE_IMMEDIATE;
+				if (!immed) {
+					immed = 8;
+				}
+				decoded->src.params.immed = immed;
 			}
 			decoded->dst.addr_mode = MODE_REG;
 			decoded->dst.params.regs.pri = *istream & 0x7;
@@ -1067,7 +1070,7 @@
 	"move",//ccr
 	"move",//from_sr
 	"move",//sr
-	"move_usp",
+	"move",//usp
 	"movem",
 	"movep",
 	"muls",
@@ -1217,12 +1220,16 @@
 		ret = strlen(mnemonics[decoded->op]) - 2;
 		memcpy(dst, mnemonics[decoded->op], ret);
 		dst[ret] = 0;
-		strcat(dst, cond_mnem[decoded->extra.cond]);
+		strcpy(dst+ret, cond_mnem[decoded->extra.cond]);
 		ret = strlen(dst);
+		if (decoded->op != M68K_SCC) {
+			ret += sprintf(dst+ret, " #%d <%X>", decoded->src.params.immed, decoded->address + 2 + decoded->src.params.immed);
+			return ret;
+		}
 		break;
 	case M68K_BSR:
-		ret = sprintf(dst, "bsr%s", decoded->variant == VAR_BYTE ? ".s" : "");
-		break;
+		ret = sprintf(dst, "bsr%s #%d <%X>", decoded->variant == VAR_BYTE ? ".s" : "", decoded->src.params.immed, decoded->address + 2 + decoded->src.params.immed);
+		return ret;
 	case M68K_MOVE_FROM_SR:
 		ret = sprintf(dst, "%s", mnemonics[decoded->op]);
 		ret += sprintf(dst + ret, " SR");
@@ -1241,6 +1248,16 @@
 		ret += m68k_disasm_op(&(decoded->src), dst + ret, 0);
 		ret += sprintf(dst + ret, ", %s", special_op);
 		return ret;
+	case M68K_MOVE_USP:
+		ret = sprintf(dst, "%s", mnemonics[decoded->op]);
+		if (decoded->src.addr_mode != MODE_UNUSED) {
+			ret += m68k_disasm_op(&(decoded->src), dst + ret, 0);
+			ret += sprintf(dst + ret, ", USP");
+		} else {
+			ret += sprintf(dst + ret, "USP, ");
+			ret += m68k_disasm_op(&(decoded->dst), dst + ret, 0);
+		}
+		return ret;
 	default:
 		size = decoded->extra.size;
 		ret = sprintf(dst, "%s%s%s",