]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Improved autoconfig bank validation function.
authorToni Wilen <twilen@winuae.net>
Sat, 1 Aug 2015 07:01:25 +0000 (10:01 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 1 Aug 2015 07:01:25 +0000 (10:01 +0300)
include/memory.h
memory.cpp

index 0e0ebd432313f4d00e33c9ada23e41fa8e6eb808..f361655a7f7b925c837c4d13ac749ce529aaae6e 100644 (file)
@@ -413,6 +413,8 @@ extern void memory_cleanup (void);
 extern void map_banks (addrbank *bank, int first, int count, int realsize);
 extern void map_banks_z2(addrbank *bank, int first, int count);
 extern void map_banks_z3(addrbank *bank, int first, int count);
+extern bool validate_banks_z2(addrbank *bank, int start, int size);
+extern bool validate_banks_z3(addrbank *bank, int start, int size);
 extern void map_banks_quick (addrbank *bank, int first, int count, int realsize);
 extern void map_banks_nojitdirect (addrbank *bank, int first, int count, int realsize);
 extern void map_banks_cond (addrbank *bank, int first, int count, int realsize);
index ab89b4631dec94305fadf92cc8b4fdcfa01e1b7e..56c22a4c714be7fd84c39015a000d09db4542ea7 100644 (file)
@@ -2881,41 +2881,74 @@ void map_banks (addrbank *bank, int start, int size, int realsize)
 #endif
 }
 
-void map_banks_z3(addrbank *bank, int start, int size)
+bool validate_banks_z3(addrbank *bank, int start, int size)
 {
-       if (start < 0x1000 || size <= 0 || size > 0x4000 || start + size > 0xf000) {
-               write_log(_T("Z3 invalid map_banks start=%08x size=%08x\n"), start, size);
+       if (start < 0x1000 || size <= 0) {
+               error_log(_T("Z3 invalid map_banks(%s) start=%08x size=%08x\n"), bank->name, start << 16, size << 16);
                cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
-               return;
+               return false;
+       }
+       if (size > 0x4000 || start + size > 0xf000) {
+               error_log(_T("Z3 invalid map_banks(%s) start=%08x size=%08x\n"), bank->name, start << 16, size << 16);
+               return false;
+       }
+       for (int i = start; i < start + size; i++) {
+               addrbank *ab = &get_mem_bank(start << 16);
+               if (ab != &dummy_bank && ab != bank) {
+                       error_log(_T("Z3 map_banks(%s) attempting to override existing memory bank '%s' at %08x!\n"), bank->name, ab->name, i << 16);
+                       return false;
+               }
        }
+       return true;
+}
+
+void map_banks_z3(addrbank *bank, int start, int size)
+{
+       if (!validate_banks_z3(bank, start, size))
+               return;
        map_banks(bank, start, size, 0);
 }
 
-void map_banks_z2 (addrbank *bank, int start, int size)
+bool validate_banks_z2(addrbank *bank, int start, int size)
 {
        if (start < 0x20 || (start >= 0xa0 && start < 0xe9) || start >= 0xf0) {
-               write_log(_T("Z2 map_banks with invalid start address %08X\n"), start << 16);
+               error_log(_T("Z2 map_banks(%s) with invalid start address %08X\n"), bank->name, start << 16);
                cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
-               return;
+               return false;
        }
        if (start >= 0xe9) {
                if (start + size > 0xf0) {
-                       write_log(_T("Z2 map_banks with invalid region %08x - %08X\n"), start << 16, (start + size) << 16);
+                       error_log(_T("Z2 map_banks(%s) with invalid region %08x - %08X\n"), bank->name, start << 16, (start + size) << 16);
                        cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
-                       return;
+                       return false;
                }
        } else {
                if (start + size > 0xa0) {
-                       write_log(_T("Z2 map_banks with invalid region %08x - %08X\n"), start << 16, (start + size) << 16);
+                       error_log(_T("Z2 map_banks(%s) with invalid region %08x - %08X\n"), bank->name, start << 16, (start + size) << 16);
                        cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
-                       return;
+                       return false;
                }
        }
        if (size <= 0 || size > 0x80) {
-               write_log(_T("Z2 map_banks with invalid size %08x\n"), size);
+               error_log(_T("Z2 map_banks(%s) with invalid size %08x\n"), size);
                cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
-               return;
+               return false;
+       }
+       for (int i = start; i < start + size; i++) {
+               addrbank *ab = &get_mem_bank(start << 16);
+               if (ab != &dummy_bank) {
+                       error_log(_T("Z2 map_banks(%s) attempting to override existing memory bank '%s' at %08x!\n"), bank->name, ab->name, i << 16);
+                       return false;
+               }
        }
+       return true;
+}
+
+
+void map_banks_z2 (addrbank *bank, int start, int size)
+{
+       if (!validate_banks_z2(bank, start, size))
+               return;
        map_banks (bank, start, size, 0);
 }