Mercurial > repos > blastem
comparison m68k_to_x86.c @ 175:7504200cac86
Fix order of SR and PC saved in an exception stack frame
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jan 2013 20:49:42 -0800 |
parents | a1c3ecb4823f |
children | e2918b5208eb |
comparison
equal
deleted
inserted
replaced
174:a1c3ecb4823f | 175:7504200cac86 |
---|---|
3332 dst = setcc_r(dst, CC_S, FLAG_N); | 3332 dst = setcc_r(dst, CC_S, FLAG_N); |
3333 } | 3333 } |
3334 break; | 3334 break; |
3335 case M68K_RTE: | 3335 case M68K_RTE: |
3336 //TODO: Trap if not in system mode | 3336 //TODO: Trap if not in system mode |
3337 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | 3337 //Read saved SR |
3338 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); | |
3339 dst = push_r(dst, SCRATCH1); | |
3340 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); | |
3341 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | 3338 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); |
3342 dst = call(dst, (uint8_t *)m68k_read_word_scratch1); | 3339 dst = call(dst, (uint8_t *)m68k_read_word_scratch1); |
3343 dst = add_ir(dst, 2, opts->aregs[7], SZ_D); | 3340 dst = add_ir(dst, 2, opts->aregs[7], SZ_D); |
3344 dst = call(dst, (uint8_t *)set_sr); | 3341 dst = call(dst, (uint8_t *)set_sr); |
3345 dst = pop_r(dst, SCRATCH1); | 3342 //Check if we've switched to user mode and swap stack pointers if needed |
3346 dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B); | 3343 dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B); |
3347 end_off = dst+1; | 3344 end_off = dst+1; |
3348 dst = jcc(dst, CC_C, dst+2); | 3345 dst = jcc(dst, CC_C, dst+2); |
3349 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 3346 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
3350 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, opts->aregs[7], SZ_D); | 3347 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, opts->aregs[7], SZ_D); |
3351 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D); | 3348 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D); |
3352 *end_off = dst - (end_off+1); | 3349 *end_off = dst - (end_off+1); |
3350 //Read saved PC | |
3351 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | |
3352 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); | |
3353 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); | |
3354 //Get native address, sync components, recalculate integer points and jump to returned address | |
3353 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); | 3355 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); |
3354 dst = jmp_r(dst, SCRATCH1); | 3356 dst = jmp_r(dst, SCRATCH1); |
3355 break; | 3357 break; |
3356 case M68K_RTR: | 3358 case M68K_RTR: |
3357 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | 3359 //Read saved CCR |
3358 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); | |
3359 dst = push_r(dst, SCRATCH1); | |
3360 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); | |
3361 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | 3360 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); |
3362 dst = call(dst, (uint8_t *)m68k_read_word_scratch1); | 3361 dst = call(dst, (uint8_t *)m68k_read_word_scratch1); |
3363 dst = add_ir(dst, 2, opts->aregs[7], SZ_D); | 3362 dst = add_ir(dst, 2, opts->aregs[7], SZ_D); |
3364 dst = call(dst, (uint8_t *)set_ccr); | 3363 dst = call(dst, (uint8_t *)set_ccr); |
3365 dst = pop_r(dst, SCRATCH1); | 3364 //Read saved PC |
3366 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); | 3365 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); |
3366 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); | |
3367 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); | |
3368 //Get native address and jump to it | |
3369 dst = call(dst, (uint8_t *)m68k_native_addr); | |
3367 dst = jmp_r(dst, SCRATCH1); | 3370 dst = jmp_r(dst, SCRATCH1); |
3368 break; | 3371 break; |
3369 /*case M68K_SBCD: | 3372 /*case M68K_SBCD: |
3370 case M68K_STOP: | 3373 case M68K_STOP: |
3371 break;*/ | 3374 break;*/ |