summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--68kinst.c25
-rw-r--r--test.s6888
2 files changed, 112 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"
};
diff --git a/test.s68 b/test.s68
new file mode 100644
index 0000000..151a639
--- /dev/null
+++ b/test.s68
@@ -0,0 +1,88 @@
+ abcd d0, d1
+ abcd -(a2), -(a3)
+ add.b #42, d1
+ add.w d3, d4
+ add.l d5, (a0)+
+ addq.w #5, d0
+ addx d6, d7
+ addx -(a4), -(a5)
+ and.w d5, d7
+ andi.l #5, (a0)+
+ andi #8, CCR
+ andi #9, CCR
+foo:
+ asl d0, d3
+ asr #3, d7
+ bne foo
+ bchg #5, d0
+ bclr #7, d0
+ bset #1, d0
+ bsr bar
+ btst #3, d0
+ chk.w #53, d7
+ clr d5
+ cmp d0, d1
+bar:
+ dbra d0, bar
+ divs.w d5, d7
+ divu.w d3, d4
+ eor.w d0, d6
+ eori.l #5, d2
+ eori #5, ccr
+ eori #2700, sr
+ exg d5, d6
+ ext d2
+ illegal
+ jmp (a0)
+ jsr (a5)
+ lea (a0, 8), a3
+ link.w a6, #32
+ lsl d0, d3
+ lsr #3, d7
+ move.b (a0)+, (32, a5)
+ moveq #5, d0
+ move #89, ccr
+ move sr, d0
+ move #2700, sr
+ move a5, usp
+ movem.l d0-d3/a4/a6, -(a7)
+ movep.w d4, (40, a3)
+ muls.w d6, d7
+ mulu.w d2, d4
+ nbcd -(a2)
+ neg.l d7
+ negx.b d5
+ nop
+ not.b d3
+ or.w d5, d7
+ ori.b #7, d5
+ ori #5, ccr
+ ori #2700, sr
+ pea (24, a3)
+ reset
+ rol.l #7, d0
+ rol.w d5, d0
+ ror.w d1, d3
+ roxl.l #7, d0
+ roxl.w d5, d0
+ roxr.w d1, d3
+ rte
+ rtr
+ rts
+ sbcd d0, d1
+ sbcd -(a2), -(a3)
+ slt d5
+ stop #3
+ sub.b #42, d1
+ sub.w d3, d4
+ sub.l d5, (a0)+
+ subq.w #5, d0
+ subx d6, d7
+ subx -(a4), -(a5)
+ swap d6
+ tas (a3)
+ trap #7
+ trapv
+ tst.w (a4)+
+ unlk a6
+