comparison m68k_core.c @ 987:1f09994e92c5

Initial stab at implementing address error exceptions. Need to fill in the value of IR, undefined bits of last stack frame word and properly deal with address errors that occur during exception processing.
author Michael Pavone <pavone@retrodev.com>
date Tue, 26 Apr 2016 23:13:37 -0700
parents f680fe746a7d
children ce9df7a5fdf2
comparison
equal deleted inserted replaced
986:f680fe746a7d 987:1f09994e92c5
551 551
552 code_ptr get_native_address(m68k_options *opts, uint32_t address) 552 code_ptr get_native_address(m68k_options *opts, uint32_t address)
553 { 553 {
554 native_map_slot * native_code_map = opts->gen.native_code_map; 554 native_map_slot * native_code_map = opts->gen.native_code_map;
555 address &= opts->gen.address_mask; 555 address &= opts->gen.address_mask;
556 if (address & 1) { 556
557 return opts->odd_address;
558 }
559 //TODO: Refactor part of this loop into some kind of get_ram_chunk function 557 //TODO: Refactor part of this loop into some kind of get_ram_chunk function
560 for (int i = 0; i < opts->gen.memmap_chunks; i++) { 558 for (int i = 0; i < opts->gen.memmap_chunks; i++) {
561 if (address >= opts->gen.memmap[i].start && address < opts->gen.memmap[i].end) { 559 if (address >= opts->gen.memmap[i].start && address < opts->gen.memmap[i].end) {
562 //calculate the lowest alias for this address 560 //calculate the lowest alias for this address
563 address = opts->gen.memmap[i].start + ((address - opts->gen.memmap[i].start) & opts->gen.memmap[i].mask); 561 address = opts->gen.memmap[i].start + ((address - opts->gen.memmap[i].start) & opts->gen.memmap[i].mask);
564 } 562 }
565 } 563 }
566 address /= 2; 564
567 uint32_t chunk = address / NATIVE_CHUNK_SIZE; 565 uint32_t chunk = address / NATIVE_CHUNK_SIZE;
568 if (!native_code_map[chunk].base) { 566 if (!native_code_map[chunk].base) {
569 return NULL; 567 return NULL;
570 } 568 }
571 uint32_t offset = address % NATIVE_CHUNK_SIZE; 569 uint32_t offset = address % NATIVE_CHUNK_SIZE;
589 //calculate the lowest alias for this address 587 //calculate the lowest alias for this address
590 address = opts->gen.memmap[i].start + ((address - opts->gen.memmap[i].start) & opts->gen.memmap[i].mask); 588 address = opts->gen.memmap[i].start + ((address - opts->gen.memmap[i].start) & opts->gen.memmap[i].mask);
591 } 589 }
592 } 590 }
593 591
594 address /= 2;
595 uint32_t chunk = address / NATIVE_CHUNK_SIZE; 592 uint32_t chunk = address / NATIVE_CHUNK_SIZE;
596 if (!native_code_map[chunk].base) { 593 if (!native_code_map[chunk].base) {
597 return 0; 594 return 0;
598 } 595 }
599 uint32_t offset = address % NATIVE_CHUNK_SIZE; 596 uint32_t offset = address % NATIVE_CHUNK_SIZE;
641 } else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) { 638 } else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) {
642 uint32_t size = chunk_size(&opts->gen, opts->gen.memmap + i); 639 uint32_t size = chunk_size(&opts->gen, opts->gen.memmap + i);
643 meta_off += size; 640 meta_off += size;
644 } 641 }
645 } 642 }
646 address/= 2; 643
647 uint32_t chunk = address / NATIVE_CHUNK_SIZE; 644 uint32_t chunk = address / NATIVE_CHUNK_SIZE;
648 if (!native_code_map[chunk].base) { 645 if (!native_code_map[chunk].base) {
649 native_code_map[chunk].base = native_addr; 646 native_code_map[chunk].base = native_addr;
650 native_code_map[chunk].offsets = malloc(sizeof(int32_t) * NATIVE_CHUNK_SIZE); 647 native_code_map[chunk].offsets = malloc(sizeof(int32_t) * NATIVE_CHUNK_SIZE);
651 memset(native_code_map[chunk].offsets, 0xFF, sizeof(int32_t) * NATIVE_CHUNK_SIZE); 648 memset(native_code_map[chunk].offsets, 0xFF, sizeof(int32_t) * NATIVE_CHUNK_SIZE);
817 RAW_IMPL(M68K_TAS, translate_m68k_tas), 814 RAW_IMPL(M68K_TAS, translate_m68k_tas),
818 }; 815 };
819 816
820 void translate_m68k(m68k_options * opts, m68kinst * inst) 817 void translate_m68k(m68k_options * opts, m68kinst * inst)
821 { 818 {
819 if (inst->address & 1) {
820 translate_m68k_odd(opts, inst);
821 return;
822 }
822 check_cycles_int(&opts->gen, inst->address); 823 check_cycles_int(&opts->gen, inst->address);
823 //log_address(&opts->gen, inst->address, "M68K: %X @ %d\n"); 824 //log_address(&opts->gen, inst->address, "M68K: %X @ %d\n");
824 if ( 825 if (
825 (inst->src.addr_mode > MODE_AREG && inst->src.addr_mode < MODE_IMMEDIATE) 826 (inst->src.addr_mode > MODE_AREG && inst->src.addr_mode < MODE_IMMEDIATE)
826 || (inst->dst.addr_mode > MODE_AREG && inst->dst.addr_mode < MODE_IMMEDIATE) 827 || (inst->dst.addr_mode > MODE_AREG && inst->dst.addr_mode < MODE_IMMEDIATE)
870 if (opts->address_log) { 871 if (opts->address_log) {
871 fprintf(opts->address_log, "%X\n", address); 872 fprintf(opts->address_log, "%X\n", address);
872 fflush(opts->address_log); 873 fflush(opts->address_log);
873 } 874 }
874 do { 875 do {
875 if (address & 1) {
876 break;
877 }
878 encoded = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen); 876 encoded = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen);
879 if (!encoded) { 877 if (!encoded) {
880 map_native_address(context, address, code->cur, 2, 1); 878 map_native_address(context, address, code->cur, 2, 1);
881 translate_out_of_bounds(code); 879 translate_out_of_bounds(code);
882 break; 880 break;
900 check_code_prologue(code); 898 check_code_prologue(code);
901 code_ptr start = code->cur; 899 code_ptr start = code->cur;
902 translate_m68k(opts, &instbuf); 900 translate_m68k(opts, &instbuf);
903 code_ptr after = code->cur; 901 code_ptr after = code->cur;
904 map_native_address(context, instbuf.address, start, m68k_size, after-start); 902 map_native_address(context, instbuf.address, start, m68k_size, after-start);
905 } while(!m68k_is_terminal(&instbuf)); 903 } while(!m68k_is_terminal(&instbuf) && !(address & 1));
906 process_deferred(&opts->gen.deferred, context, (native_addr_func)get_native_from_context); 904 process_deferred(&opts->gen.deferred, context, (native_addr_func)get_native_from_context);
907 if (opts->gen.deferred) { 905 if (opts->gen.deferred) {
908 address = opts->gen.deferred->address; 906 address = opts->gen.deferred->address;
909 } 907 }
910 } while(opts->gen.deferred); 908 } while(opts->gen.deferred);