diff options
author | Mike Pavone <pavone@retrodev.com> | 2013-05-12 01:34:17 -0700 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2013-05-12 01:34:17 -0700 |
commit | 301f9c12bf5ca2a600bc917a62488d088b5e1946 (patch) | |
tree | 8646ca867282351b6cbd799ac8a64ab83dc7f82d /m68k_to_x86.c | |
parent | e7cb8ebf9ac0fbeb2d8ec3dea34dcbbda4f8b9ef (diff) |
Fix retrun address calculation for CHK exceptions
Diffstat (limited to 'm68k_to_x86.c')
-rw-r--r-- | m68k_to_x86.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c index 0bf5a6d..e99f167 100644 --- a/m68k_to_x86.c +++ b/m68k_to_x86.c @@ -3063,11 +3063,28 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) } 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 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) 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); |