From d92c9768e61d6813d7606c9f2d732ec3d79b5275 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 23 Mar 2019 17:36:26 +0200 Subject: [PATCH] custom memory bank allocation change to support aros rom on the fly changes. --- memory.cpp | 164 ++++++++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 78 deletions(-) diff --git a/memory.cpp b/memory.cpp index 4edd41f8..86362f2a 100644 --- a/memory.cpp +++ b/memory.cpp @@ -1295,6 +1295,38 @@ addrbank custmem2_bank = { ABFLAG_RAM | ABFLAG_THREADSAFE | ABFLAG_CACHE_ENABLE_ALL | ABFLAG_DIRECTACCESS, 0, 0 }; +static bool singlebit(uae_u32 v) +{ + while (v && !(v & 1)) + v >>= 1; + return (v & ~1) == 0; +} + +static void allocate_memory_custombanks(void) +{ + if (custmem1_bank.reserved_size != currprefs.custom_memory_sizes[0]) { + mapped_free(&custmem1_bank); + custmem1_bank.reserved_size = currprefs.custom_memory_sizes[0]; + // custmem1 and 2 can have non-power of 2 size so only set correct mask if size is power of 2. + custmem1_bank.mask = singlebit(custmem1_bank.reserved_size) ? custmem1_bank.reserved_size - 1 : -1; + custmem1_bank.start = currprefs.custom_memory_addrs[0]; + if (custmem1_bank.reserved_size) { + if (!mapped_malloc(&custmem1_bank)) + custmem1_bank.reserved_size = 0; + } + } + if (custmem2_bank.reserved_size != currprefs.custom_memory_sizes[1]) { + mapped_free(&custmem2_bank); + custmem2_bank.reserved_size = currprefs.custom_memory_sizes[1]; + custmem2_bank.mask = singlebit(custmem2_bank.reserved_size) ? custmem2_bank.reserved_size - 1 : -1; + custmem2_bank.start = currprefs.custom_memory_addrs[1]; + if (custmem2_bank.reserved_size) { + if (!mapped_malloc(&custmem2_bank)) + custmem2_bank.reserved_size = 0; + } + } +} + #define fkickmem_size ROM_SIZE_512 static int a3000_f0; void a3000_fakekick (int map) @@ -1549,6 +1581,58 @@ static bool load_extendedkickstart (const TCHAR *romextfile, int type) return ret; } + +extern unsigned char arosrom[]; +extern unsigned int arosrom_len; +extern int seriallog; +static bool load_kickstart_replacement(void) +{ + struct zfile *f; + f = zfile_fopen_data(_T("aros.gz"), arosrom_len, arosrom); + if (!f) + return false; + f = zfile_gunzip(f); + if (!f) + return false; + + extendedkickmem_bank.reserved_size = ROM_SIZE_512; + extendedkickmem_bank.mask = ROM_SIZE_512 - 1; + extendedkickmem_bank.label = _T("rom_e0"); + extendedkickmem_type = EXTENDED_ROM_KS; + mapped_malloc(&extendedkickmem_bank); + read_kickstart(f, extendedkickmem_bank.baseaddr, ROM_SIZE_512, 0, 1); + + + kickmem_bank.reserved_size = ROM_SIZE_512; + kickmem_bank.mask = ROM_SIZE_512 - 1; + read_kickstart(f, kickmem_bank.baseaddr, ROM_SIZE_512, 1, 0); + + zfile_fclose(f); + + seriallog = -1; + + // if 68000-68020 config without any other fast ram with m68k aros: enable special extra RAM. + if (currprefs.cpu_model <= 68020 && + currprefs.cachesize == 0 && + currprefs.fastmem[0].size == 0 && + currprefs.z3fastmem[0].size == 0 && + currprefs.mbresmem_high_size == 0 && + currprefs.mbresmem_low_size == 0 && + currprefs.cpuboardmem1_size == 0) { + + changed_prefs.custom_memory_addrs[0] = currprefs.custom_memory_addrs[0] = 0xa80000; + changed_prefs.custom_memory_sizes[0] = currprefs.custom_memory_sizes[0] = 512 * 1024; + changed_prefs.custom_memory_mask[0] = currprefs.custom_memory_mask[0] = 0; + changed_prefs.custom_memory_addrs[1] = currprefs.custom_memory_addrs[1] = 0xb00000; + changed_prefs.custom_memory_sizes[1] = currprefs.custom_memory_sizes[1] = 512 * 1024; + changed_prefs.custom_memory_mask[1] = currprefs.custom_memory_mask[1] = 0; + + allocate_memory_custombanks(); + } + + return true; +} + static int patch_shapeshifter (uae_u8 *kickmemory) { /* Patch Kickstart ROM for ShapeShifter - from Christian Bauer. @@ -1623,56 +1707,6 @@ static void patch_kick (void) kickstart_fix_checksum (kickmem_bank.baseaddr, kickmem_bank.allocated_size); } -extern unsigned char arosrom[]; -extern unsigned int arosrom_len; -extern int seriallog; -static bool load_kickstart_replacement (void) -{ - struct zfile *f; - f = zfile_fopen_data (_T("aros.gz"), arosrom_len, arosrom); - if (!f) - return false; - f = zfile_gunzip (f); - if (!f) - return false; - - extendedkickmem_bank.reserved_size = ROM_SIZE_512; - extendedkickmem_bank.mask = ROM_SIZE_512 - 1; - extendedkickmem_bank.label = _T("rom_e0"); - extendedkickmem_type = EXTENDED_ROM_KS; - mapped_malloc (&extendedkickmem_bank); - read_kickstart (f, extendedkickmem_bank.baseaddr, ROM_SIZE_512, 0, 1); - - - kickmem_bank.reserved_size = ROM_SIZE_512; - kickmem_bank.mask = ROM_SIZE_512 - 1; - read_kickstart (f, kickmem_bank.baseaddr, ROM_SIZE_512, 1, 0); - - zfile_fclose (f); - - seriallog = -1; - - // if 68000-68020 config without any other fast ram with m68k aros: enable special extra RAM. - if (currprefs.cpu_model <= 68020 && - currprefs.cachesize == 0 && - currprefs.fastmem[0].size == 0 && - currprefs.z3fastmem[0].size == 0 && - currprefs.mbresmem_high_size == 0 && - currprefs.mbresmem_low_size == 0 && - currprefs.cpuboardmem1_size == 0) { - - changed_prefs.custom_memory_addrs[0] = currprefs.custom_memory_addrs[0] = 0xa80000; - changed_prefs.custom_memory_sizes[0] = currprefs.custom_memory_sizes[0] = 512 * 1024; - changed_prefs.custom_memory_mask[0] = currprefs.custom_memory_mask[0] = 0; - changed_prefs.custom_memory_addrs[1] = currprefs.custom_memory_addrs[1] = 0xb00000; - changed_prefs.custom_memory_sizes[1] = currprefs.custom_memory_sizes[1] = 512 * 1024; - changed_prefs.custom_memory_mask[1] = currprefs.custom_memory_mask[1] = 0; - - } - - return true; -} - static struct zfile *get_kickstart_filehandle(struct uae_prefs *p) { struct zfile *f; @@ -2109,13 +2143,6 @@ static void init_mem_banks (void) #endif } -static bool singlebit (uae_u32 v) -{ - while (v && !(v & 1)) - v >>= 1; - return (v & ~1) == 0; -} - static void allocate_memory (void) { bogomem_aliasing = 0; @@ -2306,27 +2333,8 @@ static void allocate_memory (void) } need_hardreset = true; } - if (custmem1_bank.reserved_size != currprefs.custom_memory_sizes[0]) { - mapped_free (&custmem1_bank); - custmem1_bank.reserved_size = currprefs.custom_memory_sizes[0]; - // custmem1 and 2 can have non-power of 2 size so only set correct mask if size is power of 2. - custmem1_bank.mask = singlebit (custmem1_bank.reserved_size) ? custmem1_bank.reserved_size - 1 : -1; - custmem1_bank.start = currprefs.custom_memory_addrs[0]; - if (custmem1_bank.reserved_size) { - if (!mapped_malloc (&custmem1_bank)) - custmem1_bank.reserved_size = 0; - } - } - if (custmem2_bank.reserved_size != currprefs.custom_memory_sizes[1]) { - mapped_free (&custmem2_bank); - custmem2_bank.reserved_size = currprefs.custom_memory_sizes[1]; - custmem2_bank.mask = singlebit (custmem2_bank.reserved_size) ? custmem2_bank.reserved_size - 1 : -1; - custmem2_bank.start = currprefs.custom_memory_addrs[1]; - if (custmem2_bank.reserved_size) { - if (!mapped_malloc (&custmem2_bank)) - custmem2_bank.reserved_size = 0; - } - } + + allocate_memory_custombanks(); if (savestate_state == STATE_RESTORE) { if (bootrom_filepos) { -- 2.47.3