comparison m68k_to_x86.c @ 178:48eb62ba63bc

Fix order of reading saved pc and swapping user and system stack pointers
author Mike Pavone <pavone@retrodev.com>
date Sun, 06 Jan 2013 22:45:45 -0800
parents 09761d4391e1
children 68af8a56ab7a
comparison
equal deleted inserted replaced
177:09761d4391e1 178:48eb62ba63bc
3341 //Read saved SR 3341 //Read saved SR
3342 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); 3342 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
3343 dst = call(dst, (uint8_t *)m68k_read_word_scratch1); 3343 dst = call(dst, (uint8_t *)m68k_read_word_scratch1);
3344 dst = add_ir(dst, 2, opts->aregs[7], SZ_D); 3344 dst = add_ir(dst, 2, opts->aregs[7], SZ_D);
3345 dst = call(dst, (uint8_t *)set_sr); 3345 dst = call(dst, (uint8_t *)set_sr);
3346 //Read saved PC
3347 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
3348 dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
3349 dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
3346 //Check if we've switched to user mode and swap stack pointers if needed 3350 //Check if we've switched to user mode and swap stack pointers if needed
3347 dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B); 3351 dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B);
3348 end_off = dst+1; 3352 end_off = dst+1;
3349 dst = jcc(dst, CC_C, dst+2); 3353 dst = jcc(dst, CC_C, dst+2);
3350 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); 3354 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D);
3351 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, opts->aregs[7], SZ_D); 3355 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, opts->aregs[7], SZ_D);
3352 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D); 3356 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D);
3353 *end_off = dst - (end_off+1); 3357 *end_off = dst - (end_off+1);
3354 //Read saved PC
3355 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
3356 dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
3357 dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
3358 //Get native address, sync components, recalculate integer points and jump to returned address 3358 //Get native address, sync components, recalculate integer points and jump to returned address
3359 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); 3359 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync);
3360 dst = jmp_r(dst, SCRATCH1); 3360 dst = jmp_r(dst, SCRATCH1);
3361 break; 3361 break;
3362 case M68K_RTR: 3362 case M68K_RTR: