changeset 79:d212e0cd0b7e

Implement indexed with 8-bit displacement addressing modes in decoder and disassembler
author Mike Pavone <pavone@retrodev.com>
date Fri, 21 Dec 2012 22:24:45 -0800
parents 463641032588
children 7b1e16e981ef
files 68kinst.c 68kinst.h
diffstat 2 files changed, 32 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Fri Dec 21 21:53:05 2012 -0800
+++ b/68kinst.c	Fri Dec 21 22:24:45 2012 -0800
@@ -31,7 +31,15 @@
 		dst->params.regs.displacement = sign_extend16(ext);
 		break;
 	case MODE_AREG_INDEX_MEM:
-		//TODO: implement me
+		#ifdef M68020
+			//TODO: implement me for M68020+ support
+		#else
+			dst->addr_mode = MODE_AREG_INDEX_DISP8;
+			dst->params.regs.pri = reg;
+			ext = *(++cur);
+			dst->params.regs.sec = ext >> 11;//includes areg/dreg bit, reg num and word/long bit
+			dst->params.regs.displacement = sign_extend8(ext&0xFF);
+		#endif
 		break;
 	case MODE_PC_INDIRECT_ABS_IMMED:
 		switch(reg)
@@ -46,6 +54,15 @@
 			ext = *(++cur);
 			dst->params.immed = ext << 16 | *(++cur);
 			break;
+		case 3:
+#ifdef M68020
+			//TODO: Implement me for M68020+ support;
+#else
+			dst->addr_mode = MODE_PC_INDEX_DISP8;
+			ext = *(++cur);
+			dst->params.regs.sec = ext >> 11;//includes areg/dreg bit, reg num and word/long bit
+			dst->params.regs.displacement = sign_extend8(ext&0xFF);
+#endif
 		case 2:
 			dst->addr_mode = MODE_PC_DISPLACE;
 			ext = *(++cur);
@@ -67,7 +84,6 @@
 				break;
 			}
 			break;
-		//TODO: implement the rest of these
 		}
 		break;
 	}
@@ -1147,7 +1163,9 @@
 	case MODE_AREG_PREDEC:
 		return sprintf(dst, "%s -(a%d)", c, decoded->params.regs.pri);
 	case MODE_AREG_DISPLACE:
-		return sprintf(dst, "%s (a%d, %d)", c, decoded->params.regs.pri, decoded->params.regs.displacement);
+		return sprintf(dst, "%s (%d, a%d)", c, decoded->params.regs.displacement, decoded->params.regs.pri);
+	case MODE_AREG_INDEX_DISP8:
+		return sprintf(dst, "%s (%d, a%d, %c%d.%c)", c, decoded->params.regs.displacement, decoded->params.regs.pri, (decoded->params.regs.sec & 0x10) ? 'a': 'd', (decoded->params.regs.sec >> 1) & 0x7, (decoded->params.regs.sec & 1) ? 'l': 'w');
 	case MODE_IMMEDIATE:
 	case MODE_IMMEDIATE_WORD:
 		return sprintf(dst, (decoded->params.immed <= 128 ? "%s #%d" : "%s #$%X"), c, decoded->params.immed);
@@ -1156,7 +1174,9 @@
 	case MODE_ABSOLUTE:
 		return sprintf(dst, "%s $%X", c, decoded->params.immed);
 	case MODE_PC_DISPLACE:
-		return sprintf(dst, "%s (pc, %d)", c, decoded->params.regs.displacement);
+		return sprintf(dst, "%s (%d, pc)", c, decoded->params.regs.displacement);
+	case MODE_PC_INDEX_DISP8:
+		return sprintf(dst, "%s (%d, pc, %c%d.%c)", c, decoded->params.regs.displacement, (decoded->params.regs.sec & 0x10) ? 'a': 'd', (decoded->params.regs.sec >> 1) & 0x7, (decoded->params.regs.sec & 1) ? 'l': 'w');
 	default:
 		return 0;
 	}
--- a/68kinst.h	Fri Dec 21 21:53:05 2012 -0800
+++ b/68kinst.h	Fri Dec 21 22:24:45 2012 -0800
@@ -123,10 +123,17 @@
 	MODE_AREG_INDEX_MEM, //bunch of relatively complicated modes
 	MODE_PC_INDIRECT_ABS_IMMED, //Modes that use the program counter, an absolute address or immediate value
 //expanded values
+	MODE_AREG_INDEX_DISP8,
+#ifdef M68020
+	MODE_AREG_INDEX_DISP32,
+#endif
 	MODE_ABSOLUTE_SHORT,
 	MODE_ABSOLUTE,
 	MODE_PC_DISPLACE,
-	MODE_PC_INDEX,
+	MODE_PC_INDEX_DISP8,
+#ifdef M68020
+	MODE_PC_INDEX_DISP32,
+#endif
 	MODE_IMMEDIATE,
 	MODE_IMMEDIATE_WORD,//used to indicate an immediate operand that only uses a single extension word even for a long operation
 	MODE_UNUSED