comparison m68k_core.c @ 985:751280fb4494

Fix interrupt latency from STOP instruction status reg changes. Fix modified code patching when non-standard aliases are used. This fixes the demo MDEM's First
author Michael Pavone <pavone@retrodev.com>
date Sun, 24 Apr 2016 21:23:28 -0700
parents 902c53d9c16f
children f680fe746a7d
comparison
equal deleted inserted replaced
984:bd4d698d995b 985:751280fb4494
545 native_map_slot * native_code_map = opts->gen.native_code_map; 545 native_map_slot * native_code_map = opts->gen.native_code_map;
546 address &= opts->gen.address_mask; 546 address &= opts->gen.address_mask;
547 if (address & 1) { 547 if (address & 1) {
548 return opts->odd_address; 548 return opts->odd_address;
549 } 549 }
550 //TODO: Refactor part of this loop into some kind of get_ram_chunk function
551 for (int i = 0; i < opts->gen.memmap_chunks; i++) {
552 if (address >= opts->gen.memmap[i].start && address < opts->gen.memmap[i].end) {
553 //calculate the lowest alias for this address
554 address = opts->gen.memmap[i].start + ((address - opts->gen.memmap[i].start) & opts->gen.memmap[i].mask);
555 }
556 }
550 address /= 2; 557 address /= 2;
551 uint32_t chunk = address / NATIVE_CHUNK_SIZE; 558 uint32_t chunk = address / NATIVE_CHUNK_SIZE;
552 if (!native_code_map[chunk].base) { 559 if (!native_code_map[chunk].base) {
553 return NULL; 560 return NULL;
554 } 561 }
562 code_ptr get_native_from_context(m68k_context * context, uint32_t address) 569 code_ptr get_native_from_context(m68k_context * context, uint32_t address)
563 { 570 {
564 return get_native_address(context->options, address); 571 return get_native_address(context->options, address);
565 } 572 }
566 573
567 uint32_t get_instruction_start(native_map_slot * native_code_map, uint32_t address) 574 uint32_t get_instruction_start(m68k_options *opts, native_map_slot * native_code_map, uint32_t address)
568 { 575 {
569 //FIXME: Use opts->gen.address_mask 576 address &= opts->gen.address_mask;
570 address &= 0xFFFFFF; 577 //TODO: Refactor part of this loop into some kind of get_ram_chunk function
578 for (int i = 0; i < opts->gen.memmap_chunks; i++) {
579 if (address >= opts->gen.memmap[i].start && address < opts->gen.memmap[i].end) {
580 //calculate the lowest alias for this address
581 address = opts->gen.memmap[i].start + ((address - opts->gen.memmap[i].start) & opts->gen.memmap[i].mask);
582 }
583 }
584
571 address /= 2; 585 address /= 2;
572 uint32_t chunk = address / NATIVE_CHUNK_SIZE; 586 uint32_t chunk = address / NATIVE_CHUNK_SIZE;
573 if (!native_code_map[chunk].base) { 587 if (!native_code_map[chunk].base) {
574 return 0; 588 return 0;
575 } 589 }
610 masked = (address + size - 1) & opts->gen.memmap[i].mask; 624 masked = (address + size - 1) & opts->gen.memmap[i].mask;
611 final_off = masked + meta_off; 625 final_off = masked + meta_off;
612 ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3); 626 ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3);
613 context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7); 627 context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7);
614 } 628 }
629 //calculate the lowest alias for this address
630 address = opts->gen.memmap[i].start + ((address - opts->gen.memmap[i].start) & opts->gen.memmap[i].mask);
615 break; 631 break;
616 } else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) { 632 } else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) {
617 uint32_t size = chunk_size(&opts->gen, opts->gen.memmap + i); 633 uint32_t size = chunk_size(&opts->gen, opts->gen.memmap + i);
618 meta_off += size; 634 meta_off += size;
619 } 635 }