From 9ae027f98614f2962636397a85c68155aba4e08c Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 1 Aug 2015 10:01:25 +0300 Subject: [PATCH] Improved autoconfig bank validation function. --- include/memory.h | 2 ++ memory.cpp | 59 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/include/memory.h b/include/memory.h index 0e0ebd43..f361655a 100644 --- a/include/memory.h +++ b/include/memory.h @@ -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); diff --git a/memory.cpp b/memory.cpp index ab89b463..56c22a4c 100644 --- a/memory.cpp +++ b/memory.cpp @@ -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); } -- 2.47.3