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;