# HG changeset patch # User Mike Pavone # Date 1356763642 28800 # Node ID 3648abc45aec42c272e8636ac9c0ed77af4d2b87 # Parent ee19ddadb398eafd19ff4302de3917bbee88a7ea Fix decoding of CMPA diff -r ee19ddadb398 -r 3648abc45aec 68kinst.c --- a/68kinst.c Fri Dec 28 22:47:10 2012 -0800 +++ b/68kinst.c Fri Dec 28 22:47:22 2012 -0800 @@ -839,27 +839,39 @@ 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)); }