changeset 324:4f2711899866

Fix retrun address calculation for CHK exceptions
author Mike Pavone <pavone@retrodev.com>
date Sun, 12 May 2013 01:34:17 -0700
parents 8c01b4154480
children 8db584faac4b
files m68k_to_x86.c
diffstat 1 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/m68k_to_x86.c	Sat May 11 23:59:20 2013 -0700
+++ b/m68k_to_x86.c	Sun May 12 01:34:17 2013 -0700
@@ -3063,11 +3063,28 @@
 		} else {
 			dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size);
 		}
+		uint32_t isize;
+		switch(inst->src.addr_mode)
+		{
+		case MODE_AREG_DISPLACE:
+		case MODE_AREG_INDEX_DISP8:
+		case MODE_ABSOLUTE_SHORT:
+		case MODE_PC_INDEX_DISP8:
+		case MODE_PC_DISPLACE:
+		case MODE_IMMEDIATE:
+			isize = 4;
+			break;
+		case MODE_ABSOLUTE:
+			isize = 6;
+			break;
+		default:
+			isize = 2;
+		}
 		uint8_t * passed = dst+1;			
 		dst = jcc(dst, CC_GE, dst+2);
 		dst = mov_ir(dst, 1, FLAG_N, SZ_B);
 		dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D);
-		dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D);
+		dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D);
 		dst = jmp(dst, (uint8_t *)m68k_trap);
 		*passed = dst - (passed+1);
 		if (dst_op.mode == MODE_REG_DIRECT) {
@@ -3089,7 +3106,7 @@
 		dst = jcc(dst, CC_LE, dst+2);
 		dst = mov_ir(dst, 0, FLAG_N, SZ_B);
 		dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D);
-		dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D);
+		dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D);
 		dst = jmp(dst, (uint8_t *)m68k_trap);
 		*passed = dst - (passed+1);
 		dst = cycles(dst, 4);