Mercurial > repos > blastem
comparison 68kinst.c @ 120:3648abc45aec
Fix decoding of CMPA
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 28 Dec 2012 22:47:22 -0800 |
parents | 9eaba47c429d |
children | ab50421b1b7a |
comparison
equal
deleted
inserted
replaced
119:ee19ddadb398 | 120:3648abc45aec |
---|---|
837 } | 837 } |
838 break; | 838 break; |
839 case RESERVED: | 839 case RESERVED: |
840 break; | 840 break; |
841 case CMP_XOR: | 841 case CMP_XOR: |
842 size = *istream >> 6 & 0x3; | 842 size = (*istream >> 6) & 0x3; |
843 decoded->op = M68K_CMP; | 843 decoded->op = M68K_CMP; |
844 if (*istream & 0x100) { | 844 if (*istream & 0x100) { |
845 //CMPM or EOR | 845 //CMPM or CMPA.l or EOR |
846 istream = m68k_decode_op(istream, size, &(decoded->dst)); | 846 if (size == OPSIZE_INVALID) { |
847 if (decoded->src.addr_mode == MODE_AREG) { | 847 decoded->extra.size = OPSIZE_LONG; |
848 //CMPM | 848 decoded->dst.addr_mode = MODE_AREG; |
849 decoded->src.addr_mode = decoded->dst.addr_mode = MODE_AREG_POSTINC; | |
850 decoded->src.params.regs.pri = decoded->dst.params.regs.pri; | |
851 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | 849 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); |
850 istream = m68k_decode_op(istream, size, &(decoded->src)); | |
852 } else { | 851 } else { |
853 //EOR | 852 istream = m68k_decode_op(istream, size, &(decoded->dst)); |
854 decoded->op = M68K_EOR; | 853 if (decoded->src.addr_mode == MODE_AREG) { |
854 //CMPM | |
855 decoded->src.addr_mode = decoded->dst.addr_mode = MODE_AREG_POSTINC; | |
856 decoded->src.params.regs.pri = decoded->dst.params.regs.pri; | |
857 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | |
858 } else { | |
859 //EOR | |
860 decoded->op = M68K_EOR; | |
861 decoded->extra.size = size; | |
862 decoded->src.addr_mode = MODE_REG; | |
863 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); | |
864 } | |
865 } | |
866 } else { | |
867 //CMP or CMPA.w | |
868 if (size == OPSIZE_INVALID) { | |
869 decoded->extra.size = OPSIZE_WORD; | |
870 decoded->dst.addr_mode = MODE_AREG; | |
871 } else { | |
855 decoded->extra.size = size; | 872 decoded->extra.size = size; |
856 decoded->src.addr_mode = MODE_REG; | 873 decoded->dst.addr_mode = MODE_REG; |
857 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); | 874 } |
858 } | |
859 } else { | |
860 //CMP | |
861 decoded->extra.size = size; | |
862 decoded->dst.addr_mode = MODE_REG; | |
863 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | 875 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); |
864 istream = m68k_decode_op(istream, size, &(decoded->src)); | 876 istream = m68k_decode_op(istream, size, &(decoded->src)); |
865 } | 877 } |
866 break; | 878 break; |
867 case AND_MUL_ABCD_EXG: | 879 case AND_MUL_ABCD_EXG: |