]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
DMA capable GUI support, force 16-bit memory option.
authorToni Wilen <twilen@winuae.net>
Sat, 21 Nov 2020 12:39:13 +0000 (14:39 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 21 Nov 2020 12:39:13 +0000 (14:39 +0200)
cfgfile.cpp
include/memory.h
include/options.h
memory.cpp
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/win32gui.cpp

index 2202a5636f8eef8d081cf46523512669ef75381c..206825dbd1a08f3434aae957732a22b79526f72e 100644 (file)
@@ -469,6 +469,15 @@ TCHAR *cfgfile_option_get(const TCHAR *s, const TCHAR *option)
        return cfgfile_option_find_it(s, option, true);
 }
 
+bool cfgfile_option_get_bool(const TCHAR* s, const TCHAR* option)
+{
+       TCHAR *d = cfgfile_option_find_it(s, option, true);
+       bool ret = d && (!_tcsicmp(d, _T("true")) || !_tcsicmp(d, _T("1")));
+       xfree(d);
+       return ret;
+}
+
+
 static void trimwsa (char *s)
 {
        /* Delete trailing whitespace.  */
@@ -1626,14 +1635,12 @@ static bool cfgfile_readramboard(const TCHAR *option, const TCHAR *value, const
                        if (s)
                                rb->product = (uae_u8)_tstol(s);
                        xfree(s);
-                       s = cfgfile_option_get(value, _T("no_reset_unmap"));
-                       if (s)
+                       if (cfgfile_option_get_bool(value, _T("no_reset_unmap")))
                                rb->no_reset_unmap = true;
-                       xfree(s);
-                       s = cfgfile_option_get(value, _T("nodma"));
-                       if (s)
+                       if (cfgfile_option_get_bool(value, _T("nodma")))
                                rb->nodma = true;
-                       xfree(s);
+                       if (cfgfile_option_get_bool(value, _T("force16bit")))
+                               rb->force16bit = true;
                        s = cfgfile_option_get(value, _T("data"));
                        if (s && _tcslen(s) >= 3 * 16 - 1) {
                                rb->autoconfig_inuse = true;
@@ -1756,6 +1763,12 @@ static void cfgfile_writeramboard(struct uae_prefs *prefs, struct zfile *f, cons
                _tcscpy(p, _T("nodma=true"));
                p += _tcslen(p);
        }
+       if (rb->force16bit) {
+               if (tmp2[0])
+                       *p++ = ',';
+               _tcscpy(p, _T("force16bit=true"));
+               p += _tcslen(p);
+       }
        if (rb->autoconfig_inuse) {
                uae_u8 *ac = rb->autoconfig;
                if (tmp2[0])
@@ -6099,7 +6112,7 @@ void cfgfile_compatibility_rtg(struct uae_prefs *p)
                                for (int j = i; j < MAX_RTG_BOARDS; j++) {
                                        rtgs[j] = 1;
                                        if (gfxboard_get_romtype(&p->rtgboards[j]) == romtype) {
-                                               TCHAR *romname = NULL;
+                                               const TCHAR *romname = NULL;
                                                if (romtype == ROMTYPE_PICASSOIV) {
                                                        romname = p->picassoivromfile;
                                                } else if (romtype == ROMTYPE_x86_VGA) {
index 32b515263e9d5110c80014dde8744839bd1d64c3..dfdc25d5811cb936e574622dbdb1f15e1f5b6f1c 100644 (file)
@@ -527,8 +527,8 @@ extern void set_roms_modified (void);
 extern void reload_roms(void);
 extern bool read_kickstart_version(struct uae_prefs *p);
 extern void chipmem_setindirect(void);
-extern void initramboard(addrbank * ab, struct ramboard* rb);
-extern void loadboardfile(addrbank * ab, struct boardloadfile* lf);
+extern void initramboard(addrbank *ab, struct ramboard *rb);
+extern void loadboardfile(addrbank *ab, struct boardloadfile *lf);
 
 uae_u32 memory_get_long(uaecptr);
 uae_u32 memory_get_word(uaecptr);
index b1374e12a8e2530eae2e00f5dbaf097ca6a79825..474f6ee67bb10c0d218c39a08b58ee1a16f9a951 100644 (file)
@@ -441,6 +441,7 @@ struct ramboard
        uae_u32 write_address;
        bool readonly;
        bool nodma;
+       bool force16bit;
        struct boardloadfile lf;
 };
 struct expansion_params
index 0af817b8091affc097c3dfab6f832b3994bcd2ef..9ac7756291857ecee3d0d35614f42ed779e482c0 100644 (file)
@@ -2376,6 +2376,20 @@ static void allocate_memory (void)
        cpuboard_init();
 }
 
+static void setmemorywidth(struct ramboard *mb, addrbank *ab)
+{
+       if (!ab || !ab->allocated_size)
+               return;
+       if (!mb->force16bit)
+               return;
+       for (int i = (ab->start >> 16); i < ((ab->start + ab->allocated_size) >> 16); i++) {
+               if (ce_banktype[i] == CE_MEMBANK_FAST32)
+                       ce_banktype[i] = CE_MEMBANK_FAST16;
+               if (ce_banktype[i] == CE_MEMBANK_CHIP32)
+                       ce_banktype[i] = CE_MEMBANK_CHIP16;
+       }
+}
+
 static void fill_ce_banks (void)
 {
        int i;
@@ -2434,10 +2448,20 @@ static void fill_ce_banks (void)
                        ce_banktype[i] = CE_MEMBANK_CHIP16;
        }
 
+       setmemorywidth(&currprefs.chipmem, &chipmem_bank);
+       setmemorywidth(&currprefs.bogomem, &bogomem_bank);
+       setmemorywidth(&currprefs.z3chipmem, &z3chipmem_bank);
+       setmemorywidth(&currprefs.mbresmem_low, &a3000lmem_bank);
+       for (int i = 0; i < MAX_RAM_BOARDS; i++) {
+               setmemorywidth(&currprefs.z3fastmem[i], &z3fastmem_bank[i]);
+               setmemorywidth(&currprefs.fastmem[i], &fastmem_bank[i]);
+       }
+
        if (currprefs.address_space_24) {
                for (i = 1; i < 256; i++)
                        memcpy(&ce_banktype[i * 256], &ce_banktype[0], 256);
        }
+
 }
 
 static int overlay_state;
@@ -3549,7 +3573,7 @@ static void REGPARAM2 empty_put(uaecptr addr, uae_u32 v)
 {
 }
 
-void loadboardfile(addrbank* ab, struct boardloadfile* lf)
+void loadboardfile(addrbank *ab, struct boardloadfile * lf)
 {
        if (!ab->baseaddr)
                return;
@@ -3575,7 +3599,7 @@ void loadboardfile(addrbank* ab, struct boardloadfile* lf)
        }
 }
 
-void initramboard(addrbank* ab, struct ramboard* rb)
+void initramboard(addrbank *ab, struct ramboard *rb)
 {
        ab->flags &= ~ABFLAG_NODMA;
        if (rb->nodma)
index 5492fb17949aa228ca2ec52f54bfe7b16fd0f56e..3396bafb512a53d548b924dcbf9e9a1f5f137cdf 100644 (file)
 #define IDC_STATENAME                   1811
 #define IDC_FASTMEMDMA                  1811
 #define IDC_SAMPLER_STEREO              1812
+#define IDC_FASTMEMFORCE16              1812
 #define IDC_LISTDIALOG_LIST             1813
 #define IDC_LOGPATH                     1814
 #define IDC_MIDIROUTER                  1815
index 5267657a538b392efaa7f3ad33da485e0ee70ce4..900490cee9ae3f6db85754fc8359844800609575 100644 (file)
@@ -248,16 +248,17 @@ BEGIN
     EDITTEXT        IDC_AUTOCONFIG_PRODUCT,196,194,45,13,ES_AUTOHSCROLL
     RTEXT           "Autoconfig data",IDC_STATIC,11,214,57,15,SS_CENTERIMAGE
     EDITTEXT        IDC_AUTOCONFIG_DATA,78,213,164,13,ES_AUTOHSCROLL
-    CONTROL         "Edit Autoconfig data",IDC_FASTMEMAUTOCONFIGUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,196,103,8
-    CONTROL         "Manual configuration",IDC_FASTMEMNOAUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,208,103,8
+    CONTROL         "Edit Autoconfig data",IDC_FASTMEMAUTOCONFIGUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,190,103,8
+    CONTROL         "Manual configuration",IDC_FASTMEMNOAUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,201,103,8
     RTEXT           "Memory board",IDC_STATIC,15,235,53,15,SS_CENTERIMAGE
     COMBOBOX        IDC_MEMORYBOARDSELECT,77,235,165,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Z3 mapping mode:",IDC_STATIC,263,234,115,15,SS_CENTERIMAGE
+    LTEXT           "Z3 mapping mode:",IDC_STATIC,263,236,115,15,SS_CENTERIMAGE
     RTEXT           "Address range",IDC_STATIC,10,256,57,15,SS_CENTERIMAGE
     EDITTEXT        IDC_RAM_ADDRESS,77,256,79,13,ES_AUTOHSCROLL
     EDITTEXT        IDC_RAM_ADDRESS2,164,256,79,13,ES_AUTOHSCROLL
     COMBOBOX        IDC_Z3MAPPING,262,256,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "DMA Capable",IDC_FASTMEMDMA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,220,103,8
+    CONTROL         "DMA Capable",IDC_FASTMEMDMA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,213,103,8
+    CONTROL         "Force 16-bit",IDC_FASTMEMFORCE16,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,225,103,8
 END
 
 IDD_CPU DIALOGEX 0, 0, 396, 316
@@ -1565,7 +1566,7 @@ BEGIN
 
     IDD_MEMORY, DIALOG
     BEGIN
-        BOTTOMMARGIN, 265
+        BOTTOMMARGIN, 284
     END
 
     IDD_CPU, DIALOG
index adac2f58e48a032613d8ddb211644c093b2b6825..dfdd878713c39cc4e58cff2a4a0509bde48826bc 100644 (file)
@@ -9337,7 +9337,7 @@ static int fastram_select;
 static uae_u32 *fastram_select_pointer;
 static const int *fastram_select_msi;
 static struct ramboard *fastram_select_ramboard;
-
+#define MAX_STANDARD_RAM_BOARDS 2
 
 static void enable_for_memorydlg (HWND hDlg)
 {
@@ -9360,14 +9360,15 @@ static void enable_for_memorydlg (HWND hDlg)
        ew (hDlg, IDC_Z3MAPPING, z3);
        ew (hDlg, IDC_FASTTEXT, true);
 
-       bool isfast = fastram_select < 2 * MAX_RAM_BOARDS && fastram_select_ramboard && fastram_select_ramboard->size;
+       bool isfast = fastram_select >= MAX_STANDARD_RAM_BOARDS && fastram_select < MAX_STANDARD_RAM_BOARDS + 2 * MAX_RAM_BOARDS && fastram_select_ramboard && fastram_select_ramboard->size;
        ew(hDlg, IDC_AUTOCONFIG_MANUFACTURER, isfast && !manual);
        ew(hDlg, IDC_AUTOCONFIG_PRODUCT, isfast && !manual);
        ew(hDlg, IDC_MEMORYBOARDSELECT, isfast);
        ew(hDlg, IDC_AUTOCONFIG_DATA,  ac && size);
        ew(hDlg, IDC_FASTMEMAUTOCONFIGUSE, isfast);
        ew(hDlg, IDC_FASTMEMNOAUTOCONFIG, isfast);
-       ew(hDlg, IDC_FASTMEMDMA, isfast);
+       ew(hDlg, IDC_FASTMEMDMA, true);
+       ew(hDlg, IDC_FASTMEMFORCE16, true);
        ew(hDlg, IDC_MEMORYRAM, true);
        ew(hDlg, IDC_MEMORYMEM, true);
        ew(hDlg, IDC_RAM_ADDRESS, manual && size);
@@ -9391,6 +9392,96 @@ static void setfastram_ramboard(HWND hDlg, int zram)
        }
 }
 
+static int getmemsize(uae_u32 size, const int *msi)
+{
+       int mem_size = 0;
+       if (msi == msi_fast) {
+               switch (size)
+               {
+               case 0x00000000: mem_size = 0; break;
+               case 0x00010000: mem_size = 1; break;
+               case 0x00020000: mem_size = 2; break;
+               case 0x00040000: mem_size = 3; break;
+               case 0x00080000: mem_size = 4; break;
+               case 0x00100000: mem_size = 5; break;
+               case 0x00200000: mem_size = 6; break;
+               case 0x00400000: mem_size = 7; break;
+               case 0x00800000: mem_size = 8; break;
+               case 0x01000000: mem_size = 9; break;
+               }
+       }
+       else if (msi == msi_chip) {
+               switch (size)
+               {
+               case 0x00040000: mem_size = 0; break;
+               case 0x00080000: mem_size = 1; break;
+               case 0x00100000: mem_size = 2; break;
+               case 0x00180000: mem_size = 3; break;
+               case 0x00200000: mem_size = 4; break;
+               case 0x00400000: mem_size = 5; break;
+               case 0x00800000: mem_size = 6; break;
+               }
+       }
+       else if (msi == msi_bogo) {
+               switch (size)
+               {
+               case 0x00000000: mem_size = 0; break;
+               case 0x00080000: mem_size = 1; break;
+               case 0x00100000: mem_size = 2; break;
+               case 0x00180000: mem_size = 3; break;
+               case 0x001C0000: mem_size = 4; break;
+               }
+       }
+       else {
+               if (size < 0x00100000)
+                       mem_size = 0;
+               else if (size < 0x00200000)
+                       mem_size = 1;
+               else if (size < 0x00400000)
+                       mem_size = 2;
+               else if (size < 0x00800000)
+                       mem_size = 3;
+               else if (size < 0x01000000)
+                       mem_size = 4;
+               else if (size < 0x02000000)
+                       mem_size = 5;
+               else if (size < 0x04000000)
+                       mem_size = 6;
+               else if (size < 0x08000000)
+                       mem_size = 7;
+               else if (size < 0x10000000)
+                       mem_size = 8;
+               else if (size < 0x20000000)
+                       mem_size = 9;
+               else if (size < 0x40000000)
+                       mem_size = 10;
+               else // 1GB
+                       mem_size = 11;
+       }
+       return mem_size;
+}
+
+static void addadvancedram(HWND hDlg, struct ramboard *rb, const TCHAR *name)
+{
+       const int* msi;
+       TCHAR tmp[200];
+       _tcscpy(tmp, name);
+       if (rb == &workprefs.chipmem) {
+               msi = msi_chip;
+       } else if (rb == &workprefs.bogomem) {
+               msi = msi_bogo;
+       } else if (rb == &workprefs.z3chipmem) {
+               msi = msi_z3chip;
+       } else {
+               return;
+       }
+       if (rb->size) {
+               int mem_size = getmemsize(rb->size, msi);
+               _tcscat(tmp, _T(" "));
+               _tcscat(tmp, memsize_names[msi[mem_size]]);
+       }
+       SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
+}
 
 static void setfastram_selectmenu(HWND hDlg, int mode)
 {
@@ -9402,77 +9493,58 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
        struct ramboard *fastram_select_ramboard_old = fastram_select_ramboard;
 
        fastram_select_ramboard = NULL;
-       if (fastram_select < MAX_RAM_BOARDS) {
+       if (fastram_select == 0) {
+               min = 0;
+               max = MAX_CHIP_MEM;
+               msi = msi_chip;
+               fastram_select_pointer = &workprefs.chipmem.size;
+               fastram_select_ramboard = &workprefs.chipmem;
+       } else if (fastram_select == 1) {
+               min = 0;
+               max = MAX_SLOW_MEM;
+               msi = msi_bogo;
+               fastram_select_pointer = &workprefs.bogomem.size;
+               fastram_select_ramboard = &workprefs.bogomem;
+       } else if (fastram_select < MAX_STANDARD_RAM_BOARDS + MAX_RAM_BOARDS) {
                msi = msi_fast;
                min = MIN_FAST_MEM;
                max = MAX_FAST_MEM;
-               fastram_select_ramboard = &workprefs.fastmem[fastram_select];
+               fastram_select_ramboard = &workprefs.fastmem[fastram_select - MAX_STANDARD_RAM_BOARDS];
                fastram_select_pointer = &fastram_select_ramboard->size;
                zram = 2;
-       } else if (fastram_select >= MAX_RAM_BOARDS && fastram_select < MAX_RAM_BOARDS * 2) {
+       } else if (fastram_select >= MAX_STANDARD_RAM_BOARDS + MAX_RAM_BOARDS && fastram_select < MAX_STANDARD_RAM_BOARDS + MAX_RAM_BOARDS * 2) {
                msi = msi_z3fast;
                min = MIN_Z3_MEM;
                max = MAX_Z3_MEM;
-               fastram_select_ramboard = &workprefs.z3fastmem[fastram_select - MAX_RAM_BOARDS];
+               fastram_select_ramboard = &workprefs.z3fastmem[fastram_select - (MAX_RAM_BOARDS + MAX_STANDARD_RAM_BOARDS)];
                fastram_select_pointer = &fastram_select_ramboard->size;
                zram = 3;
-       } else if (fastram_select == 2 * MAX_RAM_BOARDS) {
+       } else if (fastram_select == MAX_STANDARD_RAM_BOARDS + 2 * MAX_RAM_BOARDS) {
                min = 0;
                max = MAX_CB_MEM_128M;
                msi = msi_cpuboard;
                fastram_select_pointer = &workprefs.mbresmem_high.size;
-       } else if (fastram_select == 2 * MAX_RAM_BOARDS + 1) {
+               fastram_select_ramboard = &workprefs.mbresmem_high;
+       } else if (fastram_select == MAX_STANDARD_RAM_BOARDS + 2 * MAX_RAM_BOARDS + 1) {
                min = 0;
                max = MAX_CB_MEM_64M;
                msi = msi_cpuboard;
                fastram_select_pointer = &workprefs.mbresmem_low.size;
+               fastram_select_ramboard = &workprefs.mbresmem_low;
+       } else if (fastram_select == MAX_STANDARD_RAM_BOARDS + 2 * MAX_RAM_BOARDS + 2) {
+               min = 0;
+               max = MAX_Z3_CHIPMEM;
+               msi = msi_z3chip;
+               fastram_select_pointer = &workprefs.z3chipmem.size;
+               fastram_select_ramboard = &workprefs.z3chipmem;
        } else {
                return;
        }
 
        fastram_select_msi = msi;
        uae_u32 v = *fastram_select_pointer;
-       int mem_size = 0;
-       if (msi == msi_fast) {
-               switch (v)
-               {
-               case 0x00000000: mem_size = 0; break;
-               case 0x00010000: mem_size = 1; break;
-               case 0x00020000: mem_size = 2; break;
-               case 0x00040000: mem_size = 3; break;
-               case 0x00080000: mem_size = 4; break;
-               case 0x00100000: mem_size = 5; break;
-               case 0x00200000: mem_size = 6; break;
-               case 0x00400000: mem_size = 7; break;
-               case 0x00800000: mem_size = 8; break;
-               case 0x01000000: mem_size = 9; break;
-               }
-       } else {
-               if (v < 0x00100000)
-                       mem_size = 0;
-               else if (v < 0x00200000)
-                       mem_size = 1;
-               else if (v < 0x00400000)
-                       mem_size = 2;
-               else if (v < 0x00800000)
-                       mem_size = 3;
-               else if (v < 0x01000000)
-                       mem_size = 4;
-               else if (v < 0x02000000)
-                       mem_size = 5;
-               else if (v < 0x04000000)
-                       mem_size = 6;
-               else if (v < 0x08000000)
-                       mem_size = 7;
-               else if (v < 0x10000000)
-                       mem_size = 8;
-               else if (v < 0x20000000)
-                       mem_size = 9;
-               else if (v < 0x40000000)
-                       mem_size = 10;
-               else // 1GB
-                       mem_size = 11;
-       }
+       int mem_size = getmemsize(v, msi);
+
        SendDlgItemMessage(hDlg, IDC_MEMORYMEM, TBM_SETRANGE, TRUE, MAKELONG(min, max));
        SendDlgItemMessage(hDlg, IDC_MEMORYMEM, TBM_SETPOS, TRUE, mem_size);
        SetDlgItemText(hDlg, IDC_MEMORYRAM, memsize_names[msi[mem_size]]);
@@ -9482,6 +9554,7 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
        setchecked(hDlg, IDC_FASTMEMAUTOCONFIGUSE, rb && rb->autoconfig_inuse);
        setchecked(hDlg, IDC_FASTMEMNOAUTOCONFIG, rb && rb->manual_config);
        setchecked(hDlg, IDC_FASTMEMDMA, rb && rb->nodma == 0);
+       setchecked(hDlg, IDC_FASTMEMFORCE16, rb && rb->force16bit != 0);
        if (rb) {
                if (rb->manual_config) {
                        if (rb->end_address <= rb->start_address || rb->start_address + rb->size < rb->end_address)
@@ -9507,22 +9580,24 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
                                ew(hDlg, IDC_MEMORYBOARDSELECT, FALSE);
                        }
                }
-
-               struct autoconfig_info *aci = expansion_get_autoconfig_info(&workprefs, fastram_select < MAX_RAM_BOARDS ? ROMTYPE_RAMZ2 : ROMTYPE_RAMZ3, fastram_select % MAX_RAM_BOARDS);
-               if (!rb->autoconfig_inuse) {
-                       if (aci) {
-                               memcpy(rb->autoconfig, aci->autoconfig_bytes, sizeof rb->autoconfig);
-                       }
-                       if (rb->manufacturer) {
-                               rb->autoconfig[1] = rb->product;
-                               rb->autoconfig[4] = (rb->manufacturer >> 8) & 0xff;
-                               rb->autoconfig[5] = rb->manufacturer & 0xff;
-                       } else {
-                               memset(rb->autoconfig, 0, sizeof rb->autoconfig);
-                               aci = expansion_get_autoconfig_info(&workprefs, fastram_select < MAX_RAM_BOARDS ? ROMTYPE_RAMZ2 : ROMTYPE_RAMZ3, fastram_select % MAX_RAM_BOARDS);
+               struct autoconfig_info* aci = NULL;
+               if (fastram_select >= MAX_STANDARD_RAM_BOARDS && fastram_select < MAX_STANDARD_RAM_BOARDS + 2 * MAX_RAM_BOARDS) {
+                       aci = expansion_get_autoconfig_info(&workprefs, fastram_select < MAX_STANDARD_RAM_BOARDS + MAX_RAM_BOARDS ? ROMTYPE_RAMZ2 : ROMTYPE_RAMZ3, fastram_select % MAX_RAM_BOARDS);
+                       if (!rb->autoconfig_inuse) {
                                if (aci) {
                                        memcpy(rb->autoconfig, aci->autoconfig_bytes, sizeof rb->autoconfig);
                                }
+                               if (rb->manufacturer) {
+                                       rb->autoconfig[1] = rb->product;
+                                       rb->autoconfig[4] = (rb->manufacturer >> 8) & 0xff;
+                                       rb->autoconfig[5] = rb->manufacturer & 0xff;
+                               } else {
+                                       memset(rb->autoconfig, 0, sizeof rb->autoconfig);
+                                       aci = expansion_get_autoconfig_info(&workprefs, fastram_select < MAX_RAM_BOARDS ? ROMTYPE_RAMZ2 : ROMTYPE_RAMZ3, fastram_select% MAX_RAM_BOARDS);
+                                       if (aci) {
+                                               memcpy(rb->autoconfig, aci->autoconfig_bytes, sizeof rb->autoconfig);
+                                       }
+                               }
                        }
                }
                if (mode != 3) {
@@ -9581,6 +9656,8 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
        }
 
        SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_RESETCONTENT, 0, 0);
+       addadvancedram(hDlg, &workprefs.chipmem, _T("Chip RAM"));
+       addadvancedram(hDlg, &workprefs.bogomem, _T("Slow RAM"));
        for (int i = 0; i < MAX_RAM_BOARDS; i++) {
                struct autoconfig_info *aci = expansion_get_autoconfig_info(&workprefs, ROMTYPE_RAMZ2, i);
                _stprintf(tmp, _T("Z2 Fast Ram #%d"), i + 1);
@@ -9606,16 +9683,11 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
                        }
                        SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
                }
-               _tcscpy(tmp, _T("Processor Slot Fast RAM"));
-               if (workprefs.mbresmem_high.size)
-                       _stprintf(tmp + _tcslen(tmp), _T(" [%dM]"), workprefs.mbresmem_high.size / (1024 * 1024));
-               SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
-               _tcscpy(tmp, _T("Motherboard Fast RAM"));
-               if (workprefs.mbresmem_low.size)
-                       _stprintf(tmp + _tcslen(tmp), _T(" [%dM]"), workprefs.mbresmem_low.size / (1024 * 1024));
-               SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
+               addadvancedram(hDlg, &workprefs.mbresmem_high, _T("Processor Slot Fast RAM"));
+               addadvancedram(hDlg, &workprefs.mbresmem_low, _T("Motherboard Fast RAM"));
+               addadvancedram(hDlg, &workprefs.z3chipmem, _T("32-bit Chip RAM"));
        } else {
-               if (fastram_select >= MAX_RAM_BOARDS)
+               if (fastram_select >= MAX_STANDARD_RAM_BOARDS + MAX_RAM_BOARDS)
                        fastram_select = 0;
        }
        SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_SETCURSEL, fastram_select, 0);
@@ -11554,6 +11626,14 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA
                                        rb->nodma = ischecked(hDlg, IDC_FASTMEMDMA) == 0;
                                        setfastram_selectmenu(hDlg, 0);
                                }
+                               break;
+                       case IDC_FASTMEMFORCE16:
+                               if (fastram_select_ramboard) {
+                                       struct ramboard* rb = fastram_select_ramboard;
+                                       rb->force16bit = ischecked(hDlg, IDC_FASTMEMFORCE16) != 0;
+                                       setfastram_selectmenu(hDlg, 0);
+                               }
+                               break;
                        case IDC_FASTMEMAUTOCONFIGUSE:
                                if (fastram_select_ramboard) {
                                        struct ramboard* rb = fastram_select_ramboard;
@@ -11562,7 +11642,7 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA
                                        setfastram_selectmenu(hDlg, 0);
                                }
                                break;
-                               case IDC_FASTMEMNOAUTOCONFIG:
+                       case IDC_FASTMEMNOAUTOCONFIG:
                                if (fastram_select_ramboard) {
                                        struct ramboard *rb = fastram_select_ramboard;
                                        rb->manual_config = ischecked(hDlg, IDC_FASTMEMNOAUTOCONFIG);