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