summaryrefslogtreecommitdiff
path: root/68kinst.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2017-02-09 00:49:53 -0800
committerMichael Pavone <pavone@retrodev.com>2017-02-09 00:49:53 -0800
commitfd579e202e0c9e8e3dc12019ebbc976519c95a34 (patch)
tree5614d46cb296fb7c12fba27f3fee9382daeba7e5 /68kinst.c
parent139233f2a475db39b20694d603b80933161af649 (diff)
Properly treat bad addressing modes in OR/AND as illegal instructions
Diffstat (limited to '68kinst.c')
-rw-r--r--68kinst.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/68kinst.c b/68kinst.c
index 1e15e80..9a99cdd 100644
--- a/68kinst.c
+++ b/68kinst.c
@@ -1151,7 +1151,7 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
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 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
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 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
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 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
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;
}