summaryrefslogtreecommitdiff
path: root/68kinst.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2017-03-13 00:23:58 -0700
committerMichael Pavone <pavone@retrodev.com>2017-03-13 00:23:58 -0700
commit29007aa22b7e69d4c69078e5166fffd5c7caac92 (patch)
treeeb690a4c04e37949e0f610dd6bd6dcced8247ade /68kinst.c
parent63a9e31decd663823369b18a74042d7df51cfa23 (diff)
Properly treat invalid addressing modes for PEA/LEA as invalid instructinos
Diffstat (limited to '68kinst.c')
-rw-r--r--68kinst.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/68kinst.c b/68kinst.c
index a753765..810e8ad 100644
--- a/68kinst.c
+++ b/68kinst.c
@@ -656,7 +656,11 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
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 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
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;
}