# HG changeset patch # User Mike Pavone # Date 1357799467 28800 # Node ID 2f08d9e90a4cab8cfd3f2cde903d22e36f3adb1f # Parent 924af8b2f7a0569de18ea507eafefbe3a151ada6 Fix (a7)+ src when size is byte, fix trap return address, make div with areg src decoded to invalid diff -r 924af8b2f7a0 -r 2f08d9e90a4c 68kinst.c --- a/68kinst.c Wed Jan 09 21:41:55 2013 -0800 +++ b/68kinst.c Wed Jan 09 22:31:07 2013 -0800 @@ -876,7 +876,7 @@ 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 @@ 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 -r 924af8b2f7a0 -r 2f08d9e90a4c m68k_to_x86.c --- a/m68k_to_x86.c Wed Jan 09 21:41:55 2013 -0800 +++ b/m68k_to_x86.c Wed Jan 09 22:31:07 2013 -0800 @@ -167,7 +167,7 @@ } 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 @@ //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: