]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Improved 1.5 M Chip RAM support.
authorToni Wilen <twilen@winuae.net>
Sun, 12 Feb 2023 16:07:15 +0000 (18:07 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 12 Feb 2023 16:07:15 +0000 (18:07 +0200)
memory.cpp

index 5f4455b62e5e6dc372565bcf02720c1b5fb6f6be..d560efc12a48dc95ef79b15817688c3be621cfbd 100644 (file)
@@ -621,6 +621,82 @@ static void REGPARAM2 chipmem_bput_ce2 (uaecptr addr, uae_u32 b)
 
 #endif
 
+static uae_u32 chipmem_noise(uae_u32 addr)
+{
+       // not yet implemented
+       return 0;
+}
+
+static uae_u32 REGPARAM2 chipmem_lget_limit(uaecptr addr)
+{
+       uae_u32 *m;
+
+       addr &= chipmem_bank.mask;
+       if (addr >= 0x180000 - 3) {
+               return chipmem_noise(addr);
+       }
+       m = (uae_u32 *)(chipmem_bank.baseaddr + addr);
+       return do_get_mem_long(m);
+}
+
+static uae_u32 REGPARAM2 chipmem_wget_limit(uaecptr addr)
+{
+       uae_u16 *m, v;
+
+       addr &= chipmem_bank.mask;
+       if (addr >= 0x180000 - 1) {
+               return chipmem_noise(addr);
+       }
+       m = (uae_u16 *)(chipmem_bank.baseaddr + addr);
+       v = do_get_mem_word(m);
+       return v;
+}
+
+static uae_u32 REGPARAM2 chipmem_bget_limit(uaecptr addr)
+{
+       uae_u8 v;
+       addr &= chipmem_bank.mask;
+       if (addr >= 0x180000) {
+               return chipmem_noise(addr);
+       }
+       v = chipmem_bank.baseaddr[addr];
+       return v;
+}
+
+void REGPARAM2 chipmem_lput_limit(uaecptr addr, uae_u32 l)
+{
+       uae_u32 *m;
+
+       addr &= chipmem_bank.mask;
+       if (addr >= 0x180000) {
+               return;
+       }
+       m = (uae_u32 *)(chipmem_bank.baseaddr + addr);
+       do_put_mem_long(m, l);
+}
+
+void REGPARAM2 chipmem_wput_limit(uaecptr addr, uae_u32 w)
+{
+       uae_u16 *m;
+
+       addr &= chipmem_bank.mask;
+       if (addr >= 0x180000) {
+               return;
+       }
+       m = (uae_u16 *)(chipmem_bank.baseaddr + addr);
+       do_put_mem_word(m, w);
+}
+
+void REGPARAM2 chipmem_bput_limit(uaecptr addr, uae_u32 b)
+{
+       addr &= chipmem_bank.mask;
+       if (addr >= 0x180000) {
+               return;
+       }
+       chipmem_bank.baseaddr[addr] = b;
+}
+
+
 static uae_u32 REGPARAM2 chipmem_lget (uaecptr addr)
 {
        uae_u32 *m;
@@ -702,12 +778,6 @@ static uae_u32 REGPARAM2 chipmem_dummy_lget (uaecptr addr)
        return (chipmem_dummy () << 16) | chipmem_dummy ();
 }
 
-static uae_u32 chipmem_noise(uae_u32 addr)
-{
-       // not yet implemented
-       return 0;
-}
-
 static uae_u32 REGPARAM2 chipmem_agnus_lget (uaecptr addr)
 {
        uae_u32 *m;
@@ -901,6 +971,22 @@ void chipmem_setindirect(void)
                chipmem_check_indirect = chipmem_check;
                chipmem_xlate_indirect = chipmem_xlate;
        }
+
+       if (currprefs.chipmem.size == 0x180000) {
+               chipmem_bank.bget = chipmem_bget_limit;
+               chipmem_bank.wget = chipmem_wget_limit;
+               chipmem_bank.lget = chipmem_lget_limit;
+               chipmem_bank.bput = chipmem_bput_limit;
+               chipmem_bank.wput = chipmem_wput_limit;
+               chipmem_bank.lput = chipmem_lput_limit;
+       } else {
+               chipmem_bank.bget = chipmem_bget;
+               chipmem_bank.wget = chipmem_wget;
+               chipmem_bank.lget = chipmem_lget;
+               chipmem_bank.bput = chipmem_bput;
+               chipmem_bank.wput = chipmem_wput;
+               chipmem_bank.lput = chipmem_lput;
+       }
 }
 
 /* Slow memory */
@@ -2289,10 +2375,13 @@ static void allocate_memory (void)
                memsize = chipmem_bank.reserved_size = chipmem_full_size = currprefs.chipmem.size;
                chipmem_full_mask = chipmem_bank.mask = chipmem_bank.reserved_size - 1;
                chipmem_bank.start = chipmem_start_addr;
-               if (!currprefs.cachesize && memsize < 0x100000)
+               if (!currprefs.cachesize && memsize < 0x100000) {
                        memsize = 0x100000;
-               if (memsize > 0x100000 && memsize < 0x200000)
+               }
+               if (memsize == 0x180000) {
                        memsize = 0x200000;
+                       chipmem_full_mask = chipmem_bank.mask = memsize - 1;
+               }
                chipmem_bank.reserved_size = memsize;
                mapped_malloc (&chipmem_bank);
                chipmem_bank.reserved_size = currprefs.chipmem.size;
@@ -2306,16 +2395,14 @@ static void allocate_memory (void)
                                memset (chipmem_bank.baseaddr + chipmem_bank.allocated_size, 0xff, memsize - chipmem_bank.allocated_size);
                }
                currprefs.chipset_mask = changed_prefs.chipset_mask;
-               chipmem_full_mask = chipmem_bank.allocated_size - 1;
-               if (!currprefs.cachesize) {
-                       if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) {
-                               if (chipmem_bank.allocated_size < 0x100000)
-                                       chipmem_full_mask = 0x100000 - 1;
-                               if (chipmem_bank.allocated_size > 0x100000 && chipmem_bank.allocated_size < 0x200000)
-                                       chipmem_full_mask = chipmem_bank.mask = 0x200000 - 1;
-                       } else if (currprefs.cs_1mchipjumper) {
+               if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) {
+                       if (chipmem_bank.allocated_size < 0x100000)
+                               chipmem_full_mask = 0x100000 - 1;
+                       if (currprefs.cs_1mchipjumper) {
                                chipmem_full_mask = 0x80000 - 1;
                        }
+               } else {
+                       chipmem_full_mask = 0x80000 - 1;
                }
        }
 
@@ -2327,6 +2414,10 @@ static void allocate_memory (void)
                }
        }
 
+       if (currprefs.cachesize) {
+               chipmem_full_mask = chipmem_bank.mask = chipmem_bank.allocated_size - 1;
+       }
+
        if (bogomem_bank.reserved_size != currprefs.bogomem.size || bogoreset) {
                if (!(bogomem_bank.reserved_size == 0x200000 && currprefs.bogomem.size == 0x180000)) {
                        mapped_free (&bogomem_bank);