# HG changeset patch # User Mike Pavone # Date 1357382815 28800 # Node ID 5559616e6bd85980c2103bb01459376800bc6bef # Parent eba78ad49a11b66ff8f605307d35063271145af6 Fix decoding of movep diff -r eba78ad49a11 -r 5559616e6bd8 68kinst.c --- a/68kinst.c Sat Jan 05 02:18:31 2013 -0800 +++ b/68kinst.c Sat Jan 05 02:46:55 2013 -0800 @@ -122,7 +122,26 @@ switch(optype) { case BIT_MOVEP_IMMED: - if (*istream & 0x100) { + if ((*istream & 0x138) == 0x108) { + //MOVEP + decoded->op = M68K_MOVEP; + decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; + if (*istream & 0x80) { + //memory dest + decoded->src.addr_mode = MODE_REG; + decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); + decoded->dst.addr_mode = MODE_AREG_DISPLACE; + decoded->dst.params.regs.pri = *istream & 0x7; + decoded->dst.params.regs.displacement = *(++istream); + } else { + //memory source + decoded->dst.addr_mode = MODE_REG; + decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); + decoded->src.addr_mode = MODE_AREG_DISPLACE; + decoded->src.params.regs.pri = *istream & 0x7; + decoded->src.params.regs.displacement = *(++istream); + } + } else if (*istream & 0x100) { //BTST, BCHG, BCLR, BSET switch ((*istream >> 6) & 0x3) { @@ -371,23 +390,7 @@ istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); break; case 7: - //MOVEP - decoded->op = M68K_MOVEP; - decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; - if (*istream & 0x80) { - //memory dest - decoded->src.addr_mode = MODE_REG; - decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); - decoded->dst.addr_mode = MODE_AREG_DISPLACE; - decoded->dst.params.regs.pri = *istream & 0x7; - } else { - //memory source - decoded->dst.addr_mode = MODE_REG; - decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); - decoded->src.addr_mode = MODE_AREG_DISPLACE; - decoded->src.params.regs.pri = *istream & 0x7; - } - immed = *(++istream); + break; }