changeset 183:2f08d9e90a4c

Fix (a7)+ src when size is byte, fix trap return address, make div with areg src decoded to invalid
author Mike Pavone <pavone@retrodev.com>
date Wed, 09 Jan 2013 22:31:07 -0800
parents 924af8b2f7a0
children ebcbdd1c4cc8
files 68kinst.c m68k_to_x86.c
diffstat 2 files changed, 4 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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;
 				}
--- 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: