Mercurial > repos > blastem
comparison m68k_core.c @ 726:7367b14ac01c
Don't attempt to translate or map code at odd addresses. This fixes a bug that shows up when playing College Footbal USA 96
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 22 May 2015 23:49:32 -0700 |
parents | a92ca6f0ed83 |
children | 724bbec47f86 41f73c76b978 |
comparison
equal
deleted
inserted
replaced
725:a92ca6f0ed83 | 726:7367b14ac01c |
---|---|
193 } | 193 } |
194 | 194 |
195 void jump_m68k_abs(m68k_options * opts, uint32_t address) | 195 void jump_m68k_abs(m68k_options * opts, uint32_t address) |
196 { | 196 { |
197 code_info *code = &opts->gen.code; | 197 code_info *code = &opts->gen.code; |
198 code_ptr dest_addr = get_native_address(opts->gen.native_code_map, address); | 198 code_ptr dest_addr = get_native_address(opts, address); |
199 if (!dest_addr) { | 199 if (!dest_addr) { |
200 opts->gen.deferred = defer_address(opts->gen.deferred, address, code->cur + 1); | 200 opts->gen.deferred = defer_address(opts->gen.deferred, address, code->cur + 1); |
201 //dummy address to be replaced later, make sure it generates a 4-byte displacement | 201 //dummy address to be replaced later, make sure it generates a 4-byte displacement |
202 dest_addr = code->cur + 256; | 202 dest_addr = code->cur + 256; |
203 } | 203 } |
549 //Get native address, sync components, recalculate integer points and jump to returned address | 549 //Get native address, sync components, recalculate integer points and jump to returned address |
550 call(code, opts->native_addr_and_sync); | 550 call(code, opts->native_addr_and_sync); |
551 jmp_r(code, opts->gen.scratch1); | 551 jmp_r(code, opts->gen.scratch1); |
552 } | 552 } |
553 | 553 |
554 code_ptr get_native_address(native_map_slot * native_code_map, uint32_t address) | 554 code_ptr get_native_address(m68k_options *opts, uint32_t address) |
555 { | 555 { |
556 //FIXME: Use opts->gen.address_mask | 556 native_map_slot * native_code_map = opts->gen.native_code_map; |
557 address &= 0xFFFFFF; | 557 address &= opts->gen.address_mask; |
558 if (address & 1) { | |
559 return opts->odd_address; | |
560 } | |
558 address /= 2; | 561 address /= 2; |
559 uint32_t chunk = address / NATIVE_CHUNK_SIZE; | 562 uint32_t chunk = address / NATIVE_CHUNK_SIZE; |
560 if (!native_code_map[chunk].base) { | 563 if (!native_code_map[chunk].base) { |
561 return NULL; | 564 return NULL; |
562 } | 565 } |
567 return native_code_map[chunk].base + native_code_map[chunk].offsets[offset]; | 570 return native_code_map[chunk].base + native_code_map[chunk].offsets[offset]; |
568 } | 571 } |
569 | 572 |
570 code_ptr get_native_from_context(m68k_context * context, uint32_t address) | 573 code_ptr get_native_from_context(m68k_context * context, uint32_t address) |
571 { | 574 { |
572 return get_native_address(context->native_code_map, address); | 575 return get_native_address(context->options, address); |
573 } | 576 } |
574 | 577 |
575 uint32_t get_instruction_start(native_map_slot * native_code_map, uint32_t address) | 578 uint32_t get_instruction_start(native_map_slot * native_code_map, uint32_t address) |
576 { | 579 { |
577 //FIXME: Use opts->gen.address_mask | 580 //FIXME: Use opts->gen.address_mask |
835 void translate_m68k_stream(uint32_t address, m68k_context * context) | 838 void translate_m68k_stream(uint32_t address, m68k_context * context) |
836 { | 839 { |
837 m68kinst instbuf; | 840 m68kinst instbuf; |
838 m68k_options * opts = context->options; | 841 m68k_options * opts = context->options; |
839 code_info *code = &opts->gen.code; | 842 code_info *code = &opts->gen.code; |
840 if(get_native_address(opts->gen.native_code_map, address)) { | 843 if(get_native_address(opts, address)) { |
841 return; | 844 return; |
842 } | 845 } |
843 uint16_t *encoded, *next; | 846 uint16_t *encoded, *next; |
844 do { | 847 do { |
845 if (opts->address_log) { | 848 if (opts->address_log) { |
846 fprintf(opts->address_log, "%X\n", address); | 849 fprintf(opts->address_log, "%X\n", address); |
847 fflush(opts->address_log); | 850 fflush(opts->address_log); |
848 } | 851 } |
849 do { | 852 do { |
853 if (address & 1) { | |
854 break; | |
855 } | |
850 encoded = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen); | 856 encoded = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen); |
851 if (!encoded) { | 857 if (!encoded) { |
852 map_native_address(context, address, code->cur, 2, 1); | 858 map_native_address(context, address, code->cur, 2, 1); |
853 translate_out_of_bounds(code); | 859 translate_out_of_bounds(code); |
854 break; | 860 break; |
855 } | 861 } |
856 code_ptr existing = get_native_address(opts->gen.native_code_map, address); | 862 code_ptr existing = get_native_address(opts, address); |
857 if (existing) { | 863 if (existing) { |
858 jmp(code, existing); | 864 jmp(code, existing); |
859 break; | 865 break; |
860 } | 866 } |
861 next = m68k_decode(encoded, &instbuf, address); | 867 next = m68k_decode(encoded, &instbuf, address); |
885 void * m68k_retranslate_inst(uint32_t address, m68k_context * context) | 891 void * m68k_retranslate_inst(uint32_t address, m68k_context * context) |
886 { | 892 { |
887 m68k_options * opts = context->options; | 893 m68k_options * opts = context->options; |
888 code_info *code = &opts->gen.code; | 894 code_info *code = &opts->gen.code; |
889 uint8_t orig_size = get_native_inst_size(opts, address); | 895 uint8_t orig_size = get_native_inst_size(opts, address); |
890 code_ptr orig_start = get_native_address(context->native_code_map, address); | 896 code_ptr orig_start = get_native_address(context->options, address); |
891 uint32_t orig = address; | 897 uint32_t orig = address; |
892 code_info orig_code; | 898 code_info orig_code; |
893 orig_code.cur = orig_start; | 899 orig_code.cur = orig_start; |
894 orig_code.last = orig_start + orig_size + 5; | 900 orig_code.last = orig_start + orig_size + 5; |
895 uint16_t *after, *inst = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen); | 901 uint16_t *after, *inst = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen); |
959 } | 965 } |
960 } | 966 } |
961 | 967 |
962 code_ptr get_native_address_trans(m68k_context * context, uint32_t address) | 968 code_ptr get_native_address_trans(m68k_context * context, uint32_t address) |
963 { | 969 { |
964 //FIXME: Use opts->gen.address_mask | 970 code_ptr ret = get_native_address(context->options, address); |
965 address &= 0xFFFFFF; | |
966 code_ptr ret = get_native_address(context->native_code_map, address); | |
967 if (!ret) { | 971 if (!ret) { |
968 translate_m68k_stream(address, context); | 972 translate_m68k_stream(address, context); |
969 ret = get_native_address(context->native_code_map, address); | 973 ret = get_native_address(context->options, address); |
970 } | 974 } |
971 return ret; | 975 return ret; |
972 } | 976 } |
973 | 977 |
974 void remove_breakpoint(m68k_context * context, uint32_t address) | 978 void remove_breakpoint(m68k_context * context, uint32_t address) |
975 { | 979 { |
976 code_ptr native = get_native_address(context->native_code_map, address); | 980 code_ptr native = get_native_address(context->options, address); |
977 code_info tmp = context->options->gen.code; | 981 code_info tmp = context->options->gen.code; |
978 context->options->gen.code.cur = native; | 982 context->options->gen.code.cur = native; |
979 context->options->gen.code.last = native + MAX_NATIVE_SIZE; | 983 context->options->gen.code.last = native + MAX_NATIVE_SIZE; |
980 check_cycles_int(&context->options->gen, address); | 984 check_cycles_int(&context->options->gen, address); |
981 context->options->gen.code = tmp; | 985 context->options->gen.code = tmp; |