Mercurial > repos > blastem
comparison 68kinst.c @ 101:d7789186ba5e
Some fixes to add/addx sub/subx decoding
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 27 Dec 2012 22:35:26 -0800 |
parents | dd3c680c618c |
children | 8b50d2c975b2 |
comparison
equal
deleted
inserted
replaced
100:45cd7d3e7918 | 101:d7789186ba5e |
---|---|
800 istream = m68k_decode_op(istream, size, &(decoded->src)); | 800 istream = m68k_decode_op(istream, size, &(decoded->src)); |
801 } | 801 } |
802 } | 802 } |
803 break; | 803 break; |
804 case SUB_SUBX: | 804 case SUB_SUBX: |
805 size = *istream >> 6 & 0x3; | 805 size = (*istream >> 6) & 0x3; |
806 decoded->op = M68K_SUB; | 806 decoded->op = M68K_SUB; |
807 if (*istream & 0x100) { | 807 if (*istream & 0x100) { |
808 //<ea> destination, SUBA.l or SUBX | 808 //<ea> destination, SUBA.l or SUBX |
809 if (*istream & 0x6) { | 809 if (*istream & 0x30 || size == OPSIZE_INVALID) { |
810 if (size == OPSIZE_INVALID) { | 810 if (size == OPSIZE_INVALID) { |
811 //SUBA.l | 811 //SUBA.l |
812 decoded->extra.size = OPSIZE_LONG; | 812 decoded->extra.size = OPSIZE_LONG; |
813 decoded->dst.addr_mode = MODE_AREG; | 813 decoded->dst.addr_mode = MODE_AREG; |
814 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | 814 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); |
928 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); | 928 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); |
929 } | 929 } |
930 } | 930 } |
931 break; | 931 break; |
932 case ADD_ADDX: | 932 case ADD_ADDX: |
933 size = *istream >> 6 & 0x3; | 933 size = (*istream >> 6) & 0x3; |
934 decoded->op = M68K_ADD; | 934 decoded->op = M68K_ADD; |
935 if (*istream & 0x100) { | 935 if (*istream & 0x100) { |
936 //<ea> destination, ADDA.l or ADDX | 936 //<ea> destination, ADDA.l or ADDX |
937 if (*istream & 0x6) { | 937 if (*istream & 0x30 || size == OPSIZE_INVALID) { |
938 if (size == OPSIZE_INVALID) { | 938 if (size == OPSIZE_INVALID) { |
939 //ADDA.l | 939 //ADDA.l |
940 decoded->extra.size = OPSIZE_LONG; | 940 decoded->extra.size = OPSIZE_LONG; |
941 decoded->dst.addr_mode = MODE_AREG; | 941 decoded->dst.addr_mode = MODE_AREG; |
942 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | 942 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); |