comparison 68kinst.c @ 11:d5e9bac9ebdf

Implement OR_DIV_SBCD group in decoder
author Mike Pavone <pavone@retrodev.com>
date Wed, 14 Nov 2012 23:04:55 -0800
parents 4553fc97b15e
children db60ed283d8d
comparison
equal deleted inserted replaced
10:4553fc97b15e 11:d5e9bac9ebdf
711 decoded->dst.addr_mode = MODE_REG; 711 decoded->dst.addr_mode = MODE_REG;
712 decoded->dst.params.regs.pri = m68K_reg_quick_field(*istream); 712 decoded->dst.params.regs.pri = m68K_reg_quick_field(*istream);
713 immed = *istream & 0xFF; 713 immed = *istream & 0xFF;
714 break; 714 break;
715 case OR_DIV_SBCD: 715 case OR_DIV_SBCD:
716 //TODO: Implement me 716 //for OR, if opmode bit 2 is 1, then src = Dn, dst = <ea>
717 opmode = (*istream >> 6) & 0x7;
718 size = opmode & 0x3;
719 if (size == OPSIZE_INVALID || (opmode & 0x4 && !(*istream & 0x30))) {
720 switch(opmode)
721 {
722 case 3:
723 decoded->op = M68K_DIVU;
724 decoded->extra.size = OPSIZE_WORD;
725 decoded->dst.addr_mode = MODE_REG;
726 decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
727 istream = m68k_decode_op(istream, OPSIZE_WORD, &(decoded->src));
728 break;
729 case 4:
730 decoded->op = M68K_SBCD;
731 decoded->dst.addr_mode = decoded->src.addr_mode = *istream & 0x8 ? MODE_AREG_PREDEC : MODE_REG;
732 decoded->src.params.regs.pri = *istream & 0x7;
733 decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
734 break;
735 case 5:
736 #ifdef M68020
737 #endif
738 break;
739 case 6:
740 #ifdef M68020
741 #endif
742 break;
743 case 7:
744 decoded->op = M68K_DIVS;
745 decoded->extra.size = OPSIZE_WORD;
746 decoded->dst.addr_mode = MODE_REG;
747 decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
748 istream = m68k_decode_op(istream, OPSIZE_WORD, &(decoded->src));
749 break;
750 }
751 } else {
752 decoded->op = M68K_OR;
753 decoded->extra.size = size;
754 if (opmode & 0x4) {
755 decoded->src.addr_mode = MODE_REG;
756 decoded->src.params.regs.pri = (*istream >> 9) & 0x7;
757 istream = m68k_decode_op(istream, size, &(decoded->dst));
758 } else {
759 decoded->dst.addr_mode = MODE_REG;
760 decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
761 istream = m68k_decode_op(istream, size, &(decoded->src));
762 }
763 }
717 break; 764 break;
718 case SUB_SUBX: 765 case SUB_SUBX:
719 size = *istream >> 6 & 0x3; 766 size = *istream >> 6 & 0x3;
720 decoded->op = M68K_SUB; 767 decoded->op = M68K_SUB;
721 if (*istream & 0x100) { 768 if (*istream & 0x100) {