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: