changeset 5:85699517043f

More bit and immediate instructions
author Mike Pavone <pavone@retrodev.com>
date Tue, 06 Nov 2012 02:04:42 -0800
parents 6f6a2d7cc889
children a74c2969e8f3
files 68kinst.c
diffstat 1 files changed, 146 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Sun Nov 04 23:43:03 2012 -0800
+++ b/68kinst.c	Tue Nov 06 02:04:42 2012 -0800
@@ -168,16 +168,162 @@
 				}
 				break;
 			case 1:
+				//ANDI, ANDI to CCR, ANDI to SR, CMP2.w CHK2.w
+				if ((*istream & 0xFF) == 0x3C) {
+					decoded->op = M68K_ANDI_CCR;
+					decoded->extra.size = OPSIZE_BYTE;
+					decoded->src.addr_mode = MODE_IMMEDIATE;
+					decoded->src.params.u8 = *(++istream);
+				} else if((*istream & 0xFF) == 0x7C) {
+					decoded->op = M68K_ANDI_SR;
+					decoded->extra.size = OPSIZE_WORD;
+					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->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 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
+				}
 				break;
 			case 4:
+				//BTST, BCHG, BCLR, BSET
+				switch ((*istream >> 6) & 0x3)
+				{
+				case 0:
+					decoded->op = M68K_BTST;
+					break;
+				case 1:
+					decoded->op = M68K_BCHG;
+					break;
+				case 2:
+					decoded->op = M68K_BCLR;
+					break;
+				case 3:
+					decoded->op = M68K_BSET;
+					break;
+				}
+				decoded->src.addr_mode = MODE_IMMEDIATE;
+				decoded->src.params.u8 = *(++istream);
+				istream = m68k_decode_op(istream, OPSIZE_BYTE, &(decoded->dst));
 				break;
 			case 5:
+				//EORI, EORI to CCR, EORI to SR
+				if ((*istream & 0xFF) == 0x3C) {
+					decoded->op = M68K_EORI_CCR;
+					decoded->extra.size = OPSIZE_BYTE;
+					decoded->src.addr_mode = MODE_IMMEDIATE;
+					decoded->src.params.u8 = *(++istream);
+				} else if((*istream & 0xFF) == 0x7C) {
+					decoded->op = M68K_EORI_SR;
+					decoded->extra.size = OPSIZE_WORD;
+					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));
+					}
+				}
 				break;
 			case 6:
+				
 				break;
 			case 7:
 				break;