Mercurial > repos > blastem
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 } |