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;*/