changeset 11:d5e9bac9ebdf

Implement OR_DIV_SBCD group in decoder
author Mike Pavone <pavone@retrodev.com>
date Wed, 14 Nov 2012 23:04:55 -0800
parents 4553fc97b15e
children db60ed283d8d
files 68kinst.c
diffstat 1 files changed, 48 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Wed Nov 14 09:24:40 2012 -0800
+++ b/68kinst.c	Wed Nov 14 23:04:55 2012 -0800
@@ -713,7 +713,54 @@
 		immed = *istream & 0xFF;
 		break;
 	case OR_DIV_SBCD:
-		//TODO: Implement me
+		//for OR, if opmode bit 2 is 1, then src = Dn, dst = <ea>
+		opmode = (*istream >> 6) & 0x7;
+		size = opmode & 0x3;
+		if (size == OPSIZE_INVALID || (opmode & 0x4 && !(*istream & 0x30))) {
+			switch(opmode)
+			{
+			case 3:
+				decoded->op = M68K_DIVU;
+				decoded->extra.size = OPSIZE_WORD;
+				decoded->dst.addr_mode = MODE_REG;
+				decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
+				istream = m68k_decode_op(istream, OPSIZE_WORD, &(decoded->src));
+				break;
+			case 4:
+				decoded->op = M68K_SBCD;
+				decoded->dst.addr_mode = decoded->src.addr_mode = *istream & 0x8 ? MODE_AREG_PREDEC : MODE_REG;
+				decoded->src.params.regs.pri = *istream & 0x7;
+				decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
+				break;
+			case 5:
+	#ifdef M68020
+	#endif
+				break;
+			case 6:
+	#ifdef M68020
+	#endif
+				break;
+			case 7:
+				decoded->op = M68K_DIVS;
+				decoded->extra.size = OPSIZE_WORD;
+				decoded->dst.addr_mode = MODE_REG;
+				decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
+				istream = m68k_decode_op(istream, OPSIZE_WORD, &(decoded->src));
+				break;		
+			}
+		} else {
+			decoded->op = M68K_OR;
+			decoded->extra.size = size;
+			if (opmode & 0x4) {
+				decoded->src.addr_mode = MODE_REG;
+				decoded->src.params.regs.pri = (*istream >> 9) & 0x7;
+				istream = m68k_decode_op(istream, size, &(decoded->dst));
+			} else {
+				decoded->dst.addr_mode = MODE_REG;
+				decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
+				istream = m68k_decode_op(istream, size, &(decoded->src));
+			}
+		}
 		break;
 	case SUB_SUBX:
 		size = *istream >> 6 & 0x3;