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) {