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