# HG changeset patch # User Mike Pavone # Date 1352963095 28800 # Node ID d5e9bac9ebdfa7eded2fc80714c650101ffbff26 # Parent 4553fc97b15e74a7ae33ec8d464727313266adb2 Implement OR_DIV_SBCD group in decoder diff -r 4553fc97b15e -r d5e9bac9ebdf 68kinst.c --- a/68kinst.c Wed Nov 14 09:24:40 2012 -0800 +++ b/68kinst.c Wed Nov 14 23:04:55 2012 -0800 @@ -713,7 +713,54 @@ immed = *istream & 0xFF; break; case OR_DIV_SBCD: - //TODO: Implement me + //for OR, if opmode bit 2 is 1, then src = Dn, dst = + opmode = (*istream >> 6) & 0x7; + size = opmode & 0x3; + if (size == OPSIZE_INVALID || (opmode & 0x4 && !(*istream & 0x30))) { + switch(opmode) + { + case 3: + decoded->op = M68K_DIVU; + decoded->extra.size = OPSIZE_WORD; + decoded->dst.addr_mode = MODE_REG; + decoded->dst.params.regs.pri = (*istream >> 9) & 0x7; + istream = m68k_decode_op(istream, OPSIZE_WORD, &(decoded->src)); + break; + case 4: + decoded->op = M68K_SBCD; + decoded->dst.addr_mode = decoded->src.addr_mode = *istream & 0x8 ? MODE_AREG_PREDEC : MODE_REG; + decoded->src.params.regs.pri = *istream & 0x7; + decoded->dst.params.regs.pri = (*istream >> 9) & 0x7; + break; + case 5: + #ifdef M68020 + #endif + break; + case 6: + #ifdef M68020 + #endif + break; + case 7: + decoded->op = M68K_DIVS; + decoded->extra.size = OPSIZE_WORD; + decoded->dst.addr_mode = MODE_REG; + decoded->dst.params.regs.pri = (*istream >> 9) & 0x7; + istream = m68k_decode_op(istream, OPSIZE_WORD, &(decoded->src)); + break; + } + } else { + decoded->op = M68K_OR; + decoded->extra.size = size; + if (opmode & 0x4) { + decoded->src.addr_mode = MODE_REG; + decoded->src.params.regs.pri = (*istream >> 9) & 0x7; + istream = m68k_decode_op(istream, size, &(decoded->dst)); + } else { + decoded->dst.addr_mode = MODE_REG; + decoded->dst.params.regs.pri = (*istream >> 9) & 0x7; + istream = m68k_decode_op(istream, size, &(decoded->src)); + } + } break; case SUB_SUBX: size = *istream >> 6 & 0x3;