Mercurial > repos > blastem
comparison 68kinst.c @ 1277:78416556ae02
Properly treat invalid addressing modes for PEA/LEA as invalid instructinos
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 13 Mar 2017 00:23:58 -0700 |
parents | 2a6049dddab0 |
children | af26a1ce92f7 |
comparison
equal
deleted
inserted
replaced
1276:2d8b9d40f5ea | 1277:78416556ae02 |
---|---|
654 decoded->op = M68K_LEA; | 654 decoded->op = M68K_LEA; |
655 decoded->extra.size = OPSIZE_LONG; | 655 decoded->extra.size = OPSIZE_LONG; |
656 decoded->dst.addr_mode = MODE_AREG; | 656 decoded->dst.addr_mode = MODE_AREG; |
657 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | 657 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); |
658 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); | 658 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); |
659 if (!istream || decoded->src.addr_mode == MODE_REG) { | 659 if ( |
660 !istream || decoded->src.addr_mode == MODE_REG || decoded->src.addr_mode == MODE_AREG | |
661 || decoded->src.addr_mode == MODE_AREG_POSTINC || decoded->src.addr_mode == MODE_AREG_PREDEC | |
662 || decoded->src.addr_mode == MODE_IMMEDIATE | |
663 ) { | |
660 decoded->op = M68K_INVALID; | 664 decoded->op = M68K_INVALID; |
661 break; | 665 break; |
662 } | 666 } |
663 } else { | 667 } else { |
664 if (*istream & 0x100) { | 668 if (*istream & 0x100) { |
842 } | 846 } |
843 } else if((*istream & 0x1C0) == 0x40) { | 847 } else if((*istream & 0x1C0) == 0x40) { |
844 decoded->op = M68K_PEA; | 848 decoded->op = M68K_PEA; |
845 decoded->extra.size = OPSIZE_LONG; | 849 decoded->extra.size = OPSIZE_LONG; |
846 istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->src)); | 850 istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->src)); |
847 if (!istream) { | 851 if ( |
852 !istream || decoded->src.addr_mode == MODE_REG || decoded->src.addr_mode == MODE_AREG | |
853 || decoded->src.addr_mode == MODE_AREG_POSTINC || decoded->src.addr_mode == MODE_AREG_PREDEC | |
854 || decoded->src.addr_mode == MODE_IMMEDIATE | |
855 ) { | |
848 decoded->op = M68K_INVALID; | 856 decoded->op = M68K_INVALID; |
849 break; | 857 break; |
850 } | 858 } |
851 } | 859 } |
852 } | 860 } |