From f4a69e99eff977e2163e95095f7d080449eceaf7 Mon Sep 17 00:00:00 2001 From: Mike Pavone Date: Fri, 28 Dec 2012 22:47:22 -0800 Subject: Fix decoding of CMPA --- 68kinst.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) (limited to '68kinst.c') diff --git a/68kinst.c b/68kinst.c index cc20172..4c1a0fa 100644 --- a/68kinst.c +++ b/68kinst.c @@ -839,27 +839,39 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address) case RESERVED: break; case CMP_XOR: - size = *istream >> 6 & 0x3; + size = (*istream >> 6) & 0x3; decoded->op = M68K_CMP; if (*istream & 0x100) { - //CMPM or EOR - istream = m68k_decode_op(istream, size, &(decoded->dst)); - if (decoded->src.addr_mode == MODE_AREG) { - //CMPM - decoded->src.addr_mode = decoded->dst.addr_mode = MODE_AREG_POSTINC; - decoded->src.params.regs.pri = decoded->dst.params.regs.pri; + //CMPM or CMPA.l or EOR + if (size == OPSIZE_INVALID) { + decoded->extra.size = OPSIZE_LONG; + decoded->dst.addr_mode = MODE_AREG; decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); + istream = m68k_decode_op(istream, size, &(decoded->src)); } else { - //EOR - decoded->op = M68K_EOR; - decoded->extra.size = size; - decoded->src.addr_mode = MODE_REG; - decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); + istream = m68k_decode_op(istream, size, &(decoded->dst)); + if (decoded->src.addr_mode == MODE_AREG) { + //CMPM + decoded->src.addr_mode = decoded->dst.addr_mode = MODE_AREG_POSTINC; + decoded->src.params.regs.pri = decoded->dst.params.regs.pri; + decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); + } else { + //EOR + decoded->op = M68K_EOR; + decoded->extra.size = size; + decoded->src.addr_mode = MODE_REG; + decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); + } } } else { - //CMP - decoded->extra.size = size; - decoded->dst.addr_mode = MODE_REG; + //CMP or CMPA.w + if (size == OPSIZE_INVALID) { + decoded->extra.size = OPSIZE_WORD; + decoded->dst.addr_mode = MODE_AREG; + } else { + decoded->extra.size = size; + decoded->dst.addr_mode = MODE_REG; + } decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); istream = m68k_decode_op(istream, size, &(decoded->src)); } -- cgit v1.2.3