changeset 111:8b50d2c975b2

Fix decoding of Scc
author Mike Pavone <pavone@retrodev.com>
date Fri, 28 Dec 2012 15:34:24 -0800
parents a575808dd90b
children e3594572fb98
files 68kinst.c dis.c
diffstat 2 files changed, 7 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Fri Dec 28 15:16:36 2012 -0800
+++ b/68kinst.c	Fri Dec 28 15:34:24 2012 -0800
@@ -683,26 +683,22 @@
 		if (size == 0x3) {
 			//DBcc, TRAPcc or Scc
 			m68k_decode_cond(*istream, decoded);
-			switch ((*istream >> 3) & 0x7)
-			{
-			case 1: //DBcc
+			if (((*istream >> 3) & 0x7) == 1) {
 				decoded->op = M68K_DBCC;
 				decoded->src.addr_mode = MODE_IMMEDIATE;
 				decoded->dst.addr_mode = MODE_REG;
 				decoded->dst.params.regs.pri = *istream & 0x7;
 				decoded->src.params.immed = sign_extend16(*(++istream));
-				break;
-			case 7: //TRAPcc
+			} else if(((*istream >> 3) & 0x7) == 1 && (*istream & 0x7) > 1 && (*istream & 0x7) < 5) {
 #ifdef M68020
 				decoded->op = M68K_TRAPCC;
 				decoded->src.addr_mode = MODE_IMMEDIATE;
 				//TODO: Figure out what to do with OPMODE and optional extention words
 #endif
-				break;
-			default: //Scc
+			} else {
 				decoded->op = M68K_SCC;
+				decoded->extra.cond = (*istream >> 8) & 0xF;
 				istream = m68k_decode_op(istream, OPSIZE_BYTE, &(decoded->dst));
-				break;
 			}
 		} else {
 			//ADDQ, SUBQ
--- a/dis.c	Fri Dec 28 15:16:36 2012 -0800
+++ b/dis.c	Fri Dec 28 15:34:24 2012 -0800
@@ -26,7 +26,7 @@
 	if (is_visited(address)) {
 		return next;
 	}
-	printf("deferring %X\n", address);
+	//printf("deferring %X\n", address);
 	deferred * d = malloc(sizeof(deferred));
 	d->address = address;
 	d->next = next;
@@ -84,8 +84,8 @@
 			next = m68k_decode(encoded, &instbuf, address);
 			address += (next-encoded)*2;
 			encoded = next;
-			m68k_disasm(&instbuf, disbuf);
-			printf("%X: %s\n", instbuf.address, disbuf);
+			//m68k_disasm(&instbuf, disbuf);
+			//printf("%X: %s\n", instbuf.address, disbuf);
 			if (instbuf.op == M68K_ILLEGAL || instbuf.op == M68K_RTS || instbuf.op == M68K_RTE) {
 				break;
 			} else if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) {