summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--68kinst.c4
-rw-r--r--m68k_to_x86.c4
2 files changed, 4 insertions, 4 deletions
diff --git a/68kinst.c b/68kinst.c
index a42df45..d0e8c20 100644
--- a/68kinst.c
+++ b/68kinst.c
@@ -876,7 +876,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, OPSIZE_WORD, &(decoded->src));
- if (!istream) {
+ if (!istream || decoded->src.addr_mode == MODE_AREG) {
decoded->op = M68K_INVALID;
return start+1;
}
@@ -901,7 +901,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, OPSIZE_WORD, &(decoded->src));
- if (!istream) {
+ if (!istream || decoded->src.addr_mode == MODE_AREG) {
decoded->op = M68K_INVALID;
return start+1;
}
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index 0fbd2bf..98ace40 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -167,7 +167,7 @@ uint8_t * translate_m68k_src(m68kinst * inst, x86_ea * ea, uint8_t * out, x86_68
}
if (inst->src.addr_mode == MODE_AREG_POSTINC) {
- inc_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : 1);
+ inc_amount = inst->extra.size == OPSIZE_WORD ? 2 : (inst->extra.size == OPSIZE_LONG ? 4 : (inst->src.params.regs.pri == 7 ? 2 : 1));
if (opts->aregs[inst->src.params.regs.pri] >= 0) {
out = add_ir(out, inc_amount, opts->aregs[inst->src.params.regs.pri], SZ_D);
} else {
@@ -3484,7 +3484,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
//case M68K_TAS:
case M68K_TRAP:
dst = mov_ir(dst, src_op.disp, SCRATCH2, SZ_D);
- dst = mov_ir(dst, inst->address, SCRATCH1, SZ_D);
+ dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D);
dst = jmp(dst, (uint8_t *)m68k_trap);
break;
//case M68K_TRAPV: