summaryrefslogtreecommitdiff
path: root/68kinst.c
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2012-11-15 00:52:53 -0800
committerMike Pavone <pavone@retrodev.com>2012-11-15 00:52:53 -0800
commita7c5440d973a2c7c16eb948360de123b3e5f12b7 (patch)
tree19b6dd1fed6ae667f27efcc3bfd942a0d3539f42 /68kinst.c
parent411523d046099976b0ba3245c20ce8cdf2696f7c (diff)
Add mising bit instructions to decoder. Add test assembly file containing most distinct instructions.
Diffstat (limited to '68kinst.c')
-rw-r--r--68kinst.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/68kinst.c b/68kinst.c
index e5de03d..70537d4 100644
--- a/68kinst.c
+++ b/68kinst.c
@@ -123,8 +123,31 @@ uint16_t * m68K_decode(uint16_t * istream, m68kinst * decoded)
}
decoded->src.addr_mode = MODE_REG;
decoded->src.params.regs.pri = m68K_reg_quick_field(*istream);
+ decoded->extra.size = OPSIZE_LONG;
istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->dst));
} else if ((*istream & 0xF00) == 0x800) {
+ //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;
+ }
+ opmode = (*istream >> 3) & 0x7;
+ reg = *istream & 0x7;
+ decoded->src.addr_mode = MODE_IMMEDIATE;
+ decoded->src.params.u8 = *(++istream);
+ decoded->extra.size = OPSIZE_BYTE;
+ istream = m68k_decode_op_ex(istream, opmode, reg, OPSIZE_BYTE, &(decoded->dst));
} else if ((*istream & 0xC0) == 0xC0) {
#ifdef M68020
//CMP2, CHK2, CAS, CAS2, RTM, CALLM
@@ -1090,7 +1113,7 @@ char * mnemonics[] = {
"trap",
"trapv",
"tst",
- "unlnk",
+ "unlk",
"invalid"
};