# HG changeset patch # User Mike Pavone # Date 1356763630 28800 # Node ID ee19ddadb398eafd19ff4302de3917bbee88a7ea # Parent d9ff99ef5533f7b8fea926503cf6fcc71fa862af Fix return address pushed to stack for jsr diff -r d9ff99ef5533 -r ee19ddadb398 m68k_to_x86.c --- a/m68k_to_x86.c Fri Dec 28 21:36:22 2012 -0800 +++ b/m68k_to_x86.c Fri Dec 28 22:47:10 2012 -0800 @@ -1565,7 +1565,7 @@ { case MODE_AREG_INDIRECT: dst = cycles(dst, BUS*2); - dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); + dst = mov_ir(dst, inst->address + 2, SCRATCH1, SZ_D); dst = push_r(dst, SCRATCH1); dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); @@ -1582,7 +1582,7 @@ break; case MODE_AREG_INDEX_DISP8: dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct - dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); + dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); dst = push_r(dst, SCRATCH1); dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); @@ -1634,7 +1634,7 @@ case MODE_PC_DISPLACE: //TODO: Add cycles in the right place relative to pushing the return address on the stack dst = cycles(dst, 10); - dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); + dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); dst = push_r(dst, SCRATCH1); dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); @@ -1651,7 +1651,7 @@ break; case MODE_PC_INDEX_DISP8: dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct - dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); + dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); dst = push_r(dst, SCRATCH1); dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); @@ -1700,7 +1700,7 @@ case MODE_ABSOLUTE_SHORT: //TODO: Add cycles in the right place relative to pushing the return address on the stack dst = cycles(dst, inst->src.addr_mode == MODE_ABSOLUTE ? 12 : 10); - dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); + dst = mov_ir(dst, inst->address + (inst->src.addr_mode == MODE_ABSOLUTE ? 6 : 4), SCRATCH1, SZ_D); dst = push_r(dst, SCRATCH1); dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D);