]> git.sesse.net Git - pistorm/blobdiff - m68kcpu.c
Add Meson build files.
[pistorm] / m68kcpu.c
index 1068f264440ef2ca82bdc6c2d8935cc7b5c05c3a..5b494ad58d8c913563e441d322a0e4eac4ac0eb9 100644 (file)
--- 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");