changeset 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 2d8b9d40f5ea
children 34d3cb05014d
files 68kinst.c
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/68kinst.c	Thu Mar 09 23:50:46 2017 -0800
+++ b/68kinst.c	Mon Mar 13 00:23:58 2017 -0700
@@ -656,7 +656,11 @@
 			decoded->dst.addr_mode = MODE_AREG;
 			decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
 			istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src));
-			if (!istream || decoded->src.addr_mode == MODE_REG) {
+			if (
+				!istream || decoded->src.addr_mode == MODE_REG || decoded->src.addr_mode == MODE_AREG 
+				|| decoded->src.addr_mode == MODE_AREG_POSTINC || decoded->src.addr_mode == MODE_AREG_PREDEC
+				|| decoded->src.addr_mode == MODE_IMMEDIATE
+			) {
 				decoded->op = M68K_INVALID;
 				break;
 			}
@@ -844,7 +848,11 @@
 								decoded->op = M68K_PEA;
 								decoded->extra.size = OPSIZE_LONG;
 								istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->src));
-								if (!istream) {
+								if (
+									!istream || decoded->src.addr_mode == MODE_REG || decoded->src.addr_mode == MODE_AREG 
+									|| decoded->src.addr_mode == MODE_AREG_POSTINC || decoded->src.addr_mode == MODE_AREG_PREDEC
+									|| decoded->src.addr_mode == MODE_IMMEDIATE
+								) {
 									decoded->op = M68K_INVALID;
 									break;
 								}