diff 68kinst.c @ 111:8b50d2c975b2

Fix decoding of Scc
author Mike Pavone <pavone@retrodev.com>
date Fri, 28 Dec 2012 15:34:24 -0800
parents d7789186ba5e
children 9eaba47c429d
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