# HG changeset patch # User Michael Pavone # Date 1486630193 28800 # Node ID 054472ea077a7088efa48a33760964ef3b9b8778 # Parent f2f17267b0e1523214e7be2c2dfcceaf78b17908 Properly treat bad addressing modes in OR/AND as illegal instructions diff -r f2f17267b0e1 -r 054472ea077a 68kinst.c --- a/68kinst.c Sat Feb 04 00:44:29 2017 -0800 +++ b/68kinst.c Thu Feb 09 00:49:53 2017 -0800 @@ -1151,7 +1151,7 @@ decoded->src.addr_mode = MODE_REG; decoded->src.params.regs.pri = (*istream >> 9) & 0x7; istream = m68k_decode_op(istream, size, &(decoded->dst)); - if (!istream) { + if (!istream || !m68k_valid_immed_limited_dst(&(decoded->dst))) { decoded->op = M68K_INVALID; break; } @@ -1159,7 +1159,7 @@ decoded->dst.addr_mode = MODE_REG; decoded->dst.params.regs.pri = (*istream >> 9) & 0x7; istream = m68k_decode_op(istream, size, &(decoded->src)); - if (!istream) { + if (!istream || decoded->src.addr_mode == MODE_AREG) { decoded->op = M68K_INVALID; break; } @@ -1323,7 +1323,7 @@ decoded->src.addr_mode = MODE_REG; decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->dst)); - if (!istream) { + if (!istream || !m68k_valid_immed_limited_dst(&(decoded->dst))) { decoded->op = M68K_INVALID; break; } @@ -1345,7 +1345,7 @@ decoded->dst.addr_mode = MODE_REG; decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); - if (!istream) { + if (!istream || decoded->src.addr_mode == MODE_AREG) { decoded->op = M68K_INVALID; break; }