Mercurial > repos > blastem
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: |