X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=m68kcpu.c;h=5b494ad58d8c913563e441d322a0e4eac4ac0eb9;hb=HEAD;hp=1068f264440ef2ca82bdc6c2d8935cc7b5c05c3a;hpb=747b19f7c8b88b0ae329650df9e07e52792d12df;p=pistorm diff --git a/m68kcpu.c b/m68kcpu.c index 1068f26..5b494ad 100644 --- a/m68kcpu.c +++ b/m68kcpu.c @@ -1316,8 +1316,12 @@ void m68k_add_ram_range(uint32_t addr, uint32_t upper, unsigned char *ptr) return; for (int i = 0; i < m68ki_cpu.write_ranges; i++) { - if (m68ki_cpu.write_addr[i] == addr) { + if (m68ki_cpu.write_addr[i] == addr || m68ki_cpu.write_data[i] == ptr) { uint8_t changed = 0; + if (m68ki_cpu.write_addr[i] != addr) { + m68ki_cpu.write_addr[i] = addr; + changed = 1; + } if (m68ki_cpu.write_upper[i] != upper) { m68ki_cpu.write_upper[i] = upper; changed = 1; @@ -1363,8 +1367,12 @@ void m68k_add_rom_range(uint32_t addr, uint32_t upper, unsigned char *ptr) return; for (int i = 0; i < m68ki_cpu.read_ranges; i++) { - if (m68ki_cpu.read_addr[i] == addr) { + if (m68ki_cpu.read_addr[i] == addr || m68ki_cpu.read_data[i] == ptr) { uint8_t changed = 0; + if (m68ki_cpu.read_addr[i] != addr) { + m68ki_cpu.read_addr[i] = addr; + changed = 1; + } if (m68ki_cpu.read_upper[i] != upper) { m68ki_cpu.read_upper[i] = upper; changed = 1; @@ -1392,6 +1400,49 @@ void m68k_add_rom_range(uint32_t addr, uint32_t upper, unsigned char *ptr) } } +void m68k_remove_range(unsigned char *ptr) { + if (!ptr) { + return; + } + + m68ki_cpu.code_translation_cache.lower = 0; + m68ki_cpu.code_translation_cache.upper = 0; + + // FIXME: Replace the 8 with a #define, such as MAX_MUSASHI_RANGES + for (int i = 0; i < 8; i++) { + if (m68ki_cpu.read_data[i] == ptr) { + m68ki_cpu.read_data[i] = NULL; + m68ki_cpu.read_addr[i] = 0; + m68ki_cpu.read_upper[i] = 0; + printf("[MUSASHI] Unmapped read range %d.\n", i); + for (int j = i; j < 8 - 1; j++) { + m68ki_cpu.read_data[j] = m68ki_cpu.read_data[j + 1]; + m68ki_cpu.read_addr[j] = m68ki_cpu.read_addr[j + 1]; + m68ki_cpu.read_upper[j] = m68ki_cpu.read_upper[j + 1]; + } + m68ki_cpu.read_data[8 - 1] = NULL; + m68ki_cpu.read_addr[8 - 1] = 0; + m68ki_cpu.read_upper[8 - 1] = 0; + m68ki_cpu.read_ranges--; + } + if (m68ki_cpu.write_data[i] == ptr) { + m68ki_cpu.write_data[i] = NULL; + m68ki_cpu.write_addr[i] = 0; + m68ki_cpu.write_upper[i] = 0; + printf("[MUSASHI] Unmapped write range %d.\n", i); + for (int j = i; j < 8 - 1; j++) { + m68ki_cpu.write_data[j] = m68ki_cpu.write_data[j + 1]; + m68ki_cpu.write_addr[j] = m68ki_cpu.write_addr[j + 1]; + m68ki_cpu.write_upper[j] = m68ki_cpu.write_upper[j + 1]; + } + m68ki_cpu.write_data[8 - 1] = NULL; + m68ki_cpu.write_addr[8 - 1] = 0; + m68ki_cpu.write_upper[8 - 1] = 0; + m68ki_cpu.write_ranges--; + } + } +} + void m68k_clear_ranges() { printf("[MUSASHI] Clearing all reads/write memory ranges.\n");