Mercurial > repos > blastem
comparison m68k_core.c @ 587:55c5b0f913ce
Made m68k_retranslate_inst host-cpu generic and moved it to m68k_core.c
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Mar 2014 23:26:46 -0800 |
parents | b6713c1b6f55 |
children | 963d5901f583 |
comparison
equal
deleted
inserted
replaced
586:aa35ccb90aa9 | 587:55c5b0f913ce |
---|---|
672 encoded = NULL; | 672 encoded = NULL; |
673 } | 673 } |
674 } while(encoded != NULL); | 674 } while(encoded != NULL); |
675 } | 675 } |
676 | 676 |
677 void * m68k_retranslate_inst(uint32_t address, m68k_context * context) | |
678 { | |
679 m68k_options * opts = context->options; | |
680 code_info *code = &opts->gen.code; | |
681 uint8_t orig_size = get_native_inst_size(opts, address); | |
682 code_ptr orig_start = get_native_address(context->native_code_map, address); | |
683 uint32_t orig = address; | |
684 code_info orig_code; | |
685 orig_code.cur = orig_start; | |
686 orig_code.last = orig_start + orig_size + 5; | |
687 address &= 0xFFFF; | |
688 uint16_t *after, *inst = context->mem_pointers[1] + address/2; | |
689 m68kinst instbuf; | |
690 after = m68k_decode(inst, &instbuf, orig); | |
691 if (orig_size != MAX_NATIVE_SIZE) { | |
692 deferred_addr * orig_deferred = opts->gen.deferred; | |
693 | |
694 //make sure the beginning of the code for an instruction is contiguous | |
695 check_code_prologue(code); | |
696 code_ptr native_start = code->cur; | |
697 translate_m68k(opts, &instbuf); | |
698 code_ptr native_end = code->cur; | |
699 uint8_t is_terminal = m68k_is_terminal(&instbuf); | |
700 if ((native_end - native_start) <= orig_size) { | |
701 code_ptr native_next; | |
702 if (!is_terminal) { | |
703 native_next = get_native_address(context->native_code_map, orig + (after-inst)*2); | |
704 } | |
705 if (is_terminal || (native_next && ((native_next == orig_start + orig_size) || (orig_size - (native_end - native_start)) > 5))) { | |
706 remove_deferred_until(&opts->gen.deferred, orig_deferred); | |
707 code_info tmp; | |
708 tmp.cur = code->cur; | |
709 tmp.last = code->last; | |
710 code->cur = orig_code.cur; | |
711 code->last = orig_code.last; | |
712 translate_m68k(opts, &instbuf); | |
713 native_end = orig_code.cur = code->cur; | |
714 code->cur = tmp.cur; | |
715 code->last = tmp.last; | |
716 if (!is_terminal) { | |
717 nop_fill_or_jmp_next(&orig_code, orig_start + orig_size, native_next); | |
718 } | |
719 m68k_handle_deferred(context); | |
720 return orig_start; | |
721 } | |
722 } | |
723 | |
724 map_native_address(context, instbuf.address, native_start, (after-inst)*2, MAX_NATIVE_SIZE); | |
725 | |
726 jmp(&orig_code, native_start); | |
727 if (!m68k_is_terminal(&instbuf)) { | |
728 code_ptr native_end = code->cur; | |
729 code->cur = native_start + MAX_NATIVE_SIZE; | |
730 code_ptr rest = get_native_address_trans(context, orig + (after-inst)*2); | |
731 code_ptr tmp = code->cur; | |
732 code->cur = native_end; | |
733 jmp(code, rest); | |
734 code->cur = tmp; | |
735 } else { | |
736 code->cur = native_start + MAX_NATIVE_SIZE; | |
737 } | |
738 m68k_handle_deferred(context); | |
739 return native_start; | |
740 } else { | |
741 code_info tmp; | |
742 tmp.cur = code->cur; | |
743 tmp.last = code->last; | |
744 code->cur = orig_code.cur; | |
745 code->last = orig_code.last; | |
746 translate_m68k(opts, &instbuf); | |
747 if (!m68k_is_terminal(&instbuf)) { | |
748 jmp(code, get_native_address_trans(context, orig + (after-inst)*2)); | |
749 } | |
750 code->cur = tmp.cur; | |
751 code->last = tmp.last; | |
752 m68k_handle_deferred(context); | |
753 return orig_start; | |
754 } | |
755 } | |
756 | |
677 code_ptr get_native_address_trans(m68k_context * context, uint32_t address) | 757 code_ptr get_native_address_trans(m68k_context * context, uint32_t address) |
678 { | 758 { |
679 address &= 0xFFFFFF; | 759 address &= 0xFFFFFF; |
680 code_ptr ret = get_native_address(context->native_code_map, address); | 760 code_ptr ret = get_native_address(context->native_code_map, address); |
681 if (!ret) { | 761 if (!ret) { |