changeset 8:23b83d94c633

Finish bit/movep/immediate group except for 68020 instructions
author Mike Pavone <pavone@retrodev.com>
date Fri, 09 Nov 2012 22:01:26 -0800
parents a74c2969e8f3
children 0a0cd3705c19
files 68kinst.c 68kinst.h dis.c
diffstat 3 files changed, 130 insertions(+), 115 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Tue Nov 06 02:07:45 2012 -0800
+++ b/68kinst.c	Fri Nov 09 22:01:26 2012 -0800
@@ -124,6 +124,11 @@
 			decoded->src.addr_mode = MODE_REG;
 			decoded->src.params.regs.pri = m68K_reg_quick_field(*istream);
 			istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->dst));
+		} else if ((*istream & 0xF00) == 0x800) {
+		} else if ((*istream & 0xC0) == 0xC0) {
+#ifdef M68020
+			//CMP2, CHK2, CAS, CAS2, RTM, CALLM
+#endif
 		} else {
 			switch ((*istream >> 9) & 0x7)
 			{
@@ -139,36 +144,30 @@
 					decoded->src.addr_mode = MODE_IMMEDIATE;
 					decoded->src.params.u16 = *(++istream);
 				} else {
-					//ORI, CMP2.b, CHK2.b
-					if ((*istream & 0xC0) != 0xC0) {
-						decoded->op = M68K_OR;
-						decoded->src.addr_mode = MODE_IMMEDIATE;
-						decoded->extra.size = size = (*istream >> 6) & 3;
-						reg = *istream & 0x7;
-						opmode = (*istream >> 3) & 0x7;
-						switch (size)
-						{
-						case OPSIZE_BYTE:
-							decoded->src.params.u8 = *(++istream);
-							break;
-						case OPSIZE_WORD:
-							decoded->src.params.16 = *(++istream);
-							break;
-						case OPSIZE_LONG:
-							immed = *(++istream);
-							decoded->src.params.u32 = immed << 16 | *(++istream);
-							break;
-						}
-						istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
-					} else {
-	#ifdef M68020
-						//TODO: Implement me for 68020 support
-	#endif
+					decoded->op = M68K_OR;
+					decoded->variant = VAR_IMMEDIATE;
+					decoded->src.addr_mode = MODE_IMMEDIATE;
+					decoded->extra.size = size = (*istream >> 6) & 3;
+					reg = *istream & 0x7;
+					opmode = (*istream >> 3) & 0x7;
+					switch (size)
+					{
+					case OPSIZE_BYTE:
+						decoded->src.params.u8 = *(++istream);
+						break;
+					case OPSIZE_WORD:
+						decoded->src.params.u16 = *(++istream);
+						break;
+					case OPSIZE_LONG:
+						immed = *(++istream);
+						decoded->src.params.u32 = immed << 16 | *(++istream);
+						break;
 					}
+					istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
 				}
 				break;
 			case 1:
-				//ANDI, ANDI to CCR, ANDI to SR, CMP2.w CHK2.w
+				//ANDI, ANDI to CCR, ANDI to SR
 				if ((*istream & 0xFF) == 0x3C) {
 					decoded->op = M68K_ANDI_CCR;
 					decoded->extra.size = OPSIZE_BYTE;
@@ -180,38 +179,8 @@
 					decoded->src.addr_mode = MODE_IMMEDIATE;
 					decoded->src.params.u16 = *(++istream);
 				} else {
-					//ANDI, CMP2.w, CHK2.w
-					if ((*istream & 0xC0) != 0xC0) {
-						decoded->op = M68K_AND;
-						decoded->src.addr_mode = MODE_IMMEDIATE;
-						decoded->extra.size = size = (*istream >> 6) & 3;
-						reg = *istream & 0x7;
-						opmode = (*istream >> 3) & 0x7;
-						switch (size)
-						{
-						case OPSIZE_BYTE:
-							decoded->src.params.u8 = *(++istream);
-							break;
-						case OPSIZE_WORD:
-							decoded->src.params.16 = *(++istream);
-							break;
-						case OPSIZE_LONG:
-							immed = *(++istream);
-							decoded->src.params.u32 = immed << 16 | *(++istream);
-							break;
-						}
-						istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
-					} else {
-	#ifdef M68020
-						//TODO: Implement me for 68020 support
-	#endif
-					}
-				}
-				break;
-			case 2:
-				//SUBI, CMP2.l, CHK2.l
-				if ((*istream & 0xC0) != 0xC0) {
-					decoded->op = M68K_SUB;
+					decoded->op = M68K_AND;
+					decoded->variant = VAR_IMMEDIATE;
 					decoded->src.addr_mode = MODE_IMMEDIATE;
 					decoded->extra.size = size = (*istream >> 6) & 3;
 					reg = *istream & 0x7;
@@ -222,7 +191,7 @@
 						decoded->src.params.u8 = *(++istream);
 						break;
 					case OPSIZE_WORD:
-						decoded->src.params.16 = *(++istream);
+						decoded->src.params.u16 = *(++istream);
 						break;
 					case OPSIZE_LONG:
 						immed = *(++istream);
@@ -230,39 +199,51 @@
 						break;
 					}
 					istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
-				} else {
-	#ifdef M68020
-					//TODO: Implement me for 68020 support
-	#endif
 				}
 				break;
+			case 2:
+				decoded->op = M68K_SUB;
+				decoded->variant = VAR_IMMEDIATE;
+				decoded->src.addr_mode = MODE_IMMEDIATE;
+				decoded->extra.size = size = (*istream >> 6) & 3;
+				reg = *istream & 0x7;
+				opmode = (*istream >> 3) & 0x7;
+				switch (size)
+				{
+				case OPSIZE_BYTE:
+					decoded->src.params.u8 = *(++istream);
+					break;
+				case OPSIZE_WORD:
+					decoded->src.params.u16 = *(++istream);
+					break;
+				case OPSIZE_LONG:
+					immed = *(++istream);
+					decoded->src.params.u32 = immed << 16 | *(++istream);
+					break;
+				}
+				istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
+				break;
 			case 3:
-				//RTM, CALLM, ADDI
-				if ((*istream & 0xC0) != 0xC0) {
-					decoded->op = M68K_ADD;
-					decoded->src.addr_mode = MODE_IMMEDIATE;
-					decoded->extra.size = size = (*istream >> 6) & 3;
-					reg = *istream & 0x7;
-					opmode = (*istream >> 3) & 0x7;
-					switch (size)
-					{
-					case OPSIZE_BYTE:
-						decoded->src.params.u8 = *(++istream);
-						break;
-					case OPSIZE_WORD:
-						decoded->src.params.16 = *(++istream);
-						break;
-					case OPSIZE_LONG:
-						immed = *(++istream);
-						decoded->src.params.u32 = immed << 16 | *(++istream);
-						break;
-					}
-					istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
-				} else {
-	#ifdef M68020
-					//TODO: Implement me for 68020 support
-	#endif
+				decoded->op = M68K_ADD;
+				decoded->variant = VAR_IMMEDIATE;
+				decoded->src.addr_mode = MODE_IMMEDIATE;
+				decoded->extra.size = size = (*istream >> 6) & 3;
+				reg = *istream & 0x7;
+				opmode = (*istream >> 3) & 0x7;
+				switch (size)
+				{
+				case OPSIZE_BYTE:
+					decoded->src.params.u8 = *(++istream);
+					break;
+				case OPSIZE_WORD:
+					decoded->src.params.u16 = *(++istream);
+					break;
+				case OPSIZE_LONG:
+					immed = *(++istream);
+					decoded->src.params.u32 = immed << 16 | *(++istream);
+					break;
 				}
+				istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
 				break;
 			case 4:
 				//BTST, BCHG, BCLR, BSET
@@ -298,34 +279,69 @@
 					decoded->src.addr_mode = MODE_IMMEDIATE;
 					decoded->src.params.u16 = *(++istream);
 				} else {
-					//EORI, CMP2.w, CHK2.w
-					if ((*istream & 0xC0) != 0xC0) {
-						decoded->op = M68K_EOR;
-						decoded->src.addr_mode = MODE_IMMEDIATE;
-						decoded->extra.size = size = (*istream >> 6) & 3;
-						reg = *istream & 0x7;
-						opmode = (*istream >> 3) & 0x7;
-						switch (size)
-						{
-						case OPSIZE_BYTE:
-							decoded->src.params.u8 = *(++istream);
-							break;
-						case OPSIZE_WORD:
-							decoded->src.params.16 = *(++istream);
-							break;
-						case OPSIZE_LONG:
-							immed = *(++istream);
-							decoded->src.params.u32 = immed << 16 | *(++istream);
-							break;
-						}
-						istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
+					decoded->op = M68K_EOR;
+					decoded->variant = VAR_IMMEDIATE;
+					decoded->src.addr_mode = MODE_IMMEDIATE;
+					decoded->extra.size = size = (*istream >> 6) & 3;
+					reg = *istream & 0x7;
+					opmode = (*istream >> 3) & 0x7;
+					switch (size)
+					{
+					case OPSIZE_BYTE:
+						decoded->src.params.u8 = *(++istream);
+						break;
+					case OPSIZE_WORD:
+						decoded->src.params.u16 = *(++istream);
+						break;
+					case OPSIZE_LONG:
+						immed = *(++istream);
+						decoded->src.params.u32 = immed << 16 | *(++istream);
+						break;
 					}
+					istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
 				}
 				break;
 			case 6:
-				
+				decoded->op = M68K_CMP;
+				decoded->variant = VAR_IMMEDIATE;
+				decoded->extra.size = (*istream >> 6) & 0x3;
+				decoded->src.addr_mode = MODE_IMMEDIATE;
+				reg = *istream & 0x7;
+				opmode = (*istream >> 3) & 0x7;
+				switch (decoded->extra.size)
+				{
+				case OPSIZE_BYTE:
+					decoded->src.params.u8 = *(++istream);
+					break;
+				case OPSIZE_WORD:
+					decoded->src.params.u16 = *(++istream);
+					break;
+				case OPSIZE_LONG:
+					immed = *(++istream);
+					decoded->src.params.u32 = (immed << 16) | *(++istream);
+					break;
+				}
+				istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
 				break;
 			case 7:
+				//MOVEP
+				deocded->op = M68K_MOVEP;
+				decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD;
+				if (*istream & 0x80) {
+					//memory dest
+					decoded->src.addr_mode = MODE_REG;
+					decoded->src.params.regs.pri = m68K_reg_quick_field(*istream);
+					decoded->dst.addr_mode = MODE_AREG_DISPLACE;
+					decoded->dst.params.regs.pri = *istream & 0x7;
+				} else {
+					//memory source
+					decoded->dst.addr_mode = MODE_REG;
+					decoded->dst.params.regs.pri = m68K_reg_quick_field(*istream);
+					decoded->sr.addr_mode = MODE_AREG_DISPLACE;
+					decoded->sr.params.regs.pri = *istream & 0x7;
+				}
+				immed = *(++istream);
+				
 				break;
 			}
 		}
