comparison m68k_core_x86.c @ 687:a61d33ccea7d

Moved translate_m68k_rte and translate_m68k_reset to m68k_core.c
author Michael Pavone <pavone@retrodev.com>
date Thu, 08 Jan 2015 19:11:56 -0800
parents 8cb61671777b
children 8c546bc1d773
comparison
equal deleted inserted replaced
686:8cb61671777b 687:a61d33ccea7d
539 case OPSIZE_LONG: 539 case OPSIZE_LONG:
540 call(code, opts->write_32_lowfirst); 540 call(code, opts->write_32_lowfirst);
541 break; 541 break;
542 } 542 }
543 } 543 }
544 }
545
546 void check_user_mode_swap_ssp_usp(m68k_options *opts)
547 {
548 code_info * code = &opts->gen.code;
549 //Check if we've switched to user mode and swap stack pointers if needed
550 bt_irdisp(code, 5, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B);
551 code_ptr end_off = code->cur + 1;
552 jcc(code, CC_C, code->cur + 2);
553 swap_ssp_usp(opts);
554 *end_off = code->cur - (end_off + 1);
544 } 555 }
545 556
546 void translate_m68k_move(m68k_options * opts, m68kinst * inst) 557 void translate_m68k_move(m68k_options * opts, m68kinst * inst)
547 { 558 {
548 code_info *code = &opts->gen.code; 559 code_info *code = &opts->gen.code;
2070 mov_rrdisp(code, opts->gen.scratch1, dst_op->base, dst_op->disp, SZ_W); 2081 mov_rrdisp(code, opts->gen.scratch1, dst_op->base, dst_op->disp, SZ_W);
2071 } 2082 }
2072 m68k_save_result(inst, opts); 2083 m68k_save_result(inst, opts);
2073 } 2084 }
2074 2085
2075 void translate_m68k_reset(m68k_options *opts, m68kinst *inst)
2076 {
2077 code_info *code = &opts->gen.code;
2078 call(code, opts->gen.save_context);
2079 call_args(code, (code_ptr)print_regs_exit, 1, opts->gen.context_reg);
2080 }
2081
2082 void translate_m68k_rte(m68k_options *opts, m68kinst *inst)
2083 {
2084 code_info *code = &opts->gen.code;
2085 //TODO: Trap if not in system mode
2086 //Read saved SR
2087 areg_to_native(opts, 7, opts->gen.scratch1);
2088 call(code, opts->read_16);
2089 addi_areg(opts, 2, 7);
2090 call(code, opts->set_sr);
2091 //Read saved PC
2092 areg_to_native(opts, 7, opts->gen.scratch1);
2093 call(code, opts->read_32);
2094 addi_areg(opts, 4, 7);
2095 //Check if we've switched to user mode and swap stack pointers if needed
2096 bt_irdisp(code, 5, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B);
2097 code_ptr end_off = code->cur + 1;
2098 jcc(code, CC_C, code->cur + 2);
2099 swap_ssp_usp(opts);
2100 *end_off = code->cur - (end_off+1);
2101 //Get native address, sync components, recalculate integer points and jump to returned address
2102 call(code, opts->native_addr_and_sync);
2103 jmp_r(code, opts->gen.scratch1);
2104 }
2105
2106 void translate_out_of_bounds(code_info *code) 2086 void translate_out_of_bounds(code_info *code)
2107 { 2087 {
2108 xor_rr(code, RDI, RDI, SZ_D); 2088 xor_rr(code, RDI, RDI, SZ_D);
2109 call_args(code, (code_ptr)exit, 1, RDI); 2089 call_args(code, (code_ptr)exit, 1, RDI);
2110 } 2090 }
2457 retn(code); 2437 retn(code);
2458 *do_int = code->cur - (do_int+1); 2438 *do_int = code->cur - (do_int+1);
2459 //set target cycle to sync cycle 2439 //set target cycle to sync cycle
2460 mov_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, sync_cycle), opts->gen.limit, SZ_D); 2440 mov_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, sync_cycle), opts->gen.limit, SZ_D);
2461 //swap USP and SSP if not already in supervisor mode 2441 //swap USP and SSP if not already in supervisor mode
2462 bt_irdisp(code, 5, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B); 2442 check_user_mode_swap_ssp_usp(opts);
2463 code_ptr already_supervisor = code->cur + 1;
2464 jcc(code, CC_C, code->cur + 2);
2465 swap_ssp_usp(opts);
2466 *already_supervisor = code->cur - (already_supervisor+1);
2467 //save PC 2443 //save PC
2468 subi_areg(opts, 4, 7); 2444 subi_areg(opts, 4, 7);
2469 areg_to_native(opts, 7, opts->gen.scratch2); 2445 areg_to_native(opts, 7, opts->gen.scratch2);
2470 call(code, opts->write_32_lowfirst); 2446 call(code, opts->write_32_lowfirst);
2471 //save status register 2447 //save status register
2491 jmp_r(code, opts->gen.scratch1); 2467 jmp_r(code, opts->gen.scratch1);
2492 2468
2493 opts->trap = code->cur; 2469 opts->trap = code->cur;
2494 push_r(code, opts->gen.scratch2); 2470 push_r(code, opts->gen.scratch2);
2495 //swap USP and SSP if not already in supervisor mode 2471 //swap USP and SSP if not already in supervisor mode
2496 bt_irdisp(code, 5, opts->gen.context_reg, offsetof(m68k_context, status), SZ_B); 2472 check_user_mode_swap_ssp_usp(opts);
2497 already_supervisor = code->cur + 1;
2498 jcc(code, CC_C, code->cur + 2);
2499 swap_ssp_usp(opts);
2500 *already_supervisor = code->cur - (already_supervisor+1);
2501 //save PC 2473 //save PC
2502 subi_areg(opts, 4, 7); 2474 subi_areg(opts, 4, 7);
2503 areg_to_native(opts, 7, opts->gen.scratch2); 2475 areg_to_native(opts, 7, opts->gen.scratch2);
2504 call(code, opts->write_32_lowfirst); 2476 call(code, opts->write_32_lowfirst);
2505 //save status register 2477 //save status register