comparison m68k_core.c @ 692:e11e68918691

Fix bug in map_native_address that was breaking some self-modifying code in Gunstar Heroes
author Michael Pavone <pavone@retrodev.com>
date Tue, 28 Apr 2015 19:04:36 -0700
parents fc04781f4d28
children 7f96bd1cb1be
comparison
equal deleted inserted replaced
691:74d636e85bf8 692:e11e68918691
604 if (address >= opts->gen.memmap[i].start && address < opts->gen.memmap[i].end) { 604 if (address >= opts->gen.memmap[i].start && address < opts->gen.memmap[i].end) {
605 if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) { 605 if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) {
606 uint32_t masked = (address & opts->gen.memmap[i].mask); 606 uint32_t masked = (address & opts->gen.memmap[i].mask);
607 uint32_t final_off = masked + meta_off; 607 uint32_t final_off = masked + meta_off;
608 uint32_t ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3); 608 uint32_t ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3);
609 context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 3); 609 context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7);
610 610
611 uint32_t slot = final_off / 1024; 611 uint32_t slot = final_off / 1024;
612 if (!opts->gen.ram_inst_sizes[slot]) { 612 if (!opts->gen.ram_inst_sizes[slot]) {
613 opts->gen.ram_inst_sizes[slot] = malloc(sizeof(uint8_t) * 512); 613 opts->gen.ram_inst_sizes[slot] = malloc(sizeof(uint8_t) * 512);
614 } 614 }
616 616
617 //TODO: Deal with case in which end of instruction is in a different memory chunk 617 //TODO: Deal with case in which end of instruction is in a different memory chunk
618 masked = (address + size - 1) & opts->gen.memmap[i].mask; 618 masked = (address + size - 1) & opts->gen.memmap[i].mask;
619 final_off = masked + meta_off; 619 final_off = masked + meta_off;
620 ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3); 620 ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3);
621 context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 3); 621 context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7);
622 } 622 }
623 break; 623 break;
624 } else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) { 624 } else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) {
625 uint32_t size = chunk_size(&opts->gen, opts->gen.memmap + i); 625 uint32_t size = chunk_size(&opts->gen, opts->gen.memmap + i);
626 meta_off += size; 626 meta_off += size;