@@ -860,7 +876,7 @@
 		size = decoded->extra.size;
 		ret = sprintf(dst, "%s%s.%c", 
 				mnemonics[decoded->op], 
-				decoded->variant == VAR_QUICK ? "q" : "", 
+				decoded->variant == VAR_QUICK ? "q" : (decoded->variant == VAR_IMMEDIATE ? "i" : ""), 
 				decoded->extra.size == OPSIZE_BYTE ? 'b' : (size == OPSIZE_WORD ? 'w' : 'l'));
 	}
 	op1len = m68K_disasm_op(&(decoded->src), size, dst + ret, 0);
--- a/68kinst.h	Tue Nov 06 02:07:45 2012 -0800
+++ b/68kinst.h	Fri Nov 09 22:01:26 2012 -0800
@@ -95,6 +95,7 @@
 typedef enum {
 	VAR_NORMAL,
 	VAR_QUICK,
+	VAR_IMMEDIATE,
 	VAR_BYTE,
 	VAR_WORD,
 	VAR_LONG
--- a/dis.c	Tue Nov 06 02:07:45 2012 -0800
+++ b/dis.c	Fri Nov 09 22:01:26 2012 -0800
@@ -18,13 +18,11 @@
 	fclose(f);
 	for(cur = filebuf; cur - filebuf < (filesize/2); ++cur)
 	{
-		//printf("%x:", *cur);
 		*cur = (*cur >> 8) | (*cur << 8);
-		//printf("%x\n", *cur);
 	}
-	for(cur = filebuf; (cur - filebuf) < (filesize/2); ++cur)
+	for(cur = filebuf; (cur - filebuf) < (filesize/2); )
 	{
-		printf("cur: %p: %x\n", cur, *cur);
+		//printf("cur: %p: %x\n", cur, *cur);
 		cur = m68K_decode(cur, &instbuf);
 		m68k_disasm(&instbuf, disbuf);
 		puts(disbuf);