]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
custom memory bank allocation change to support aros rom on the fly changes.
authorToni Wilen <twilen@winuae.net>
Sat, 23 Mar 2019 15:36:26 +0000 (17:36 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 23 Mar 2019 15:36:26 +0000 (17:36 +0200)
memory.cpp

index 4edd41f8906c11e10e5559eda83a883000b28ac3..86362f2aeb341a261d74d31709e23dc54c02bfe7 100644 (file)
@@ -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) {