Mercurial > repos > blastem
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) { |