changeset 10:4553fc97b15e

Added new OPSIZE for unsized instructions so they can be properly disassembled without making them special cases
author Mike Pavone <pavone@retrodev.com>
date Wed, 14 Nov 2012 09:24:40 -0800
parents 0a0cd3705c19
children d5e9bac9ebdf
files 68kinst.c 68kinst.h
diffstat 2 files changed, 16 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Tue Nov 13 18:26:43 2012 -0800
+++ b/68kinst.c	Wed Nov 14 09:24:40 2012 -0800
@@ -473,8 +473,8 @@
 #ifdef M68010
 							decoded->op = M68K_BKPT;
 							decoded->src.addr_mode = MODE_IMMEDIATE;
-							decoded->extra.size = OPSIZE_BYTE;
-							decoded->src.params.u8 = *istream & 0x7;
+							decoded->extra.size = OPSIZE_UNSIZED;
+							decoded->src.params.u32 = *istream & 0x7;
 #endif
 							break;
 						case 0x10:
@@ -512,6 +512,7 @@
 							//BGND - CPU32 only
 						} else if (optype == 0xFC) {
 							decoded->op = M68K_ILLEGAL;
+							decoded->extra.size = OPSIZE_UNSIZED;
 						} else {
 							if (size == OPSIZE_INVALID) {
 								decoded->op = M68K_TAS;
@@ -537,7 +538,8 @@
 							} else {
 								decoded->op = M68K_JSR;
 							}
-							istream = m68k_decode_op(istream, OPSIZE_INVALID, &(decoded->src));
+							decoded->extra.size = OPSIZE_UNSIZED;
+							istream = m68k_decode_op(istream, OPSIZE_UNSIZED, &(decoded->src));
 						} else {
 							//it would appear bit 6 needs to be set for it to be a valid instruction here
 							switch((*istream >> 3) & 0x7)
@@ -546,9 +548,9 @@
 							case 1:
 								//TRAP
 								decoded->op = M68K_TRAP;
-								decoded->extra.size = OPSIZE_BYTE;
+								decoded->extra.size = OPSIZE_UNSIZED;
 								decoded->src.addr_mode = MODE_IMMEDIATE;
-								decoded->src.params.u8 = *istream & 0xF;
+								decoded->src.params.u32 = *istream & 0xF;
 								break;
 							case 2:
 								//LINK.w
@@ -562,6 +564,7 @@
 							case 3:
 								//UNLK
 								decoded->op = M68K_UNLK;
+								decoded->extra.size = OPSIZE_UNSIZED;
 								decoded->dst.addr_mode = MODE_AREG;
 								decoded->dst.params.regs.pri = *istream & 0x7;
 								break;
@@ -578,6 +581,7 @@
 								}
 								break;
 							case 6:
+								decoded->extra.size = OPSIZE_UNSIZED;
 								switch(*istream & 0x7)
 								{
 								case 0:
@@ -588,9 +592,8 @@
 									break;
 								case 2:
 									decoded->op = M68K_STOP;
-									decoded->extra.size = OPSIZE_WORD;
 									decoded->src.addr_mode = MODE_IMMEDIATE;
-									decoded->src.params.u16 =*(++istream);
+									decoded->src.params.u32 =*(++istream);
 									break;
 								case 3:
 									decoded->op = M68K_RTE;
@@ -598,9 +601,8 @@
 								case 4:
 #ifdef M68010
 									decoded->op = M68K_RTD;
-									decoded->extra.size = OPSIZE_WORD;
 									decoded->src.addr_mode = MODE_IMMEDIATE;
-									decoded->src.params.u16 =*(++istream);
+									decoded->src.params.u32 =*(++istream);
 #endif
 									break;
 								case 5:
@@ -1080,7 +1082,7 @@
 	case MODE_AREG_PREDEC:
 		return sprintf(dst, "%s -(a%d)", c, decoded->params.regs.pri);
 	case MODE_IMMEDIATE:
-		return sprintf(dst, "%s #%d", c, size == OPSIZE_LONG ? decoded->params.u32 : (size == OPSIZE_WORD ? decoded->params.u16 : decoded->params.u8));
+		return sprintf(dst, "%s #%d", c, (size == OPSIZE_LONG || size == OPSIZE_UNSIZED) ? decoded->params.u32 : (size == OPSIZE_WORD ? decoded->params.u16 : decoded->params.u8));
 	default:
 		return 0;
 	}
@@ -1102,10 +1104,10 @@
 		ret = sprintf(dst, "bsr%s", decoded->variant == VAR_BYTE ? ".s" : "");
 	} else {
 		size = decoded->extra.size;
-		ret = sprintf(dst, "%s%s.%c", 
+		ret = sprintf(dst, "%s%s.%s", 
 				mnemonics[decoded->op], 
 				decoded->variant == VAR_QUICK ? "q" : (decoded->variant == VAR_IMMEDIATE ? "i" : ""), 
-				decoded->extra.size == OPSIZE_BYTE ? 'b' : (size == OPSIZE_WORD ? 'w' : 'l'));
+				size == OPSIZE_BYTE ? "b" : (size == OPSIZE_WORD ? "w" : (size == OPSIZE_LONG ? "l" : "")));
 	}
 	op1len = m68K_disasm_op(&(decoded->src), size, dst + ret, 0);
 	ret += op1len;
--- a/68kinst.h	Tue Nov 13 18:26:43 2012 -0800
+++ b/68kinst.h	Wed Nov 14 09:24:40 2012 -0800
@@ -105,7 +105,8 @@
 	OPSIZE_BYTE=0,
 	OPSIZE_WORD,
 	OPSIZE_LONG,
-	OPSIZE_INVALID
+	OPSIZE_INVALID,
+	OPSIZE_UNSIZED
 } m68K_opsizes;
 
 typedef enum {