]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
3200b1
authorToni Wilen <twilen@winuae.net>
Fri, 26 Jun 2015 15:55:05 +0000 (18:55 +0300)
committerToni Wilen <twilen@winuae.net>
Fri, 26 Jun 2015 15:55:05 +0000 (18:55 +0300)
16 files changed:
cfgfile.cpp
cpuboard.cpp
include/cpuboard.h
include/filesys.h
include/options.h
include/rommgr.h
ncr9x_scsi.cpp
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/win32.h
od-win32/win32gfx.cpp
od-win32/win32gui.cpp
od-win32/winuae_msvc14/winuae_msvc.vcxproj
od-win32/winuae_msvc14/winuae_msvc.vcxproj.filters
pci.cpp
rommgr.cpp

index 21c8a5edf06c9ab191b8bda3a86b53355a0afe21..a5b3e8be2749bc6e88fd400447b781e213be1c40 100644 (file)
@@ -895,13 +895,17 @@ static void write_filesys_config (struct uae_prefs *p, struct zfile *f)
                        }
                        TCHAR *extras = NULL;
                        if (ct >= HD_CONTROLLER_TYPE_SCSI_FIRST && ct <= HD_CONTROLLER_TYPE_SCSI_LAST) {
-                               if (ci->unit_feature_level == 0) {
+                               if (ci->unit_feature_level == HD_LEVEL_SCSI_1){
                                        extras = _T("SCSI1");
+                               }       else if (ci->unit_feature_level == HD_LEVEL_SASI) {
+                                       extras = _T("SASI");
+                               } else if (ci->unit_feature_level == HD_LEVEL_SASI_ENHANCED) {
+                                       extras = _T("SASIE");
                                }
                        } else if (ct >= HD_CONTROLLER_TYPE_IDE_FIRST && ct <= HD_CONTROLLER_TYPE_IDE_LAST) {
-                               if (ci->unit_feature_level == 0) {
+                               if (ci->unit_feature_level == HD_LEVEL_ATA_1) {
                                        extras = _T("ATA1");
-                               } else if (ci->unit_feature_level == 2) {
+                               } else if (ci->unit_feature_level == HD_LEVEL_ATA_2S) {
                                        extras = _T("ATA2+S");
                                }
                        }
@@ -1516,6 +1520,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
        cfgfile_write_bool (f, _T("genlock"), p->genlock);
        cfgfile_dwrite_str(f, _T("genlockmode"), genlockmodes[p->genlock_image]);
        cfgfile_dwrite_str(f, _T("genlock_image"), p->genlock_image_file);
+       cfgfile_dwrite(f, _T("genlock_mix"), _T("%d"), p->genlock_mix);
        cfgfile_dwrite_str(f, _T("monitoremu"), specialmonitors[p->monitoremu]);
 
        cfgfile_dwrite_bool (f, _T("show_leds"), !!(p->leds_on_screen & STATUSLINE_CHIPSET));
@@ -3740,15 +3745,19 @@ static int cfgfile_parse_newfilesys (struct uae_prefs *p, int nr, int type, TCHA
                                        uci.controller_media_type = 0;
 
                                if (cfgfile_option_find(tmpp2, _T("SCSI2")))
-                                       uci.unit_feature_level = 1;
+                                       uci.unit_feature_level = HD_LEVEL_SCSI_2;
                                else if (cfgfile_option_find(tmpp2, _T("SCSI1")))
-                                       uci.unit_feature_level = 0;
+                                       uci.unit_feature_level = HD_LEVEL_SCSI_1;
+                               else if (cfgfile_option_find(tmpp2, _T("SASIE")))
+                                       uci.unit_feature_level = HD_LEVEL_SASI_ENHANCED;
+                               else if (cfgfile_option_find(tmpp2, _T("SASI")))
+                                       uci.unit_feature_level = HD_LEVEL_SASI;
                                else if (cfgfile_option_find(tmpp2, _T("ATA2+S")))
-                                       uci.unit_feature_level = 2;
+                                       uci.unit_feature_level = HD_LEVEL_ATA_2S;
                                else if (cfgfile_option_find(tmpp2, _T("ATA2+")))
-                                       uci.unit_feature_level = 1;
+                                       uci.unit_feature_level = HD_LEVEL_ATA_2;
                                else if (cfgfile_option_find(tmpp2, _T("ATA1")))
-                                       uci.unit_feature_level = 0;
+                                       uci.unit_feature_level = HD_LEVEL_ATA_1;
                        }
                }
                if (type == 2) {
@@ -4219,7 +4228,8 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH
                || cfgfile_intval (option, value, _T("parallel_autoflush"), &p->parallel_autoflush_time, 1)
                || cfgfile_intval (option, value, _T("uae_hide"), &p->uae_hide, 1)
                || cfgfile_intval (option, value, _T("cpu_frequency"), &p->cpu_frequency, 1)
-               || cfgfile_intval (option, value, _T("kickstart_ext_rom_file2addr"), &p->romextfile2addr, 1)
+               || cfgfile_intval(option, value, _T("kickstart_ext_rom_file2addr"), &p->romextfile2addr, 1)
+               || cfgfile_intval(option, value, _T("genlock_mix"), &p->genlock_mix, 1)
                || cfgfile_intval (option, value, _T("catweasel"), &p->catweasel, 1))
                return 1;
 
@@ -6050,6 +6060,7 @@ void default_prefs (struct uae_prefs *p, int type)
        p->chipset_mask = CSMASK_ECS_AGNUS;
        p->genlock = 0;
        p->genlock_image = 0;
+       p->genlock_mix = 0;
        p->ntscmode = 0;
        p->filesys_limit = 0;
        p->filesys_max_name = 107;
@@ -6253,7 +6264,6 @@ static void buildin_default_prefs (struct uae_prefs *p)
        _tcscpy (p->romextfile, _T(""));
        _tcscpy (p->romextfile2, _T(""));
        set_device_rom(p, NULL, ROMTYPE_CPUBOARD, 0);
-       set_device_rom(p, NULL, ROMTYPE_CPUBOARDEXT, 0);
 
        p->prtname[0] = 0;
        p->sername[0] = 0;
@@ -6611,7 +6621,7 @@ static int bip_a1200 (struct uae_prefs *p, int config, int compa, int romcheck)
                p->cpuboardmem1_size = 32 * 1024 * 1024;
                p->cpu_model = 68030;
                p->cs_rtc = 1;
-               roms_bliz[0] = 90;
+               roms_bliz[0] = 89;
                configure_rom(p, roms_bliz, romcheck);
                break;
                case 3:
index 668a6bbf0db70ed2b57033836c9f42ef08809f69..f7e43f7e32da1ee20541c86dc4e0940f806cb502 100644 (file)
@@ -150,7 +150,7 @@ static uae_u32 maprom_base;
 static int delayed_rom_protect;
 static int f0rom_size, earom_size;
 static uae_u8 io_reg[64];
-static void *flashrom;
+static void *flashrom, *flashrom2;
 static struct zfile *flashrom_file;
 static int flash_unlocked;
 static int csmk2_flashaddressing;
@@ -233,6 +233,11 @@ static bool mapromconfigured(void)
        return false;
 }
 
+void cpuboard_set_flash_unlocked(bool unlocked)
+{
+       flash_unlocked = unlocked;
+}
+
 static bool is_blizzard(void)
 {
        return ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230IV) || ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1260);
@@ -525,35 +530,6 @@ static uae_u8 *REGPARAM2 blizzarde8_xlate(uaecptr addr)
        return NULL;
 }
 
-static uae_u32 REGPARAM2 blizzardf0_lget(uaecptr addr)
-{
-#ifdef JIT
-       special_mem |= S_READ;
-#endif
-       uae_u32 *m;
-
-       //write_log(_T("F0 LONGGET %08x\n"), addr);
-
-       blizzardf0_slow(4);
-
-       addr &= blizzardf0_bank.mask;
-       m = (uae_u32 *)(blizzardf0_bank.baseaddr + addr);
-       return do_get_mem_long(m);
-}
-static uae_u32 REGPARAM2 blizzardf0_wget(uaecptr addr)
-{
-#ifdef JIT
-       special_mem |= S_READ;
-#endif
-       uae_u16 *m, v;
-
-       blizzardf0_slow(2);
-
-       addr &= blizzardf0_bank.mask;
-       m = (uae_u16 *)(blizzardf0_bank.baseaddr + addr);
-       v = do_get_mem_word(m);
-       return v;
-}
 static uae_u32 REGPARAM2 blizzardf0_bget(uaecptr addr)
 {
 #ifdef JIT
@@ -575,26 +551,52 @@ static uae_u32 REGPARAM2 blizzardf0_bget(uaecptr addr)
                addr &= 65535;
                addr += 65536;
                return flash_read(flashrom, addr);
+       } else if (is_dkb_wildfire()) {
+               if (flash_unlocked) {
+                       if (addr & 1)
+                               return flash_read(flashrom2, addr);
+                       else
+                               return flash_read(flashrom, addr);
+               }
        }
        addr &= blizzardf0_bank.mask;
        v = blizzardf0_bank.baseaddr[addr];
        return v;
 }
-
-static void REGPARAM2 blizzardf0_lput(uaecptr addr, uae_u32 b)
+static uae_u32 REGPARAM2 blizzardf0_lget(uaecptr addr)
 {
 #ifdef JIT
-       special_mem |= S_WRITE;
+       special_mem |= S_READ;
 #endif
+       uae_u32 *m;
+
+       //write_log(_T("F0 LONGGET %08x\n"), addr);
+
        blizzardf0_slow(4);
+
+       addr &= blizzardf0_bank.mask;
+       m = (uae_u32 *)(blizzardf0_bank.baseaddr + addr);
+       return do_get_mem_long(m);
 }
-static void REGPARAM2 blizzardf0_wput(uaecptr addr, uae_u32 b)
+static uae_u32 REGPARAM2 blizzardf0_wget(uaecptr addr)
 {
 #ifdef JIT
-       special_mem |= S_WRITE;
+       special_mem |= S_READ;
 #endif
+       uae_u16 *m, v;
+
        blizzardf0_slow(2);
+       if (is_dkb_wildfire() && flash_unlocked) {
+               v = blizzardf0_bget(addr + 0) << 8;
+               v |= blizzardf0_bget(addr + 1);
+       } else {
+               addr &= blizzardf0_bank.mask;
+               m = (uae_u16 *)(blizzardf0_bank.baseaddr + addr);
+               v = do_get_mem_word(m);
+       }
+       return v;
 }
+
 static void REGPARAM2 blizzardf0_bput(uaecptr addr, uae_u32 b)
 {
 #ifdef JIT
@@ -616,6 +618,31 @@ static void REGPARAM2 blizzardf0_bput(uaecptr addr, uae_u32 b)
                addr &= 65535;
                addr += 65536;
                flash_write(flashrom, addr, b);
+       } else if (is_dkb_wildfire()) {
+               if (flash_unlocked) {
+                       if (addr & 1)
+                               flash_write(flashrom2, addr, b);
+                       else
+                               flash_write(flashrom, addr, b);
+               }
+       }
+}
+static void REGPARAM2 blizzardf0_lput(uaecptr addr, uae_u32 b)
+{
+#ifdef JIT
+       special_mem |= S_WRITE;
+#endif
+       blizzardf0_slow(4);
+}
+static void REGPARAM2 blizzardf0_wput(uaecptr addr, uae_u32 b)
+{
+#ifdef JIT
+       special_mem |= S_WRITE;
+#endif
+       blizzardf0_slow(2);
+       if (is_dkb_wildfire()) {
+               blizzardf0_bput(addr + 0, b >> 8);
+               blizzardf0_bput(addr + 1, b >> 0);
        }
 }
 
@@ -1354,7 +1381,7 @@ void cpuboard_map(void)
                map_banks(&blizzardf0_bank, 0xf00000 >> 16, 131072 >> 16, 0);
        }
        if (is_dkb_wildfire()) {
-               map_banks(&blizzardf0_bank, 0xf00000 >> 16, 0x10000 >> 16, 0);
+               map_banks(&blizzardf0_bank, 0xf00000 >> 16, 0x80000 >> 16, 0);
        }
        if (is_dkb_12x0()) {
                if (cpuboard_size >= 4 * 1024 * 1024) {
@@ -1397,6 +1424,8 @@ void cpuboard_reset(void)
 
        flash_free(flashrom);
        flashrom = NULL;
+       flash_free(flashrom2);
+       flashrom2 = NULL;
        zfile_fclose(flashrom_file);
        flashrom_file = NULL;
 }
@@ -1408,6 +1437,8 @@ void cpuboard_cleanup(void)
 
        flash_free(flashrom);
        flashrom = NULL;
+       flash_free(flashrom2);
+       flashrom2 = NULL;
        zfile_fclose(flashrom_file);
        flashrom_file = NULL;
 
@@ -1483,7 +1514,7 @@ void cpuboard_init(void)
        } else if (is_dkb_wildfire()) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 131072;
+               blizzardf0_bank.allocated = 65536;
                blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
                mapped_malloc(&blizzardf0_bank);
 
@@ -1985,7 +2016,7 @@ static void ew(uae_u8 *p, int addr, uae_u8 value)
 addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
 {
        struct zfile *autoconfig_rom = NULL;
-       struct boardromconfig *brc, *brc2;
+       struct boardromconfig *brc;
        int roms[3], roms2[3];
        bool autoconf = true;
        bool autoconf_stop = false;
@@ -1997,9 +2028,8 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
        
        boardname = cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].name;
 
-       int idx, idx2;
+       int idx;
        brc = get_device_rom(&currprefs, ROMTYPE_CPUBOARD, 0, &idx);
-       brc2 = get_device_rom(&currprefs, ROMTYPE_CPUBOARDEXT, 0, &idx2);
        if (brc)
                romname = brc->roms[idx].romfile;
 
@@ -2049,6 +2079,7 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
                        case BOARD_DKB_SUB_12x0:
                        return &expamem_null;
                        case BOARD_DKB_SUB_WILDFIRE:
+                       roms[0] = 143;
                        break;
                }
                break;
@@ -2189,6 +2220,8 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
        if (is_dkb_wildfire()) {
                f0rom_size = 65536;
                zfile_fread(blizzardf0_bank.baseaddr, 1, f0rom_size, autoconfig_rom);
+               flashrom = flash_new(blizzardf0_bank.baseaddr + 0, 32768, 65536, 0x20, flashrom_file, FLASHROM_EVERY_OTHER_BYTE | FLASHROM_PARALLEL_EEPROM);
+               flashrom2 = flash_new(blizzardf0_bank.baseaddr + 1, 32768, 65536, 0x20, flashrom_file, FLASHROM_EVERY_OTHER_BYTE | FLASHROM_EVERY_OTHER_BYTE_ODD | FLASHROM_PARALLEL_EEPROM);
                autoconf = false;
        } else if (is_aca500()) {
                f0rom_size = 524288;
@@ -2198,7 +2231,7 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
                        flashrom_file = autoconfig_rom;
                        autoconfig_rom = NULL;
                }
-               flashrom = flash_new(blizzardf0_bank.baseaddr, f0rom_size, f0rom_size, 0xa4, flashrom_file);
+               flashrom = flash_new(blizzardf0_bank.baseaddr, f0rom_size, f0rom_size, 0xa4, flashrom_file, 0);
        } else if (is_a2630()) {
                f0rom_size = 131072;
                zfile_fread(blizzardf0_bank.baseaddr, 1, f0rom_size, autoconfig_rom);
@@ -2255,7 +2288,7 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
                        flashrom_file = autoconfig_rom;
                        autoconfig_rom = NULL;
                }
-               flashrom = flash_new(blizzardea_bank.baseaddr, earom_size, earom_size, 0x20, flashrom_file);
+               flashrom = flash_new(blizzardea_bank.baseaddr, earom_size, earom_size, 0x20, flashrom_file, 0);
                memcpy(blizzardf0_bank.baseaddr, blizzardea_bank.baseaddr + 65536, 65536);
        } else if (is_csmk2()) {
                earom_size = 131072;
@@ -2265,7 +2298,7 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
                        flashrom_file = autoconfig_rom;
                        autoconfig_rom = NULL;
                }
-               flashrom = flash_new(blizzardea_bank.baseaddr, earom_size, earom_size, 0x20, flashrom_file);
+               flashrom = flash_new(blizzardea_bank.baseaddr, earom_size, earom_size, 0x20, flashrom_file, 0);
                memcpy(blizzardf0_bank.baseaddr, blizzardea_bank.baseaddr + 65536, 65536);
        } else if (is_csmk3() || is_blizzardppc()) {
                uae_u8 flashtype;
@@ -2292,7 +2325,7 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
                        autoconfig_rom = NULL;
                }
                fixserial(blizzardf0_bank.baseaddr, f0rom_size);
-               flashrom = flash_new(blizzardf0_bank.baseaddr, f0rom_size, f0rom_size, flashtype, flashrom_file);
+               flashrom = flash_new(blizzardf0_bank.baseaddr, f0rom_size, f0rom_size, flashtype, flashrom_file, 0);
        } else {
                // 1230 MK IV / 1240/60
                f0rom_size = 65536;
@@ -2308,6 +2341,8 @@ addrbank *cpuboard_autoconfig_init(struct romconfig *rc)
                zfile_fclose(autoconfig_rom);
                autoconfig_rom = NULL;
                if (roms2[0] != -1) {
+                       int idx2;
+                       struct boardromconfig *brc2 = get_device_rom(&currprefs, ROMTYPE_BLIZKIT4, 0, &idx2);
                        if (brc2 && brc2->roms[idx2].romfile[0])
                                autoconfig_rom = board_rom_open(roms2, brc2->roms[idx2].romfile);
                        if (autoconfig_rom) {
index 17abe3533e5b5f7fc37be210da64f7656292d833..8d0c3f36585502a68001f3b84a8ff2b04bfcaf27 100644 (file)
@@ -18,6 +18,7 @@ extern bool cpuboard_io_special(int addr, uae_u32 *val, int size, bool write);
 extern void cpuboard_overlay_override(void);
 extern void cpuboard_setboard(struct uae_prefs *p, int type, int subtype);
 extern uaecptr cpuboard_get_reset_pc(uaecptr *stack);
+extern void cpuboard_set_flash_unlocked(bool unlocked);
 
 extern bool ppc_interrupt(int new_m68k_ipl);
 
@@ -35,34 +36,43 @@ extern uae_u8 *REGPARAM3 cyberstorm_scsi_ram_xlate(uaecptr addr) REGPARAM;
 
 #define ISCPUBOARD(type,subtype) (cpuboards[currprefs.cpuboard_type].id == type && (type < 0 || currprefs.cpuboard_subtype == subtype))
 
-#define BOARD_BLIZZARD 1
+#define BOARD_ACT 1
+#define BOARD_ACT_SUB_APOLLO 0
+
+#define BOARD_COMMODORE 2
+#define BOARD_COMMODORE_SUB_A26x0 0
+
+#define BOARD_DKB 3
+#define BOARD_DKB_SUB_12x0 0
+#define BOARD_DKB_SUB_WILDFIRE 1
+
+#define BOARD_GVP 4
+#define BOARD_GVP_SUB_A3001SI 0
+#define BOARD_GVP_SUB_A3001SII 1
+#define BOARD_GVP_SUB_A530 2
+#define BOARD_GVP_SUB_GFORCE030 3
+#define BOARD_GVP_SUB_TEKMAGIC 4
+
+#define BOARD_KUPKE 5
+
+#define BOARD_MACROSYSTEM 6
+#define BOARD_MACROSYSTEM_SUB_WARPENGINE_A4000 0
+
+#define BOARD_BLIZZARD 7
 #define BOARD_BLIZZARD_SUB_1230IV 0
 #define BOARD_BLIZZARD_SUB_1260 1
 #define BOARD_BLIZZARD_SUB_2060 2
 #define BOARD_BLIZZARD_SUB_PPC 3
-#define BOARD_CYBERSTORM 2
+
+#define BOARD_CYBERSTORM 8
 #define BOARD_CYBERSTORM_SUB_MK1 0
 #define BOARD_CYBERSTORM_SUB_MK2 1
 #define BOARD_CYBERSTORM_SUB_MK3 2
 #define BOARD_CYBERSTORM_SUB_PPC 3
-#define BOARD_MACROSYSTEM 3
-#define BOARD_MACROSYSTEM_SUB_WARPENGINE_A4000 0
-#define BOARD_COMMODORE 4
-#define BOARD_COMMODORE_SUB_A26x0 0
-#define BOARD_DKB 5
-#define BOARD_DKB_SUB_12x0 0
-#define BOARD_DKB_SUB_WILDFIRE 1
-#define BOARD_RCS 6
+
+#define BOARD_RCS 9
 #define BOARD_RCS_SUB_FUSIONFORTY 0
-#define BOARD_ACT 7
-#define BOARD_ACT_SUB_APOLLO 0
-#define BOARD_GVP 8
-#define BOARD_GVP_SUB_A3001SI 0
-#define BOARD_GVP_SUB_A3001SII 1
-#define BOARD_GVP_SUB_A530 2
-#define BOARD_GVP_SUB_GFORCE030 3
-#define BOARD_GVP_SUB_TEKMAGIC 4
-#define BOARD_KUPKE 9
+
 #define BOARD_IC 10
 #define BOARD_IC_ACA500 0
 
index 401e8f41eadfba8880f0e2e374a606450c0e199e..5bad7baefe9c7232fdaa6a803764d3bdba47b2a9 100644 (file)
@@ -89,7 +89,7 @@ struct hd_hardfiledata {
     int ansi_version;
 };
 
-#define HD_CONTROLLER_EXPANSION_MAX 30
+#define HD_CONTROLLER_EXPANSION_MAX 50
 #define HD_CONTROLLER_NEXT_UNIT 100
 
 #define HD_CONTROLLER_TYPE_UAE 0
index 988765c32042f347862fbb9fc7f88b9eedc640c8..a6d045b6334754d6a9d13750e7e02f6a8e6238bf 100644 (file)
@@ -11,8 +11,8 @@
 #define UAE_OPTIONS_H
 
 #define UAEMAJOR 3
-#define UAEMINOR 1
-#define UAESUBREV 1
+#define UAEMINOR 2
+#define UAESUBREV 0
 
 typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;
 
@@ -134,6 +134,15 @@ struct wh {
 #define UAEDEV_CD 2
 #define UAEDEV_TAPE 3
 
+#define HD_LEVEL_SCSI_1 0
+#define HD_LEVEL_SCSI_2 1
+#define HD_LEVEL_SASI 2
+#define HD_LEVEL_SASI_ENHANCED 3
+
+#define HD_LEVEL_ATA_1 0
+#define HD_LEVEL_ATA_2 1
+#define HD_LEVEL_ATA_2S 2
+
 #define BOOTPRI_NOAUTOBOOT -128
 #define BOOTPRI_NOAUTOMOUNT -129
 #define ISAUTOBOOT(ci) ((ci)->bootpri > BOOTPRI_NOAUTOBOOT)
@@ -427,6 +436,7 @@ struct uae_prefs {
        bool ntscmode;
        bool genlock;
        int genlock_image;
+       int genlock_mix;
        TCHAR genlock_image_file[MAX_DPATH];
        int monitoremu;
        double chipset_refreshrate;
index 362a291777cf54eb02074992af0ddc0e148d926d..349f9d38ea37865566de8d9928955f410767f851 100644 (file)
@@ -46,7 +46,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_SCSI           0x00100000
 #define ROMTYPE_A2091          0x00100001
 #define ROMTYPE_A4091          0x00100002
-#define ROMTYPE_CPUBOARDEXT    0x00100003
+#define ROMTYPE_BLIZKIT4       0x00100003
 #define ROMTYPE_FASTLANE       0x00100004
 #define ROMTYPE_OKTAGON                0x00100005
 #define ROMTYPE_GVPS1          0x00100006
@@ -77,6 +77,9 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_GREX           0x0010001f
 #define ROMTYPE_PROMETHEUS     0x00100020
 #define ROMTYPE_MEDIATOR       0x00100021
+#define ROMTYPE_TECMAR         0x00100022
+#define ROMTYPE_XEBEC          0x00100023
+#define ROMTYPE_MICROFORGE     0x00100024
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index 5d132c9013479543c2ac52ced95efd1a5b2d0b2e..0db3bd36491d10d481f8bd03c35acad3a45bc6b6 100644 (file)
@@ -761,7 +761,7 @@ static void ncr9x_io_bput(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val)
                        return;
                }
        } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230IV) || ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1260)) {
-               if (!cfgfile_board_enabled(&currprefs, ROMTYPE_CPUBOARDEXT, 0))
+               if (!cfgfile_board_enabled(&currprefs, ROMTYPE_BLIZKIT4, 0))
                        return;
                if (addr >= BLIZZARD_SCSI_KIT_DMA_OFFSET) {
                        addr &= 0x18000;
@@ -959,7 +959,7 @@ uae_u32 ncr9x_io_bget(struct ncr9x_state *ncr, uaecptr addr)
                        return ncr->led;
                }
        } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230IV) || ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1260)) {
-               if (!cfgfile_board_enabled(&currprefs, ROMTYPE_CPUBOARDEXT, 0))
+               if (!cfgfile_board_enabled(&currprefs, ROMTYPE_BLIZKIT4, 0))
                        return 0;
                if (addr >= BLIZZARD_SCSI_KIT_DMA_OFFSET)
                        return 0;
index bca8fbcba00620261f6ae98dbf3d1bf1ae659958..abcd3000a9ffc7ec3cb6b50ebf35a8a166149e72 100644 (file)
@@ -29,6 +29,7 @@
 #define IDS_GAMEPORTS                   21
 #define IDS_EXPANSION                   22
 #define IDS_STRING23                    23
+#define IDS_EXPANSION2                  23
 #define IDS_EXTTEXT                     100
 #define IDS_EXTACTUAL                   101
 #define IDS_SOUND                       102
 #define IDS_SELECT_MENU                 396
 #define IDS_SCSI_EMULATION              397
 #define IDS_SLIRP                       398
+#define IDD_EXPANSION2                  398
 #define IDS_SLIRP_INBOUND               399
 #define IDS_FILTER_PAL_EXTRA            400
 #define IDS_FILTER_3D_EXTRA             401
 #define IDC_KEYCHOOSER                  1393
 #define IDC_SCSIROMSUBSELECT            1393
 #define IDC_ROMFILE2                    1394
+#define IDC_SCSIROMSELECTCAT            1394
 #define IDC_ROMCHOOSER2                 1395
 #define IDC_FLASHCHOOSER                1396
 #define IDC_FLASHFILE                   1397
 #define IDC_INPUTLIST                   1611
 #define IDC_CATWEASEL                   1611
 #define IDC_INPUTAMIGA                  1612
+#define IDC_SCSIROMSELECTED             1612
 #define IDC_AVIOUTPUT_VIDEO             1613
 #define IDC_INPUTAUTOFIRE               1613
 #define IDC_PORT_MOUSETRICK             1613
 #define IDC_GENLOCKMODE                 1714
 #define IDC_CS_RAMSEYREV                1715
 #define IDC_SOUND_WASAPI                1715
+#define IDC_GENLOCKMIX                  1715
 #define IDC_CS_KSMIRROR_E0              1716
 #define IDC_STRINGBOXEDIT               1716
 #define IDC_SOUND_OPENAL                1716
 #define IDC_CD_SELECT                   1807
 #define IDC_FASTMEMAUTOCONFIG           1808
 #define IDC_RTG_DISPLAYSELECT           1809
-#define IDC_CPUBOARD_SETTING1           1809
 #define IDC_MISCLIST                    1810
-#define IDC_CPUBOARD_SETTING2           1810
 #define IDC_STATENAME                   1811
 #define IDC_SAMPLER_STEREO              1812
 #define IDC_LISTDIALOG_LIST             1813
 #define IDC_FILTER_NATIVERTG            1839
 #define IDC_P96MEM                      1840
 #define IDC_DA_SLIDER                   1841
-#define IDC_EXPANSION_SETTING1          1841
 #define IDC_CPUBOARD_TYPE               1842
-#define IDC_EXPANSION_SETTING2          1842
 #define IDC_CPUBOARDMEM                 1843
 #define IDC_Z3MAPPING                   1844
 #define IDC_CPUBOARD_SUBTYPE            1845
+#define IDC_EXPANSION_SETTING1          1846
+#define IDC_EXPANSION_SETTING2          1847
+#define IDC_EXPANSION_SETTING3          1848
+#define IDC_CPUBOARD_SETTING1           1849
+#define IDC_CPUBOARD_SETTING2           1850
+#define IDC_CPUBOARD_SETTING3           1851
 #define ID__FLOPPYDRIVES                40004
 #define ID_FLOPPYDRIVES_DF0             40005
 #define ID_ST_CONFIGURATION             40010
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NO_MFC                     1
 #define _APS_3D_CONTROLS                     1
-#define _APS_NEXT_RESOURCE_VALUE        398
+#define _APS_NEXT_RESOURCE_VALUE        399
 #define _APS_NEXT_COMMAND_VALUE         40050
-#define _APS_NEXT_CONTROL_VALUE         1842
+#define _APS_NEXT_CONTROL_VALUE         1848
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
index 39bcab67c1c9efeadc7cc3beb63a045a263e00c2..7023684aa493ca17953a7ff3d67b1b0fce2e2cda 100644 (file)
@@ -76,7 +76,7 @@ END
 // Dialog
 //
 
-IDD_KICKSTART DIALOGEX 0, 0, 396, 304
+IDD_KICKSTART DIALOGEX 0, 0, 396, 204
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 EXSTYLE WS_EX_CONTEXTHELP
 FONT 8, "MS Sans Serif", 0, 0, 0x1
@@ -102,21 +102,6 @@ BEGIN
     LTEXT           "Real Time Clock file",IDC_STATIC,12,167,313,15,SS_CENTERIMAGE
     EDITTEXT        IDC_RTCFILE,12,183,361,12,ES_AUTOHSCROLL
     PUSHBUTTON      "...",IDC_RTCCHOOSER,376,181,10,15
-    GROUPBOX        "Expansion ROM Settings",IDC_STATIC,1,206,394,66
-    LTEXT           "SCSI/IDE/Boot ROM file:",IDC_STATIC,12,219,170,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_SCSIROMSELECT,12,235,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_SCSIROMSELECTNUM,175,235,22,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Autoboot disabled",IDC_SCSIROMFILEAUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,216,99,12
-    RTEXT           "Controller ID:",IDC_STATIC,294,216,57,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_SCSIROMID,356,217,29,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_SCSIROMFILE,202,235,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "...",IDC_SCSIROMCHOOSER,376,235,10,15
-    COMBOBOX        IDC_SCSIROMSUBSELECT,202,253,171,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Accelerator board ROM file:",IDC_STATIC,12,273,170,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_CPUBOARDROMFILE,12,289,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "...",IDC_CPUBOARDROMCHOOSER,187,288,10,15
-    CONTROL         "-",IDC_EXPANSION_SETTING1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,11,256,77,10
-    CONTROL         "-",IDC_EXPANSION_SETTING2,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,116,256,77,10
 END
 
 IDD_DISPLAY DIALOGEX 0, 0, 396, 298
@@ -179,7 +164,7 @@ BEGIN
     CONTROL         "Double, fields+",IDC_LM_IDOUBLED3,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,277,90,10
 END
 
-IDD_MEMORY DIALOGEX 0, 0, 396, 304
+IDD_MEMORY DIALOGEX 0, 0, 396, 246
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 EXSTYLE WS_EX_CONTEXTHELP
 FONT 8, "MS Sans Serif", 0, 0, 0x1
@@ -201,7 +186,7 @@ BEGIN
     CONTROL         "",IDC_Z3CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,248,71,60,20
     EDITTEXT        IDC_Z3CHIPRAM,311,76,40,12,ES_CENTER | ES_READONLY
     EDITTEXT        IDC_MAX32RAM,14,99,366,12,ES_CENTER | ES_READONLY
-    GROUPBOX        "Advanced Memory Settings",IDC_STATIC,0,133,393,164
+    GROUPBOX        "Advanced Memory Settings",IDC_STATIC,1,134,393,107
     RTEXT           "Motherboard Fast:",IDC_STATIC,116,149,129,10,SS_CENTERIMAGE
     CONTROL         "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,251,145,68,20
     EDITTEXT        IDC_MBRAM1,326,148,40,12,ES_CENTER | ES_READONLY
@@ -211,15 +196,8 @@ BEGIN
     RTEXT           "Second Z2 Fast RAM board:",IDC_STATIC,129,194,116,15,SS_CENTERIMAGE
     CONTROL         "",IDC_FASTMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,251,193,68,20
     EDITTEXT        IDC_FASTRAM2,326,196,40,12,ES_CENTER | ES_READONLY
-    RTEXT           "Z3 mapping mode:",IDC_STATIC,149,220,93,15,SS_CENTERIMAGE
+    RTEXT           "Z3 mapping mode:",IDC_STATIC,149,219,93,15,SS_CENTERIMAGE
     COMBOBOX        IDC_Z3MAPPING,249,220,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    RTEXT           "Accelerator board memory:",IDC_STATIC,138,250,104,15,SS_CENTERIMAGE
-    CONTROL         "",IDC_CPUBOARDMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,251,246,68,20
-    EDITTEXT        IDC_CPUBOARDRAM,326,249,40,12,ES_CENTER | ES_READONLY
-    COMBOBOX        IDC_CPUBOARD_TYPE,9,255,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_CPUBOARD_SUBTYPE,9,274,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "-",IDC_CPUBOARD_SETTING1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,155,277,100,10
-    CONTROL         "-",IDC_CPUBOARD_SETTING2,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,261,277,100,10
     CONTROL         "Autoconfig Z2 Fast RAM",IDC_FASTMEMAUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,194,120,10
 END
 
@@ -712,7 +690,8 @@ BEGIN
     CONTROL         "Full [] 100% collision hardware emulation. Only very few games need this option. Slowest.",IDC_COLLISION3,
                     "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,182,172,181,10
     LTEXT           "Genlock emulation mode",IDC_STATIC,237,59,117,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_GENLOCKMODE,237,77,147,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_GENLOCKMODE,237,77,103,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_GENLOCKMIX,346,77,38,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
 END
 
 IDD_CHIPSET2 DIALOGEX 0, 0, 396, 305
@@ -1110,7 +1089,7 @@ BEGIN
     CTEXT           "Enter address",IDC_DBG_ADDRINPUTTXT,20,1,100,10,SS_CENTERIMAGE | WS_TABSTOP
 END
 
-IDD_EXPANSION DIALOGEX 0, 0, 396, 302
+IDD_EXPANSION DIALOGEX 0, 0, 396, 194
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
@@ -1141,24 +1120,6 @@ BEGIN
     COMBOBOX        IDC_RTG_BUFFERCNT,153,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     CTEXT           "Aspect ratio:",IDC_STATIC,282,149,83,10,SS_CENTERIMAGE
     COMBOBOX        IDC_RTG_SCALE_ASPECTRATIO,282,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,197,172,100
-    CONTROL         "Catweasel Z2 emulation [] Catweasel MK2 Zorro II card emulation. Physical Windows compatible Catweasel card and drivers required.",IDC_CATWEASEL,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,216,147,11
-    CONTROL         "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,229,147,11
-    CONTROL         "CD32 Full Motion Video cartridge",IDC_CS_CD32FMV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,242,151,11
-    CONTROL         "Toccata Z2 sound card emulation",IDC_CS_TOCCATA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,255,151,11
-    CONTROL         "Toccata Paula/CD audio mix",IDC_CS_TOCCATAMIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,267,151,11
-    GROUPBOX        "Network",IDC_STATIC,181,197,213,101
-    CONTROL         "bsdsocket.library [] bsdsocket network library emulation.",IDC_SOCKETS,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,215,187,11
-    CONTROL         "uaenet.device [] Sana 2 compatible network device emulation.",IDC_SANA2,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,228,187,11
-    CONTROL         "A2065 Z2 [] A2065 Ethernet Zorro II card emulation.",IDC_A2065,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,241,187,11
-    COMBOBOX        IDC_NETDEVICE,202,269,178,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,284,147,11
-    CONTROL         "Realtek 8029 PCI [] Realtek 8029 PCI NIC emulation",IDC_NE2000,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,255,187,11
 END
 
 IDD_INPUTMAP DIALOGEX 0, 0, 421, 341
@@ -1243,6 +1204,56 @@ BEGIN
     EDITTEXT        IDC_DISKINFOBOX,5,4,481,292,ES_MULTILINE | ES_READONLY | WS_VSCROLL
 END
 
+IDD_EXPANSION2 DIALOGEX 0, 0, 396, 302
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+    RTEXT           "Accelerator board memory:",IDC_STATIC,155,144,104,15,SS_CENTERIMAGE
+    CONTROL         "",IDC_CPUBOARDMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,269,141,68,20
+    EDITTEXT        IDC_CPUBOARDRAM,343,146,40,12,ES_CENTER | ES_READONLY
+    COMBOBOX        IDC_CPUBOARD_TYPE,13,117,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_CPUBOARD_SUBTYPE,13,136,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "-",IDC_CPUBOARD_SETTING1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,14,172,97,10
+    CONTROL         "-",IDC_CPUBOARD_SETTING2,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,121,172,100,10
+    GROUPBOX        "Expansion Board Settings",IDC_STATIC,1,6,394,88
+    COMBOBOX        IDC_SCSIROMSELECTNUM,175,42,22,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_SCSIROMSELECT,12,42,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Autoboot disabled",IDC_SCSIROMFILEAUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,62,99,12
+    RTEXT           "SCSI controller ID:",IDC_STATIC,241,23,110,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_SCSIROMID,356,24,29,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_SCSIROMFILE,202,42,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "...",IDC_SCSIROMCHOOSER,376,42,10,15
+    COMBOBOX        IDC_SCSIROMSUBSELECT,12,60,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "Accelerator board ROM file:",IDC_STATIC,203,104,170,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_CPUBOARDROMFILE,200,119,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "...",IDC_CPUBOARDROMCHOOSER,374,119,10,15
+    CONTROL         "-",IDC_EXPANSION_SETTING1,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,14,79,92,10
+    CONTROL         "-",IDC_EXPANSION_SETTING3,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,233,79,77,10
+    GROUPBOX        "Accelerator Board Settings",IDC_STATIC,1,96,394,97
+    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,199,172,100
+    CONTROL         "Catweasel Z2 emulation [] Catweasel MK2 Zorro II card emulation. Physical Windows compatible Catweasel card and drivers required.",IDC_CATWEASEL,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,218,147,11
+    CONTROL         "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,231,147,11
+    CONTROL         "CD32 Full Motion Video cartridge",IDC_CS_CD32FMV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,244,151,11
+    CONTROL         "Toccata Z2 sound card emulation",IDC_CS_TOCCATA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,257,151,11
+    CONTROL         "Toccata Paula/CD audio mix",IDC_CS_TOCCATAMIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,269,151,11
+    GROUPBOX        "Network",IDC_STATIC,181,199,213,101
+    CONTROL         "bsdsocket.library [] bsdsocket network library emulation.",IDC_SOCKETS,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,217,187,11
+    CONTROL         "uaenet.device [] Sana 2 compatible network device emulation.",IDC_SANA2,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,230,187,11
+    CONTROL         "A2065 Z2 [] A2065 Ethernet Zorro II card emulation.",IDC_A2065,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,243,187,11
+    COMBOBOX        IDC_NETDEVICE,202,271,178,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,286,147,11
+    CONTROL         "Realtek 8029 PCI [] Realtek 8029 PCI NIC emulation",IDC_NE2000,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,257,187,11
+    CONTROL         "-",IDC_CPUBOARD_SETTING3,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,233,172,100,10
+    CONTROL         "-",IDC_EXPANSION_SETTING2,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,121,79,101,10
+    CONTROL         "Enabled",IDC_SCSIROMSELECTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,43,99,12
+    COMBOBOX        IDC_SCSIROMSELECTCAT,12,23,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+END
+
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -1250,8 +1261,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 3,1,1,0
- PRODUCTVERSION 3,1,1,0
+ FILEVERSION 3,2,0,0
+ PRODUCTVERSION 3,2,0,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -1267,12 +1278,12 @@ BEGIN
         BLOCK "040904b0"
         BEGIN
             VALUE "FileDescription", "WinUAE"
-            VALUE "FileVersion", "3.1.1.0"
+            VALUE "FileVersion", "3.2.0.0"
             VALUE "InternalName", "WinUAE"
             VALUE "LegalCopyright", "© 1996-2015 under the GNU Public License (GPL)"
             VALUE "OriginalFilename", "WinUAE.exe"
             VALUE "ProductName", "WinUAE"
-            VALUE "ProductVersion", "3.1.1.0"
+            VALUE "ProductVersion", "3.2.0.0"
         END
     END
     BLOCK "VarFileInfo"
@@ -1406,7 +1417,6 @@ BEGIN
 
     IDD_MEMORY, DIALOG
     BEGIN
-        BOTTOMMARGIN, 301
     END
 
     IDD_CPU, DIALOG
@@ -1470,7 +1480,6 @@ BEGIN
 
     IDD_CHIPSET, DIALOG
     BEGIN
-        BOTTOMMARGIN, 169
     END
 
     IDD_CHIPSET2, DIALOG
@@ -1535,7 +1544,6 @@ BEGIN
 
     IDD_EXPANSION, DIALOG
     BEGIN
-        BOTTOMMARGIN, 289
     END
 
     IDD_INPUTMAP, DIALOG
@@ -1562,6 +1570,10 @@ BEGIN
     IDD_DISKINFO, DIALOG
     BEGIN
     END
+
+    IDD_EXPANSION2, DIALOG
+    BEGIN
+    END
 END
 #endif    // APSTUDIO_INVOKED
 
@@ -1598,7 +1610,8 @@ BEGIN
     IDS_FRONTEND            "Frontend"
     IDS_CHIPSET2            "Adv. Chipset"
     IDS_GAMEPORTS           "Game ports"
-    IDS_EXPANSION           "Expansions"
+    IDS_EXPANSION           "RTG board"
+    IDS_EXPANSION2          "Expansions"
 END
 
 STRINGTABLE
index a40ff575fe2415776a77f1c18f8ed533d8a95f32..00e420be838fc41a717fcefe573bb3f5a73c3444 100644 (file)
 #define LANG_DLL_FULL_VERSION_MATCH 1
 
 #if WINUAEPUBLICBETA
-#define WINUAEBETA _T("0")
+#define WINUAEBETA _T("1")
 #else
 #define WINUAEBETA _T("")
 #endif
 
-#define WINUAEDATE MAKEBD(2015, 6, 22)
+#define WINUAEDATE MAKEBD(2015, 6, 26)
 
 //#define WINUAEEXTRA _T("AmiKit Preview")
 //#define WINUAEEXTRA _T("Amiga Forever Edition")
index fbdb43d690d7dfb76a90e30bf7b090dc0343c353..7913be292a72e7aa2a7b21dfdce06c3fa73b0f33 100644 (file)
@@ -1895,6 +1895,7 @@ int check_prefs_changed_gfx (void)
        c |= currprefs.monitoremu != changed_prefs.monitoremu ? (2 | 8) : 0;
        c |= currprefs.genlock_image != changed_prefs.genlock_image ? (2 | 8) : 0;
        c |= currprefs.genlock != changed_prefs.genlock ? (2 | 8) : 0;
+       c |= currprefs.genlock_mix != changed_prefs.genlock_mix ? (1 | 256) : 0;
 
        c |= currprefs.gfx_lores_mode != changed_prefs.gfx_lores_mode ? (2 | 8) : 0;
        c |= currprefs.gfx_scandoubler != changed_prefs.gfx_scandoubler ? (2 | 8) : 0;
@@ -1977,6 +1978,7 @@ int check_prefs_changed_gfx (void)
                currprefs.monitoremu = changed_prefs.monitoremu;
                currprefs.genlock_image = changed_prefs.genlock_image;
                currprefs.genlock = changed_prefs.genlock;
+               currprefs.genlock_mix = changed_prefs.genlock_mix;
 
                currprefs.gfx_lores_mode = changed_prefs.gfx_lores_mode;
                currprefs.gfx_scandoubler = changed_prefs.gfx_scandoubler;
index fab55ac2e9bfededb34a3336ee4b087109f93be5..28030133ae7c8ecc52c938ed999ca5c446cf964a 100644 (file)
@@ -181,6 +181,7 @@ static void addaspectratios (HWND hDlg, int id)
 
 static int scsiromselected = 0;
 static int scsiromselectednum = 0;
+static int scsiromselectedcatnum = 0;
 
 #define Error(x) MessageBox (NULL, (x), _T("WinUAE Error"), MB_OK)
 
@@ -218,7 +219,7 @@ static int C_PAGES;
 static int LOADSAVE_ID = -1, MEMORY_ID = -1, KICKSTART_ID = -1, CPU_ID = -1,
        DISPLAY_ID = -1, HW3D_ID = -1, CHIPSET_ID = -1, CHIPSET2_ID = -1, SOUND_ID = -1, FLOPPY_ID = -1, DISK_ID = -1,
        HARDDISK_ID = -1, IOPORTS_ID = -1, GAMEPORTS_ID = -1, INPUT_ID = -1, MISC1_ID = -1, MISC2_ID = -1,
-       AVIOUTPUT_ID = -1, PATHS_ID = -1, QUICKSTART_ID = -1, ABOUT_ID = -1, EXPANSION_ID = -1, FRONTEND_ID = -1;
+       AVIOUTPUT_ID = -1, PATHS_ID = -1, QUICKSTART_ID = -1, ABOUT_ID = -1, EXPANSION_ID = -1, EXPANSION2_ID = -1, FRONTEND_ID = -1;
 static const int INPUTMAP_ID = MAX_C_PAGES - 1;
 static HWND pages[MAX_C_PAGES];
 #define MAX_IMAGETOOLTIPS 10
@@ -1711,6 +1712,7 @@ static void show_rom_list (void)
                93, -1, -1, // Warp Engine
                105, -1, -1, // TekMagic
                112, -1, -1, // DKB 12x0
+               143, -1, -1, // DKB WildFire
                113, -1, -1, // Fusion Forty
                95, 101, -1, -1, // CS MK I
                96, -1, -1, // CS MK II
@@ -1757,7 +1759,7 @@ static void show_rom_list (void)
                _T("Blizzard 1230-IV\0Blizzard 1260\0")
                _T("Blizzard 1230-IV/SCSI\0Blizzard 1260/SCSI\0")
                _T("Blizzard 2060\0Warp Engine\0TekMagic 2040/2060\0")
-               _T("DKB 1230/1240\0Fusion Forty\0")
+               _T("DKB 1230/1240\0DKB WildFire\0Fusion Forty\0")
                _T("CyberStorm MK I\0CyberStorm MK II\0CyberStorm MK III\0")
                _T("Blizzard PPC\0CyberStorm PPC\0")
                
@@ -6334,6 +6336,7 @@ static void enable_for_chipsetdlg (HWND hDlg)
        ew (hDlg, IDC_BLITWAIT, workprefs.immediate_blits ? FALSE : TRUE);
        ew (hDlg, IDC_CS_EXT, workprefs.cs_compatible ? TRUE : FALSE);
        ew(hDlg, IDC_GENLOCKMODE, workprefs.genlock ? TRUE : FALSE);
+       ew(hDlg, IDC_GENLOCKMIX, workprefs.genlock ? TRUE : FALSE);
 }
 
 static const int fakerefreshrates[] = { 50, 60, 100, 120, 0 };
@@ -7268,6 +7271,7 @@ static void values_to_chipsetdlg (HWND hDlg)
        SendDlgItemMessage (hDlg, IDC_CS_EXT, CB_SETCURSEL, workprefs.cs_compatible, 0);
        SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_SETCURSEL, workprefs.monitoremu, 0);
        SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_SETCURSEL, workprefs.genlock_image, 0);
+       SendDlgItemMessage(hDlg, IDC_GENLOCKMIX, CB_SETCURSEL, workprefs.genlock_mix / 25, 0);
 }
 
 static void values_from_chipsetdlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -7316,6 +7320,12 @@ static void values_from_chipsetdlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l
        nn = SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_GETCURSEL, 0, 0);
        if (nn != CB_ERR)
                workprefs.genlock_image = nn;
+       nn = SendDlgItemMessage(hDlg, IDC_GENLOCKMIX, CB_GETCURSEL, 0, 0);
+       if (nn != CB_ERR) {
+               workprefs.genlock_mix = nn * 25;
+               if (workprefs.genlock_mix >= 250)
+                       workprefs.genlock_mix = 255;
+       }
 }
 
 static INT_PTR CALLBACK ChipsetDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -7352,6 +7362,12 @@ static INT_PTR CALLBACK ChipsetDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR
                SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_ADDSTRING, 0, (LPARAM) _T("Noise"));
                SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_ADDSTRING, 0, (LPARAM) _T("Test card"));
 
+               SendDlgItemMessage(hDlg, IDC_GENLOCKMIX, CB_RESETCONTENT, 0, 0);
+               for (int i = 0; i <= 10; i++) {
+                       _stprintf(buffer, _T("%d%%"), (10 - i) * 10);
+                       SendDlgItemMessage(hDlg, IDC_GENLOCKMIX, CB_ADDSTRING, 0, (LPARAM)buffer);
+               }
+
                SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_RESETCONTENT, 0, 0);
                SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("-"));
                WIN32GUI_LoadUIString(IDS_AUTODETECT, buffer, sizeof buffer / sizeof (TCHAR));
@@ -7641,7 +7657,7 @@ static INT_PTR CALLBACK ChipsetDlgProc2 (HWND hDlg, UINT msg, WPARAM wParam, LPA
        return FALSE;
 }
 
-static const int cpuboard_settings_id[] = { IDC_CPUBOARD_SETTING1, IDC_CPUBOARD_SETTING2, -1 };
+static const int cpuboard_settings_id[] = { IDC_CPUBOARD_SETTING1, IDC_CPUBOARD_SETTING2, IDC_CPUBOARD_SETTING3, -1 };
 
 static void enable_for_memorydlg (HWND hDlg)
 {
@@ -7675,13 +7691,6 @@ static void enable_for_memorydlg (HWND hDlg)
        ew (hDlg, IDC_MBMEM1, z3);
        ew (hDlg, IDC_MBRAM2, mbram2);
        ew (hDlg, IDC_MBMEM2, mbram2);
-       ew(hDlg, IDC_CPUBOARDMEM, workprefs.cpuboard_type > 0);
-       ew(hDlg, IDC_CPUBOARDRAM, workprefs.cpuboard_type > 0);
-       ew(hDlg, IDC_CPUBOARD_SUBTYPE, workprefs.cpuboard_type);
-       const struct expansionboardsettings *cbs = cpuboards[workprefs.cpuboard_type].subtypes[workprefs.cpuboard_subtype].settings;
-       for (int i = 0; cpuboard_settings_id[i] >= 0; i++) {
-               hide(hDlg, cpuboard_settings_id[i], !(workprefs.address_space_24 == false && cbs && cbs[i].name));
-       }
 }
 
 extern uae_u32 natmem_size;
@@ -7710,6 +7719,21 @@ static void setmax32bitram (HWND hDlg)
 
 static void setcpuboardmemsize(HWND hDlg)
 {
+       if (workprefs.cpuboardmem1_size > cpuboard_maxmemory(&workprefs))
+               workprefs.cpuboardmem1_size = cpuboard_maxmemory(&workprefs);
+
+       if (cpuboard_memorytype(&workprefs) == BOARD_MEMORY_Z2) {
+               workprefs.fastmem2_size = workprefs.cpuboardmem1_size;
+       }
+       if (cpuboard_memorytype(&workprefs) == BOARD_MEMORY_25BITMEM) {
+               workprefs.mem25bit_size = workprefs.cpuboardmem1_size;
+       }
+       if (workprefs.cpuboard_type == 0)
+               workprefs.mem25bit_size = 0;
+
+       if (cpuboard_memorytype(&workprefs) == BOARD_MEMORY_HIGHMEM)
+               workprefs.mbresmem_high_size = workprefs.cpuboardmem1_size;
+
        int maxmem = cpuboard_maxmemory(&workprefs);
        if (workprefs.cpuboardmem1_size > maxmem) {
                workprefs.cpuboardmem1_size = maxmem;
@@ -7776,17 +7800,6 @@ static void values_to_memorydlg (HWND hDlg)
        SendDlgItemMessage (hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, mem_size);
        SetDlgItemText (hDlg, IDC_CHIPRAM, memsize_names[msi_chip[mem_size]]);
 
-       if (workprefs.cpuboardmem1_size > cpuboard_maxmemory(&workprefs))
-               workprefs.cpuboardmem1_size = cpuboard_maxmemory(&workprefs);
-
-       if (cpuboard_memorytype(&workprefs) == BOARD_MEMORY_Z2) {
-               workprefs.fastmem2_size = workprefs.cpuboardmem1_size;
-       }
-       if (cpuboard_memorytype(&workprefs) == BOARD_MEMORY_25BITMEM) {
-               workprefs.mem25bit_size = workprefs.cpuboardmem1_size;
-       }
-       if (workprefs.cpuboard_type == 0)
-               workprefs.mem25bit_size = 0;
 
        mem_size = 0;
        switch (workprefs.fastmem_size) {
@@ -7894,119 +7907,10 @@ static void values_to_memorydlg (HWND hDlg)
                mem_size = 8;
        else
                mem_size = 9;
-       int min_mem = MIN_P96_MEM;
-       int max_mem = MAX_P96_MEM_Z3;
-       if (!gfxboard_is_z3 (workprefs.rtgmem_type)) {
-               int v = workprefs.rtgmem_size;
-               max_mem = 0;
-               workprefs.rtgmem_size = 1024 * 1024;
-               while (getz2size (&workprefs) > 0) {
-                       workprefs.rtgmem_size *= 2;
-                       max_mem++;
-               }
-               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max (workprefs.rtgmem_type))
-                       v = gfxboard_get_vram_max (workprefs.rtgmem_type);
-               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min (workprefs.rtgmem_type))
-                       v = gfxboard_get_vram_min (workprefs.rtgmem_type);
-               workprefs.rtgmem_size = v;
-               if (workprefs.rtgmem_size > 8 * 1024 * 1024)
-                       mem_size = 8 * 1024 * 1024;
-               while (getz2size (&workprefs) < 0 && workprefs.rtgmem_size > 0)
-                       workprefs.rtgmem_size -= 1024 * 1024;
-       } else {
-               int v = workprefs.rtgmem_size;
-               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max (workprefs.rtgmem_type))
-                       v = gfxboard_get_vram_max (workprefs.rtgmem_type);
-               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min (workprefs.rtgmem_type))
-                       v = gfxboard_get_vram_min (workprefs.rtgmem_type);
-               workprefs.rtgmem_size = v;
-       }
-       if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE) {
-               switch (gfxboard_get_vram_min (workprefs.rtgmem_type)) {
-                       case 0x00100000: min_mem = 1; break;
-                       case 0x00200000: min_mem = 2; break;
-                       case 0x00400000: min_mem = 3; break;
-               }
-               switch (gfxboard_get_vram_max (workprefs.rtgmem_type)) {
-                       case 0x00100000: max_mem = 1; break;
-                       case 0x00200000: max_mem = 2; break;
-                       case 0x00400000: max_mem = 3; break;
-               }
-       }
-       SendDlgItemMessage (hDlg, IDC_P96MEM, TBM_SETRANGE, TRUE, MAKELONG (min_mem, max_mem));
+
        SendDlgItemMessage (hDlg, IDC_Z3CHIPMEM, TBM_SETPOS, TRUE, mem_size);
        SetDlgItemText (hDlg, IDC_Z3CHIPRAM, memsize_names[msi_z3chip[mem_size]]);
 
-       mem_size = 0;
-       switch (workprefs.rtgmem_size) {
-       case 0x00000000: mem_size = 0; break;
-       case 0x00100000: mem_size = 1; break;
-       case 0x00200000: mem_size = 2; break;
-       case 0x00400000: mem_size = 3; break;
-       case 0x00800000: mem_size = 4; break;
-       case 0x01000000: mem_size = 5; break;
-       case 0x02000000: mem_size = 6; break;
-       case 0x04000000: mem_size = 7; break;
-       case 0x08000000: mem_size = 8; break;
-       case 0x10000000: mem_size = 9; break;
-       case 0x20000000: mem_size = 10; break;
-       case 0x40000000: mem_size = 11; break;
-       }
-
-       SendDlgItemMessage (hDlg, IDC_P96MEM, TBM_SETPOS, TRUE, mem_size);
-       SetDlgItemText (hDlg, IDC_P96RAM, memsize_names[msi_gfx[mem_size]]);
-       SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_SETCURSEL, workprefs.rtgmem_size == 0 ? 0 : workprefs.rtgmem_type + 1, 0);
-       SendDlgItemMessage (hDlg, IDC_RTG_8BIT, CB_SETCURSEL, (workprefs.picasso96_modeflags & RGBFF_CLUT) ? 1 : 0, 0);
-       SendDlgItemMessage (hDlg, IDC_RTG_16BIT, CB_SETCURSEL,
-               (manybits (workprefs.picasso96_modeflags, RGBFF_R5G6B5PC | RGBFF_R5G6B5PC | RGBFF_R5G6B5 | RGBFF_R5G5B5 | RGBFF_B5G6R5PC | RGBFF_B5G5R5PC)) ? 1 :
-               (workprefs.picasso96_modeflags & RGBFF_R5G6B5PC) ? 2 :
-               (workprefs.picasso96_modeflags & RGBFF_R5G5B5PC) ? 3 :
-               (workprefs.picasso96_modeflags & RGBFF_R5G6B5) ? 4 :
-               (workprefs.picasso96_modeflags & RGBFF_R5G5B5) ? 5 :
-               (workprefs.picasso96_modeflags & RGBFF_B5G6R5PC) ? 6 :
-               (workprefs.picasso96_modeflags & RGBFF_B5G5R5PC) ? 7 : 0, 0);
-       SendDlgItemMessage (hDlg, IDC_RTG_24BIT, CB_SETCURSEL,
-               (manybits (workprefs.picasso96_modeflags, RGBFF_R8G8B8 | RGBFF_B8G8R8)) ? 1 :
-               (workprefs.picasso96_modeflags & RGBFF_R8G8B8) ? 2 :
-               (workprefs.picasso96_modeflags & RGBFF_B8G8R8) ? 3 : 0, 0);
-       SendDlgItemMessage (hDlg, IDC_RTG_32BIT, CB_SETCURSEL,
-               (manybits (workprefs.picasso96_modeflags, RGBFF_A8R8G8B8 | RGBFF_A8B8G8R8 | RGBFF_R8G8B8A8 | RGBFF_B8G8R8A8)) ? 1 :
-               (workprefs.picasso96_modeflags & RGBFF_A8R8G8B8) ? 2 :
-               (workprefs.picasso96_modeflags & RGBFF_A8B8G8R8) ? 3 :
-               (workprefs.picasso96_modeflags & RGBFF_R8G8B8A8) ? 4 :
-               (workprefs.picasso96_modeflags & RGBFF_B8G8R8A8) ? 5 : 0, 0);
-       if (workprefs.win32_rtgvblankrate <= 0 ||
-               workprefs.win32_rtgvblankrate == 50 ||
-               workprefs.win32_rtgvblankrate == 60 ||
-               workprefs.win32_rtgvblankrate == 70 ||
-               workprefs.win32_rtgvblankrate == 75) {
-                       SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_SETCURSEL,
-                               (workprefs.win32_rtgvblankrate == 0) ? 0 :
-                               (workprefs.win32_rtgvblankrate == -1) ? 1 :
-                               (workprefs.win32_rtgvblankrate == -2) ? 0 :
-                               (workprefs.win32_rtgvblankrate == 50) ? 2 :
-                               (workprefs.win32_rtgvblankrate == 60) ? 3 :
-                               (workprefs.win32_rtgvblankrate == 70) ? 4 :
-                               (workprefs.win32_rtgvblankrate == 75) ? 5 : 0, 0);
-       } else {
-               TCHAR tmp[10];
-               _stprintf (tmp, _T("%d"), workprefs.win32_rtgvblankrate);
-               SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, WM_SETTEXT, 0, (LPARAM)tmp);
-       }
-
-
-       CheckDlgButton(hDlg, IDC_RTG_SCALE, workprefs.gf[1].gfx_filter_autoscale == RTG_MODE_SCALE);
-       CheckDlgButton(hDlg, IDC_RTG_CENTER, workprefs.gf[1].gfx_filter_autoscale == RTG_MODE_CENTER);
-       CheckDlgButton (hDlg, IDC_RTG_SCALE_ALLOW, workprefs.win32_rtgallowscaling);
-       CheckDlgButton (hDlg, IDC_RTG_MATCH_DEPTH, workprefs.win32_rtgmatchdepth);
-       CheckDlgButton (hDlg, IDC_RTG_VBINTERRUPT, workprefs.rtg_hardwareinterrupt);
-       CheckDlgButton (hDlg, IDC_RTG_HWSPRITE, workprefs.rtg_hardwaresprite);
-
-       SendDlgItemMessage (hDlg, IDC_RTG_SCALE_ASPECTRATIO, CB_SETCURSEL,
-               (workprefs.win32_rtgscaleaspectratio == 0) ? 0 :
-               (workprefs.win32_rtgscaleaspectratio < 0) ? 1 :
-               getaspectratioindex (workprefs.win32_rtgscaleaspectratio) + 2, 0);
-
        mem_size = 0;
        switch (workprefs.mbresmem_low_size) {
        case 0x00000000: mem_size = 0; break;
@@ -8021,9 +7925,6 @@ static void values_to_memorydlg (HWND hDlg)
        SendDlgItemMessage (hDlg, IDC_MBMEM1, TBM_SETPOS, TRUE, mem_size);
        SetDlgItemText (hDlg, IDC_MBRAM1, memsize_names[msi_gfx[mem_size]]);
 
-       if (cpuboard_memorytype(&workprefs) == BOARD_MEMORY_HIGHMEM)
-               workprefs.mbresmem_high_size = workprefs.cpuboardmem1_size;
-
        mem_size = 0;
        switch (workprefs.mbresmem_high_size) {
        case 0x00000000: mem_size = 0; break;
@@ -8039,7 +7940,6 @@ static void values_to_memorydlg (HWND hDlg)
        SendDlgItemMessage (hDlg, IDC_MBMEM2, TBM_SETPOS, TRUE, mem_size);
        SetDlgItemText (hDlg, IDC_MBRAM2, memsize_names[msi_gfx[mem_size]]);
 
-       setcpuboardmemsize(hDlg);
        setmax32bitram (hDlg);
 
 }
@@ -8098,6 +7998,82 @@ static void updatez3 (uae_u32 *size1p, uae_u32 *size2p)
        *size2p = s2;
 }
 
+static void addromfiles(UAEREG *fkey, HWND hDlg, DWORD d, const TCHAR *path, int type1, int type2)
+{
+       int idx;
+       TCHAR tmp[MAX_DPATH];
+       TCHAR tmp2[MAX_DPATH];
+       TCHAR seltmp[MAX_DPATH];
+       struct romdata *rdx = NULL;
+
+       SendDlgItemMessage(hDlg, d, CB_RESETCONTENT, 0, 0);
+       SendDlgItemMessage(hDlg, d, CB_ADDSTRING, 0, (LPARAM) _T(""));
+       if (path)
+               rdx = scan_single_rom(path);
+       idx = 0;
+       seltmp[0] = 0;
+       for (; fkey;) {
+               int size = sizeof(tmp) / sizeof(TCHAR);
+               int size2 = sizeof(tmp2) / sizeof(TCHAR);
+               if (!regenumstr(fkey, idx, tmp, &size, tmp2, &size2))
+                       break;
+               if (_tcslen(tmp) == 7 || _tcslen(tmp) == 13) {
+                       int group = 0;
+                       int subitem = 0;
+                       int idx2 = _tstol(tmp + 4);
+                       if (_tcslen(tmp) == 13) {
+                               group = _tstol(tmp + 8);
+                               subitem = _tstol(tmp + 11);
+                       }
+                       if (idx2 >= 0) {
+                               struct romdata *rd = getromdatabyidgroup(idx2, group, subitem);
+                               for (int i = 0; i < 2; i++) {
+                                       int type = i ? type2 : type1;
+                                       if (type) {
+                                               if (rd && ((((rd->type & ROMTYPE_GROUP_MASK) & (type & ROMTYPE_GROUP_MASK)) && ((rd->type & ROMTYPE_SUB_MASK) == (type & ROMTYPE_SUB_MASK) || !(type & ROMTYPE_SUB_MASK))) ||
+                                                                  (rd->type & type) == ROMTYPE_NONE || (rd->type & type) == ROMTYPE_NOT)) {
+                                                       getromname(rd, tmp);
+                                                       if (SendDlgItemMessage(hDlg, d, CB_FINDSTRING, (WPARAM) -1, (LPARAM) tmp) < 0)
+                                                               SendDlgItemMessage(hDlg, d, CB_ADDSTRING, 0, (LPARAM) tmp);
+                                                       if (rd == rdx)
+                                                               _tcscpy(seltmp, tmp);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               idx++;
+       }
+       if (seltmp[0])
+               SendDlgItemMessage(hDlg, d, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) seltmp);
+       else
+               SetDlgItemText(hDlg, d, path);
+}
+
+static void getromfile(HWND hDlg, DWORD d, TCHAR *path, int size)
+{
+       LRESULT val = SendDlgItemMessage(hDlg, d, CB_GETCURSEL, 0, 0L);
+       if (val == CB_ERR) {
+               SendDlgItemMessage(hDlg, d, WM_GETTEXT, (WPARAM) size, (LPARAM) path);
+       }
+       else {
+               TCHAR tmp1[MAX_DPATH];
+               struct romdata *rd;
+               SendDlgItemMessage(hDlg, d, CB_GETLBTEXT, (WPARAM) val, (LPARAM) tmp1);
+               path[0] = 0;
+               rd = getromdatabyname(tmp1);
+               if (rd) {
+                       struct romlist *rl = getromlistbyromdata(rd);
+                       if (rd->configname)
+                               _stprintf(path, _T(":%s"), rd->configname);
+                       else if (rl)
+                               _tcsncpy(path, rl->path, size);
+               }
+       }
+}
+
+
 static struct netdriverdata *ndd[MAX_TOTAL_NET_DEVICES + 1];
 
 static void expansion_net (HWND hDlg)
@@ -8138,115 +8114,811 @@ static void expansion_net (HWND hDlg)
                SendDlgItemMessage (hDlg, IDC_NETDEVICE, CB_SETCURSEL, 0, 0);
 }
 
-static void enable_for_expansiondlg (HWND hDlg)
+static const int scsiromselectedmask[] = { EXPANSIONTYPE_SCSI, EXPANSIONTYPE_IDE, EXPANSIONTYPE_SASI, EXPANSIONTYPE_PCI_BRIDGE };
+static void init_expansion2(HWND hDlg)
 {
-       int z3 = true;
-       int cw, en;
+       static int first = -1;
 
-       en = !!full_property_sheet;
-       cw = catweasel_detect ();
-       ew (hDlg, IDC_CATWEASEL, cw && en);
-       ew (hDlg, IDC_SOCKETS, en);
-       ew (hDlg, IDC_SCSIDEVICE, en);
-       ew (hDlg, IDC_CATWEASEL, en);
-       ew (hDlg, IDC_NETDEVICE, en);
-       ew (hDlg, IDC_SANA2, en);
-       ew (hDlg, IDC_A2065, en);
-       ew (hDlg, IDC_NETDEVICE, en && (workprefs.a2065name[0] || workprefs.ne2000pciname[0]));
+       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_SETCURSEL, scsiromselectedcatnum, 0);
 
-       int rtg = workprefs.rtgmem_size && full_property_sheet && workprefs.rtgmem_type < GFXBOARD_HARDWARE;
-       int rtg2 = workprefs.rtgmem_size || workprefs.rtgmem_type >= GFXBOARD_HARDWARE;
-       int rtg3 = workprefs.rtgmem_size && workprefs.rtgmem_type < GFXBOARD_HARDWARE;
-       int rtg4 = workprefs.rtgmem_type < GFXBOARD_HARDWARE;
+       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECT, CB_RESETCONTENT, 0, 0);
+       scsiromselect_table[0] = -1;
+       for (int i = 0; expansionroms[i].name; i++) {
+               TCHAR name[256];
+               if (expansionroms[i].romtype & ROMTYPE_CPUBOARD)
+                       continue;
+               if (!(expansionroms[i].deviceflags & scsiromselectedmask[scsiromselectedcatnum]))
+                       continue;
+               if (scsiromselectedcatnum == 0 && (expansionroms[i].deviceflags & EXPANSIONTYPE_SASI))
+                       continue;
+               name[0] = 0;
+               int cnt = 0;
+               for (int j = 0; j < MAX_DUPLICATE_EXPANSION_BOARDS; j++) {
+                       if (cfgfile_board_enabled(&workprefs, expansionroms[i].romtype, j)) {
+                               cnt++;
+                       }
+               }
+               if (cnt > 0) {
+                       if (first < 0)
+                               first = i;
+               }
+               if (cnt == 1)
+                       _tcscat(name, _T("* "));
+               else if (cnt > 1)
+                       _stprintf(name + _tcslen(name), _T("[%d] "), cnt);
+               if (expansionroms[i].friendlymanufacturer) {
+                       _tcscat(name, expansionroms[i].friendlymanufacturer);
+                       _tcscat(name, _T(" "));
+               }
+               _tcscat(name, expansionroms[i].friendlyname);
+               gui_add_string(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, i, name);
+       }
+       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_RESETCONTENT, 0, 0);
+       for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
+               TCHAR tmp[10];
+               _stprintf(tmp, _T("%d"), i + 1);
+               SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_ADDSTRING, 0, (LPARAM) tmp);
+       }
 
-       ew (hDlg, IDC_P96RAM, rtg2);
-       ew (hDlg, IDC_P96MEM, rtg2);
-       ew (hDlg, IDC_RTG_Z2Z3, z3);
-       ew (hDlg, IDC_RTG_8BIT, rtg);
-       ew (hDlg, IDC_RTG_16BIT, rtg);
-       ew (hDlg, IDC_RTG_24BIT, rtg);
-       ew (hDlg, IDC_RTG_32BIT, rtg);
-       ew (hDlg, IDC_RTG_MATCH_DEPTH, rtg3);
-       ew (hDlg, IDC_RTG_SCALE, rtg2);
-       ew (hDlg, IDC_RTG_CENTER, rtg2);
-       ew (hDlg, IDC_RTG_SCALE_ALLOW, rtg2);
-       ew (hDlg, IDC_RTG_SCALE_ASPECTRATIO, rtg2);
-       ew (hDlg, IDC_RTG_VBLANKRATE, rtg2);
-       ew (hDlg, IDC_RTG_BUFFERCNT, rtg2);
-       ew (hDlg, IDC_RTG_DISPLAYSELECT, rtg2);
-       ew (hDlg, IDC_RTG_VBINTERRUPT, rtg3);
-       if (!workprefs.gfx_api) {
-               workprefs.rtg_hardwaresprite = false;
-               CheckDlgButton (hDlg, IDC_RTG_HWSPRITE, FALSE);
+       if (scsiromselected <= 0) {
+               int found = -1;
+               for (int i = 0; expansionroms[i].name; i++) {
+                       int romtype = expansionroms[i].romtype;
+                       if (romtype & ROMTYPE_CPUBOARD)
+                               continue;
+                       if (!(expansionroms[i].deviceflags & scsiromselectedmask[scsiromselectedcatnum]))
+                               continue;
+                       if (scsiromselectedcatnum == 0 && (expansionroms[i].deviceflags & EXPANSIONTYPE_SASI))
+                               continue;
+                       if (cfgfile_board_enabled(&workprefs, romtype, 0)) {
+                               if (found == -1)
+                                       found = i;
+                               else
+                                       found = -2;
+                       }
+               }
+               if (scsiromselected < 0 && found < 0)
+                       found = first;
+               if (found >= 0) {
+                       scsiromselected = found;
+               }
        }
-       ew (hDlg, IDC_RTG_HWSPRITE, rtg3 && workprefs.gfx_api);
-       ShowWindow (GetDlgItem(hDlg, IDC_CS_SCSIMODE), SW_HIDE);
-       ew(hDlg, IDC_CS_CD32FMV, en);
-       ew(hDlg, IDC_CS_TOCCATA, en);
-       ew(hDlg, IDC_CS_TOCCATAMIXER, en && workprefs.sound_toccata);
-       ew (hDlg, IDC_CS_SCSIMODE, FALSE);
-}
 
-static void values_to_expansiondlg (HWND hDlg)
-{
-       int cw;
+       if (scsiromselected > 0)
+               gui_set_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, scsiromselected);
 
-       CheckDlgButton (hDlg, IDC_SOCKETS, workprefs.socket_emu);
-       CheckDlgButton (hDlg, IDC_CATWEASEL, workprefs.catweasel);
-       CheckDlgButton (hDlg, IDC_SCSIDEVICE, workprefs.scsi == 1);
-       CheckDlgButton (hDlg, IDC_SANA2, workprefs.sana2);
-       CheckDlgButton(hDlg, IDC_A2065, workprefs.a2065name[0] ? 1 : 0);
-       CheckDlgButton(hDlg, IDC_NE2000, workprefs.ne2000pciname[0] ? 1 : 0);
-       CheckDlgButton(hDlg, IDC_CS_CD32FMV, workprefs.cs_cd32fmv);
-       CheckDlgButton(hDlg, IDC_CS_TOCCATA, workprefs.sound_toccata);
-       CheckDlgButton(hDlg, IDC_CS_TOCCATAMIXER, workprefs.sound_toccata_mixer);
-       CheckDlgButton(hDlg, IDC_CS_SCSIMODE, workprefs.scsi == 2);
-       SendDlgItemMessage (hDlg, IDC_RTG_BUFFERCNT, CB_SETCURSEL, workprefs.gfx_apmode[1].gfx_backbuffers == 0 ? 0 : workprefs.gfx_apmode[1].gfx_backbuffers - 1, 0);
-       cw = catweasel_detect ();
-       ew (hDlg, IDC_CATWEASEL, cw);
-       if (!cw && workprefs.catweasel < 100)
-               workprefs.catweasel = 0;
+       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_SETCURSEL, scsiromselectednum, 0);
+
+       SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_RESETCONTENT, 0, 0);
+       for (int i = 0; i < 8; i++) {
+               TCHAR tmp[10];
+               _stprintf(tmp, _T("%d"), i);
+               SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_ADDSTRING, 0, (LPARAM) tmp);
+       }
 }
 
-static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
-       int v;
-       TCHAR tmp[100];
-       static int recursive = 0;
-       static int enumerated;
 
-       switch (msg)
-       {
-       case WM_INITDIALOG:
-               pages[EXPANSION_ID] = hDlg;
-               currentpage = EXPANSION_ID;
+static const int expansion_settings_id[] = { IDC_EXPANSION_SETTING1, IDC_EXPANSION_SETTING2, -IDC_EXPANSION_SETTING3, 1 };
 
-               if (!enumerated) {
-                       ethernet_enumerate (ndd, NULL);
-                       for (int i = 0; ndd[i]; i++) {
-                               struct netdriverdata *n = ndd[i];
-                               if (!n->active)
-                                       continue;
-                               if (n->type == UAENET_SLIRP) {
-                                       WIN32GUI_LoadUIString (IDS_SLIRP, tmp, sizeof tmp / sizeof (TCHAR));
-                                       n->desc = my_strdup(tmp);
-                               } else if (n->type == UAENET_SLIRP_INBOUND) {
-                                       WIN32GUI_LoadUIString (IDS_SLIRP_INBOUND, tmp, sizeof tmp / sizeof (TCHAR));
-                                       n->desc = my_strdup(tmp);
-                               }
-                       }
-                       enumerated = 1;
-               }
-               expansion_net (hDlg);
-               init_displays_combo (hDlg, true);
+static void values_to_expansion2dlg_sub(HWND hDlg)
+{
+       SendDlgItemMessage(hDlg, IDC_CPUBOARDROMSUBSELECT, CB_RESETCONTENT, 0, 0);
+       ew(hDlg, IDC_CPUBOARDROMSUBSELECT, false);
 
-               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_RESETCONTENT, 0, 0);
-               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("-"));
-               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("UAE Zorro II"));
-               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("UAE Zorro III (*)"));
-               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Picasso II  Zorro II"));
-               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Picasso II+  Zorro II"));
-               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Piccolo Zorro II"));
+       SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_RESETCONTENT, 0, 0);
+       const struct expansionromtype *er = &expansionroms[scsiromselected];
+       const struct expansionsubromtype *srt = er->subtypes;
+       ew(hDlg, IDC_SCSIROMSUBSELECT, srt != NULL);
+       while (srt && srt->name) {
+               SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_ADDSTRING, 0, (LPARAM) srt->name);
+               srt++;
+       }
+       int index;
+       struct boardromconfig *brc = get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
+       if (brc) {
+               SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_SETCURSEL, brc->roms[index].subtype, 0);
+               SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_SETCURSEL, brc->roms[index].device_id, 0);
+       }
+       else if (srt) {
+               SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_SETCURSEL, 0, 0);
+               SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_SETCURSEL, 0, 0);
+       }
+       if (er->zorro < 2 || er->singleonly) {
+               scsiromselectednum = 0;
+               SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_SETCURSEL, 0, 0);
+       }
+       ew(hDlg, IDC_SCSIROMSELECTNUM, er->zorro >= 2 && !er->singleonly);
+}
+
+static void values_from_expansion2dlg(HWND hDlg)
+{
+       int index;
+       struct boardromconfig *brc;
+       TCHAR tmp[MAX_DPATH];
+       bool changed = false;
+
+       int checked = ischecked(hDlg, IDC_SCSIROMSELECTED);
+       getromfile(hDlg, IDC_SCSIROMFILE, tmp, MAX_DPATH / sizeof(TCHAR));
+       if (tmp[0] || checked) {
+               const struct expansionromtype *ert = &expansionroms[scsiromselected];
+               brc = get_device_rom_new(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
+               if (checked) {
+                       if (!brc->roms[index].romfile[0])
+                               changed = true;
+                       _tcscpy(brc->roms[index].romfile, _T(":ENABLED"));
+               } else {
+                       changed = _tcscmp(tmp, brc->roms[index].romfile) != 0;
+                       getromfile(hDlg, IDC_SCSIROMFILE, brc->roms[index].romfile, MAX_DPATH / sizeof(TCHAR));
+               }
+               brc->roms[index].autoboot_disabled = ischecked(hDlg, IDC_SCSIROMFILEAUTOBOOT);
+
+               int v = SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_GETCURSEL, 0, 0L);
+               if (v != CB_ERR)
+                       brc->roms[index].device_id = v;
+
+               const struct expansionboardsettings *cbs = ert->settings;
+               if (cbs) {
+                       for (int i = 0; cbs[i].name; i++) {
+                               int id = expansion_settings_id[i];
+                               if (id < 0)
+                                       break;
+                               brc->roms[index].device_settings &= ~(1 << i);
+                               if (ischecked(hDlg, id))
+                                       brc->roms[index].device_settings |= 1 << i;
+                       }
+               }
+
+               v = SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_GETCURSEL, 0, 0L);
+               if (v != CB_ERR)
+                       brc->roms[index].subtype = v;
+
+       } else {
+               brc = get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
+               if (brc && brc->roms[index].romfile[0])
+                       changed = true;
+               clear_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum);
+       }
+       if (changed) {
+               init_expansion2(hDlg);
+               values_to_expansion2dlg_sub(hDlg);
+       }
+
+
+       getromfile(hDlg, IDC_CPUBOARDROMFILE, tmp, sizeof(brc->roms[index].romfile) / sizeof(TCHAR));
+       if (tmp[0]) {
+               brc = get_device_rom_new(&workprefs, ROMTYPE_CPUBOARD, 0, &index);
+               getromfile(hDlg, IDC_CPUBOARDROMFILE, brc->roms[index].romfile, sizeof(brc->roms[index].romfile) / sizeof(TCHAR));
+       }
+       else {
+               clear_device_rom(&workprefs, ROMTYPE_CPUBOARD, 0);
+       }
+}
+
+static void values_to_expansion2_expansion_roms(HWND hDlg, UAEREG *fkey)
+{
+       int index;
+       bool keyallocated = false;
+       struct boardromconfig *brc;
+
+       if (!fkey) {
+               fkey = regcreatetree(NULL, _T("DetectedROMs"));
+               keyallocated = true;
+       }
+       if (scsiromselected) {
+               const struct expansionromtype *ert = &expansionroms[scsiromselected];
+               int romtype = ert->romtype;
+               int romtype_extra = ert->romtype_extra;
+
+               brc = get_device_rom(&workprefs, romtype, scsiromselectednum, &index);
+               if (brc && ert->subtypes) {
+                       const struct expansionsubromtype *esrt = &ert->subtypes[brc->roms[index].subtype];
+                       if (esrt->romtype) {
+                               romtype = esrt->romtype;
+                               romtype_extra = 0;
+                       }
+               }
+               ew(hDlg, IDC_SCSIROMFILE, true);
+               ew(hDlg, IDC_SCSIROMCHOOSER, true);
+               if (romtype & ROMTYPE_NOT) {
+                       hide(hDlg, IDC_SCSIROMCHOOSER, 1);
+                       hide(hDlg, IDC_SCSIROMFILE, 1);
+                       hide(hDlg, IDC_SCSIROMSELECTED, 0);
+                       setchecked(hDlg, IDC_SCSIROMSELECTED, brc && brc->roms[index].romfile[0] != 0);
+               } else {
+                       hide(hDlg, IDC_SCSIROMCHOOSER, 0);
+                       hide(hDlg, IDC_SCSIROMFILE, 0);
+                       hide(hDlg, IDC_SCSIROMSELECTED, 1);
+                       setchecked(hDlg, IDC_SCSIROMSELECTED, false);
+                       addromfiles(fkey, hDlg, IDC_SCSIROMFILE, brc ? brc->roms[index].romfile : NULL, romtype, romtype_extra);
+                       setchecked(hDlg, IDC_SCSIROMFILEAUTOBOOT, brc && brc->roms[index].autoboot_disabled);
+               }
+       } else {
+               hide(hDlg, IDC_SCSIROMCHOOSER, 0);
+               hide(hDlg, IDC_SCSIROMFILE, 0);
+               hide(hDlg, IDC_SCSIROMSELECTED, 1);
+               setchecked(hDlg, IDC_SCSIROMSELECTED, false);
+               setchecked(hDlg, IDC_SCSIROMFILEAUTOBOOT, false);
+               SendDlgItemMessage(hDlg, IDC_SCSIROMFILE, CB_RESETCONTENT, 0, 0);
+               ew(hDlg, IDC_SCSIROMFILE, false);
+               ew(hDlg, IDC_SCSIROMCHOOSER, false);            
+       }
+       if (keyallocated)
+               regclosetree(fkey);
+}
+
+static void values_to_expansion2_expansion_settings(HWND hDlg)
+{
+       int index;
+       struct boardromconfig *brc;
+       const struct expansionromtype *ert = &expansionroms[scsiromselected];
+       brc = get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
+       if (brc) {
+               if (brc->roms[index].romfile[0])
+                       ew(hDlg, IDC_SCSIROMFILEAUTOBOOT, ert->autoboot_jumper);
+       }
+       else {
+               if (brc)
+                       brc->roms[index].autoboot_disabled = false;
+               ew(hDlg, IDC_SCSIROMFILEAUTOBOOT, FALSE);
+               setchecked(hDlg, IDC_SCSIROMFILEAUTOBOOT, false);
+       }
+       ew(hDlg, IDC_SCSIROMID, ert->id_jumper);
+
+       const struct expansionboardsettings *cbs = ert->settings;
+       for (int i = 0; expansion_settings_id[i] >= 0; i++) {
+               hide(hDlg, expansion_settings_id[i], !(cbs && cbs[i].name));
+       }
+       int i = 0;
+       if (cbs) {
+               for (i = 0; cbs[i].name; i++) {
+                       int id = expansion_settings_id[i];
+                       if (id < 0)
+                               break;
+                       SetWindowText(GetDlgItem(hDlg, id), cbs[i].name);
+                       setchecked(hDlg, id, (brc && (brc->roms[index].device_settings & (1 << i))));
+               }
+       }
+       while (expansion_settings_id[i] >= 0) {
+               int id = expansion_settings_id[i];
+               SetWindowText(GetDlgItem(hDlg, id), _T("-"));
+               i++;
+       }
+}
+
+static void enable_for_expansion2dlg (HWND hDlg)
+{
+       int z3 = true;
+       int cw, en;
+
+       en = !!full_property_sheet;
+       cw = catweasel_detect ();
+       ew (hDlg, IDC_CATWEASEL, cw && en);
+       ew (hDlg, IDC_SOCKETS, en);
+       ew (hDlg, IDC_SCSIDEVICE, en);
+       ew (hDlg, IDC_CATWEASEL, en);
+       ew (hDlg, IDC_NETDEVICE, en);
+       ew (hDlg, IDC_SANA2, en);
+       ew (hDlg, IDC_A2065, en);
+       ew (hDlg, IDC_NETDEVICE, en && (workprefs.a2065name[0] || workprefs.ne2000pciname[0]));
+
+       ShowWindow (GetDlgItem(hDlg, IDC_CS_SCSIMODE), SW_HIDE);
+       ew(hDlg, IDC_CS_CD32FMV, en);
+       ew(hDlg, IDC_CS_TOCCATA, en);
+       ew(hDlg, IDC_CS_TOCCATAMIXER, en && workprefs.sound_toccata);
+       ew (hDlg, IDC_CS_SCSIMODE, FALSE);
+
+       ew(hDlg, IDC_CPUBOARDROMFILE, workprefs.cpuboard_type != 0);
+       ew(hDlg, IDC_CPUBOARDROMCHOOSER, workprefs.cpuboard_type != 0);
+       ew(hDlg, IDC_CPUBOARDMEM, workprefs.cpuboard_type > 0);
+       ew(hDlg, IDC_CPUBOARDRAM, workprefs.cpuboard_type > 0);
+       ew(hDlg, IDC_CPUBOARD_SUBTYPE, workprefs.cpuboard_type);
+       const struct expansionboardsettings *cbs = cpuboards[workprefs.cpuboard_type].subtypes[workprefs.cpuboard_subtype].settings;
+       int i = 0;
+       if (cbs) {
+               while (cpuboard_settings_id[i] >= 0) {
+                       if (!cbs[i].name)
+                               break;
+                       hide(hDlg, cpuboard_settings_id[i], 0);
+                       i++;
+               }
+       }
+       while (cpuboard_settings_id[i] >= 0) {
+               hide(hDlg, cpuboard_settings_id[i], 1);
+               i++;
+       }
+}
+
+static void values_to_expansion2dlg (HWND hDlg)
+{
+       int cw;
+       int index;
+       struct boardromconfig *brc;
+
+       CheckDlgButton (hDlg, IDC_SOCKETS, workprefs.socket_emu);
+       CheckDlgButton (hDlg, IDC_CATWEASEL, workprefs.catweasel);
+       CheckDlgButton (hDlg, IDC_SCSIDEVICE, workprefs.scsi == 1);
+       CheckDlgButton (hDlg, IDC_SANA2, workprefs.sana2);
+       CheckDlgButton(hDlg, IDC_A2065, workprefs.a2065name[0] ? 1 : 0);
+       CheckDlgButton(hDlg, IDC_NE2000, workprefs.ne2000pciname[0] ? 1 : 0);
+       CheckDlgButton(hDlg, IDC_CS_CD32FMV, workprefs.cs_cd32fmv);
+       CheckDlgButton(hDlg, IDC_CS_TOCCATA, workprefs.sound_toccata);
+       CheckDlgButton(hDlg, IDC_CS_TOCCATAMIXER, workprefs.sound_toccata_mixer);
+       CheckDlgButton(hDlg, IDC_CS_SCSIMODE, workprefs.scsi == 2);
+       cw = catweasel_detect ();
+       ew (hDlg, IDC_CATWEASEL, cw);
+       if (!cw && workprefs.catweasel < 100)
+               workprefs.catweasel = 0;
+
+       UAEREG *fkey = regcreatetree(NULL, _T("DetectedROMs"));
+       load_keyring(&workprefs, NULL);
+
+       values_to_expansion2_expansion_roms(hDlg, fkey);
+
+       values_to_expansion2_expansion_settings(hDlg);
+
+       if (workprefs.cpuboard_type) {
+               const struct cpuboardsubtype *cst = &cpuboards[workprefs.cpuboard_type].subtypes[workprefs.cpuboard_subtype];
+               brc = get_device_rom(&workprefs, ROMTYPE_CPUBOARD, 0, &index);
+               addromfiles(fkey, hDlg, IDC_CPUBOARDROMFILE, brc ? brc->roms[index].romfile : NULL,
+                                       cst->romtype, cst->romtype_extra);
+       } else {
+               SendDlgItemMessage(hDlg, IDC_CPUBOARDROMFILE, CB_RESETCONTENT, 0, 0);
+       }
+
+       regclosetree(fkey);
+
+       gui_set_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, scsiromselected);
+       values_to_expansion2dlg_sub(hDlg);
+
+
+}
+
+static void updatecpuboardsubtypes(HWND hDlg)
+{
+       SendDlgItemMessage(hDlg, IDC_CPUBOARD_SUBTYPE, CB_RESETCONTENT, 0, 0);
+       for (int i = 0; cpuboards[workprefs.cpuboard_type].subtypes[i].name; i++) {
+               SendDlgItemMessage(hDlg, IDC_CPUBOARD_SUBTYPE, CB_ADDSTRING, 0, (LPARAM) cpuboards[workprefs.cpuboard_type].subtypes[i].name);
+       }
+       const struct expansionboardsettings *cbs = cpuboards[workprefs.cpuboard_type].subtypes[workprefs.cpuboard_subtype].settings;
+       int i = 0;
+       if (cbs) {
+               for (i = 0; cbs[i].name; i++) {
+                       int id = cpuboard_settings_id[i];
+                       if (id < 0)
+                               break;
+                       SetWindowText(GetDlgItem(hDlg, id), cbs[i].name);
+               }
+       }
+       while (cpuboard_settings_id[i] >= 0) {
+               int id = cpuboard_settings_id[i];
+               SetWindowText(GetDlgItem(hDlg, id), _T("-"));
+               i++;
+       }
+}
+
+static void expansion2filebuttons(HWND hDlg, WPARAM wParam, TCHAR *path)
+{
+       switch (LOWORD(wParam))
+       {
+               case IDC_SCSIROMCHOOSER:
+               DiskSelection(hDlg, IDC_SCSIROMFILE, 6, &workprefs, path);
+               values_to_expansion2dlg(hDlg);
+               break;
+               case IDC_CPUBOARDROMCHOOSER:
+               DiskSelection(hDlg, IDC_CPUBOARDROMFILE, 6, &workprefs, path);
+               values_to_expansion2dlg(hDlg);
+               break;
+       }
+}
+
+
+static INT_PTR CALLBACK Expansion2DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+       int v, val;
+       TCHAR tmp[100];
+       static int recursive = 0;
+       static int enumerated;
+
+       switch (msg)
+       {
+               case WM_INITDIALOG:
+               {
+                       recursive++;
+                       pages[EXPANSION2_ID] = hDlg;
+                       currentpage = EXPANSION2_ID;
+                       int ids[] = { IDC_SCSIROMFILE, IDC_CPUBOARDROMFILE, -1 };
+                       setmultiautocomplete(hDlg, ids);
+                       if (!enumerated) {
+                               ethernet_enumerate(ndd, NULL);
+                               for (int i = 0; ndd[i]; i++) {
+                                       struct netdriverdata *n = ndd[i];
+                                       if (!n->active)
+                                               continue;
+                                       if (n->type == UAENET_SLIRP) {
+                                               WIN32GUI_LoadUIString(IDS_SLIRP, tmp, sizeof tmp / sizeof(TCHAR));
+                                               n->desc = my_strdup(tmp);
+                                       }
+                                       else if (n->type == UAENET_SLIRP_INBOUND) {
+                                               WIN32GUI_LoadUIString(IDS_SLIRP_INBOUND, tmp, sizeof tmp / sizeof(TCHAR));
+                                               n->desc = my_strdup(tmp);
+                                       }
+                               }
+                               enumerated = 1;
+                       }
+                       SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_RESETCONTENT, 0, 0);
+                       for (int i = 0; cpuboards[i].name; i++) {
+                               SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_ADDSTRING, 0, (LPARAM) cpuboards[i].name);
+                       }
+
+                       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_RESETCONTENT, 0, 0);
+                       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM) _T("SCSI Controllers"));
+                       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM) _T("IDE Controllers"));
+                       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM) _T("SASI Controllers"));
+                       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM) _T("PCI Bridges"));
+                       hide(hDlg, IDC_SCSIROMSELECTED, 1);
+                       expansion_net(hDlg);
+                       init_expansion2(hDlg);
+                       updatecpuboardsubtypes(hDlg);
+                       setcpuboardmemsize(hDlg);
+                       recursive--;
+               }
+
+               case WM_USER:
+               recursive++;
+               values_to_expansion2dlg(hDlg);
+               enable_for_expansion2dlg(hDlg);
+               recursive--;
+               break;
+
+               case WM_COMMAND:
+               {
+                       if (recursive > 0)
+                               break;
+                       recursive++;
+                       switch (LOWORD(wParam))
+                       {
+                               case IDC_EXPANSION_SETTING1:
+                               case IDC_EXPANSION_SETTING2:
+                               case IDC_EXPANSION_SETTING3:
+                               values_from_expansion2dlg(hDlg);
+                               break;
+                               case IDC_SCSIROMFILEAUTOBOOT:
+                               values_from_expansion2dlg(hDlg);
+                               break;
+                               case IDC_SOCKETS:
+                               workprefs.socket_emu = ischecked(hDlg, IDC_SOCKETS);
+                               break;
+                               case IDC_SCSIDEVICE:
+                               workprefs.scsi = ischecked(hDlg, IDC_SCSIDEVICE);
+                               enable_for_expansion2dlg(hDlg);
+                               break;
+                               case IDC_SANA2:
+                               workprefs.sana2 = ischecked(hDlg, IDC_SANA2);
+                               break;
+                               case IDC_A2065:
+                               if (ischecked(hDlg, IDC_A2065)) {
+                                       _tcscpy(workprefs.a2065name, _T("none"));
+                                       expansion_net(hDlg);
+                                       enable_for_expansion2dlg(hDlg);
+                               } else {
+                                       if (!workprefs.ne2000pciname[0])
+                                               ew(hDlg, IDC_NETDEVICE, FALSE);
+                                       workprefs.a2065name[0] = 0;
+                                       enable_for_expansion2dlg(hDlg);
+                               }
+                               break;
+                               case IDC_NE2000:
+                               if (ischecked(hDlg, IDC_NE2000)) {
+                                       _tcscpy(workprefs.ne2000pciname, _T("none"));
+                                       expansion_net(hDlg);
+                                       enable_for_expansion2dlg(hDlg);
+                               } else {
+                                       if (!workprefs.a2065name[0])
+                                               ew(hDlg, IDC_NETDEVICE, FALSE);
+                                       workprefs.ne2000pciname[0] = 0;
+                                       enable_for_expansion2dlg(hDlg);
+                               }
+                               break;
+                               case IDC_CATWEASEL:
+                               workprefs.catweasel = ischecked(hDlg, IDC_CATWEASEL) ? -1 : 0;
+                               break;
+                               case IDC_CS_CD32FMV:
+                               workprefs.cs_cd32fmv = ischecked(hDlg, IDC_CS_CD32FMV) ? 1 : 0;
+                               break;
+                               case IDC_CS_TOCCATA:
+                               workprefs.sound_toccata = ischecked(hDlg, IDC_CS_TOCCATA) ? 1 : 0;
+                               if (!workprefs.sound_toccata)
+                                       workprefs.sound_toccata_mixer = false;
+                               enable_for_expansion2dlg(hDlg);
+                               break;
+                               case IDC_CS_TOCCATAMIXER:
+                               workprefs.sound_toccata_mixer = ischecked(hDlg, IDC_CS_TOCCATAMIXER) ? 1 : 0;
+                               break;
+                               case IDC_SCSIROMSELECTED:
+                               values_from_expansion2dlg(hDlg);
+                               break;
+                       }
+                       expansion2filebuttons(hDlg, wParam, NULL);
+                       if (HIWORD(wParam) == CBN_SELENDOK || HIWORD(wParam) == CBN_KILLFOCUS || HIWORD(wParam) == CBN_EDITCHANGE) {
+                               switch (LOWORD(wParam))
+                               {
+                                       case IDC_SCSIROMFILE:
+                                       case IDC_SCSIROMID:
+                                       case IDC_CPUBOARDROMFILE:
+                                       case IDC_CPUBOARDROMSUBSELECT:
+                                       values_from_expansion2dlg(hDlg);
+                                       values_to_expansion2_expansion_settings(hDlg);
+                                       break;
+                                       case IDC_SCSIROMSUBSELECT:
+                                       values_from_expansion2dlg(hDlg);
+                                       values_to_expansion2_expansion_roms(hDlg, NULL);
+                                       values_to_expansion2_expansion_settings(hDlg);
+                                       break;
+                                       case IDC_SCSIROMSELECTCAT:
+                                       val = SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_GETCURSEL, 0, 0);
+                                       if (val != CB_ERR) {
+                                               scsiromselectedcatnum = val;
+                                               scsiromselected = 0;
+                                               init_expansion2(hDlg);
+                                               values_to_expansion2_expansion_roms(hDlg, NULL);
+                                               values_to_expansion2_expansion_settings(hDlg);
+                                               values_to_expansion2dlg_sub(hDlg);
+                                       }
+                                       break;
+                                       case IDC_SCSIROMSELECTNUM:
+                                       case IDC_SCSIROMSELECT:
+                                       val = SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_GETCURSEL, 0, 0);
+                                       if (val != CB_ERR)
+                                               scsiromselectednum = val;
+                                       val = gui_get_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT);
+                                       if (val != CB_ERR) {
+                                               scsiromselected = val;
+                                               values_to_expansion2_expansion_roms(hDlg, NULL);
+                                               values_to_expansion2_expansion_settings(hDlg);
+                                               values_to_expansion2dlg_sub(hDlg);
+                                       }
+                                       break;
+                                       case IDC_CPUBOARD_TYPE:
+                                       v = SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR && v != workprefs.cpuboard_type) {
+                                               workprefs.cpuboard_type = v;
+                                               workprefs.cpuboard_subtype = 0;
+                                               workprefs.cpuboard_settings = 0;
+                                               updatecpuboardsubtypes(hDlg);
+                                               if (is_ppc_cpu(&workprefs)) {
+                                                       workprefs.ppc_mode = 2;
+                                               } else if (workprefs.ppc_mode == 2) {
+                                                       workprefs.ppc_mode = 0;
+                                               }
+                                               built_in_cpuboard_prefs(&workprefs);
+                                               setcpuboardmemsize(hDlg);
+                                               enable_for_expansion2dlg(hDlg);
+                                               values_to_expansion2dlg(hDlg);
+                                       }
+                                       break;
+                                       case IDC_CPUBOARD_SUBTYPE:
+                                       v = SendDlgItemMessage(hDlg, IDC_CPUBOARD_SUBTYPE, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR && v != workprefs.cpuboard_subtype) {
+                                               workprefs.cpuboard_subtype = v;
+                                               workprefs.cpuboard_settings = 0;
+                                               if (is_ppc_cpu(&workprefs)) {
+                                                       workprefs.ppc_mode = 2;
+                                               } else if (workprefs.ppc_mode == 2) {
+                                                       workprefs.ppc_mode = 0;
+                                               }
+                                               built_in_cpuboard_prefs(&workprefs);
+                                               setcpuboardmemsize(hDlg);
+                                               enable_for_expansion2dlg(hDlg);
+                                               values_to_expansion2dlg(hDlg);
+                                       }
+                                       break;
+                                       case IDC_NETDEVICE:
+                                       v = SendDlgItemMessage(hDlg, IDC_NETDEVICE, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               const TCHAR *s;
+                                               if (v == 0) {
+                                                       s = _T("none");
+                                               }
+                                               else if (ndd) {
+                                                       v--;
+                                                       s = ndd[v]->name;
+                                               }
+                                               if (ischecked(hDlg, IDC_A2065))
+                                                       _tcscpy(workprefs.a2065name, s);
+                                               if (ischecked(hDlg, IDC_NE2000))
+                                                       _tcscpy(workprefs.ne2000pciname, s);
+                                       }
+                                       break;
+                               }
+                       }
+                       for (int i = 0; cpuboard_settings_id[i] >= 0; i++) {
+                               workprefs.cpuboard_settings &= ~(1 << i);
+                               if (ischecked(hDlg, cpuboard_settings_id[i]))
+                                       workprefs.cpuboard_settings |= 1 << i;
+                       }
+                       recursive--;
+               }
+               break;
+               case WM_HSCROLL:
+               workprefs.cpuboardmem1_size = memsizes[msi_cpuboard[SendMessage(GetDlgItem(hDlg, IDC_CPUBOARDMEM), TBM_GETPOS, 0, 0)]];
+               setcpuboardmemsize(hDlg);
+               break;
+       }
+       return FALSE;
+}
+
+static void enable_for_expansiondlg(HWND hDlg)
+{
+       int z3 = true;
+       int en;
+
+       en = !!full_property_sheet;
+
+       int rtg = workprefs.rtgmem_size && full_property_sheet && workprefs.rtgmem_type < GFXBOARD_HARDWARE;
+       int rtg2 = workprefs.rtgmem_size || workprefs.rtgmem_type >= GFXBOARD_HARDWARE;
+       int rtg3 = workprefs.rtgmem_size && workprefs.rtgmem_type < GFXBOARD_HARDWARE;
+       int rtg4 = workprefs.rtgmem_type < GFXBOARD_HARDWARE;
+
+       ew(hDlg, IDC_P96RAM, rtg2);
+       ew(hDlg, IDC_P96MEM, rtg2);
+       ew(hDlg, IDC_RTG_Z2Z3, z3);
+       ew(hDlg, IDC_RTG_8BIT, rtg);
+       ew(hDlg, IDC_RTG_16BIT, rtg);
+       ew(hDlg, IDC_RTG_24BIT, rtg);
+       ew(hDlg, IDC_RTG_32BIT, rtg);
+       ew(hDlg, IDC_RTG_MATCH_DEPTH, rtg3);
+       ew(hDlg, IDC_RTG_SCALE, rtg2);
+       ew(hDlg, IDC_RTG_CENTER, rtg2);
+       ew(hDlg, IDC_RTG_SCALE_ALLOW, rtg2);
+       ew(hDlg, IDC_RTG_SCALE_ASPECTRATIO, rtg2);
+       ew(hDlg, IDC_RTG_VBLANKRATE, rtg2);
+       ew(hDlg, IDC_RTG_BUFFERCNT, rtg2);
+       ew(hDlg, IDC_RTG_DISPLAYSELECT, rtg2);
+       ew(hDlg, IDC_RTG_VBINTERRUPT, rtg3);
+       if (!workprefs.gfx_api) {
+               workprefs.rtg_hardwaresprite = false;
+               CheckDlgButton(hDlg, IDC_RTG_HWSPRITE, FALSE);
+       }
+       ew(hDlg, IDC_RTG_HWSPRITE, rtg3 && workprefs.gfx_api);
+}
+
+static void values_to_expansiondlg(HWND hDlg)
+{
+       SendDlgItemMessage(hDlg, IDC_RTG_BUFFERCNT, CB_SETCURSEL, workprefs.gfx_apmode[1].gfx_backbuffers == 0 ? 0 : workprefs.gfx_apmode[1].gfx_backbuffers - 1, 0);
+
+       int min_mem = MIN_P96_MEM;
+       int max_mem = MAX_P96_MEM_Z3;
+       if (!gfxboard_is_z3(workprefs.rtgmem_type)) {
+               int v = workprefs.rtgmem_size;
+               max_mem = 0;
+               workprefs.rtgmem_size = 1024 * 1024;
+               while (getz2size(&workprefs) > 0) {
+                       workprefs.rtgmem_size *= 2;
+                       max_mem++;
+               }
+               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(workprefs.rtgmem_type))
+                       v = gfxboard_get_vram_max(workprefs.rtgmem_type);
+               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(workprefs.rtgmem_type))
+                       v = gfxboard_get_vram_min(workprefs.rtgmem_type);
+               workprefs.rtgmem_size = v;
+//             if (workprefs.rtgmem_size > 8 * 1024 * 1024)
+//                     mem_size = 8 * 1024 * 1024;
+               while (getz2size(&workprefs) < 0 && workprefs.rtgmem_size > 0)
+                       workprefs.rtgmem_size -= 1024 * 1024;
+       } else {
+               int v = workprefs.rtgmem_size;
+               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(workprefs.rtgmem_type))
+                       v = gfxboard_get_vram_max(workprefs.rtgmem_type);
+               if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(workprefs.rtgmem_type))
+                       v = gfxboard_get_vram_min(workprefs.rtgmem_type);
+               workprefs.rtgmem_size = v;
+       }
+       if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE) {
+               switch (gfxboard_get_vram_min(workprefs.rtgmem_type)) {
+                       case 0x00100000: min_mem = 1; break;
+                       case 0x00200000: min_mem = 2; break;
+                       case 0x00400000: min_mem = 3; break;
+               }
+               switch (gfxboard_get_vram_max(workprefs.rtgmem_type)) {
+                       case 0x00100000: max_mem = 1; break;
+                       case 0x00200000: max_mem = 2; break;
+                       case 0x00400000: max_mem = 3; break;
+               }
+       }
+       SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETRANGE, TRUE, MAKELONG(min_mem, max_mem));
+       int mem_size = 0;
+       switch (workprefs.rtgmem_size) {
+               case 0x00000000: mem_size = 0; break;
+               case 0x00100000: mem_size = 1; break;
+               case 0x00200000: mem_size = 2; break;
+               case 0x00400000: mem_size = 3; break;
+               case 0x00800000: mem_size = 4; break;
+               case 0x01000000: mem_size = 5; break;
+               case 0x02000000: mem_size = 6; break;
+               case 0x04000000: mem_size = 7; break;
+               case 0x08000000: mem_size = 8; break;
+               case 0x10000000: mem_size = 9; break;
+               case 0x20000000: mem_size = 10; break;
+               case 0x40000000: mem_size = 11; break;
+       }
+       SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETPOS, TRUE, mem_size);
+       SetDlgItemText(hDlg, IDC_P96RAM, memsize_names[msi_gfx[mem_size]]);
+
+       SendDlgItemMessage(hDlg, IDC_RTG_Z2Z3, CB_SETCURSEL, workprefs.rtgmem_size == 0 ? 0 : workprefs.rtgmem_type + 1, 0);
+       SendDlgItemMessage(hDlg, IDC_RTG_8BIT, CB_SETCURSEL, (workprefs.picasso96_modeflags & RGBFF_CLUT) ? 1 : 0, 0);
+       SendDlgItemMessage(hDlg, IDC_RTG_16BIT, CB_SETCURSEL,
+                                          (manybits(workprefs.picasso96_modeflags, RGBFF_R5G6B5PC | RGBFF_R5G6B5PC | RGBFF_R5G6B5 | RGBFF_R5G5B5 | RGBFF_B5G6R5PC | RGBFF_B5G5R5PC)) ? 1 :
+                                          (workprefs.picasso96_modeflags & RGBFF_R5G6B5PC) ? 2 :
+                                          (workprefs.picasso96_modeflags & RGBFF_R5G5B5PC) ? 3 :
+                                          (workprefs.picasso96_modeflags & RGBFF_R5G6B5) ? 4 :
+                                          (workprefs.picasso96_modeflags & RGBFF_R5G5B5) ? 5 :
+                                          (workprefs.picasso96_modeflags & RGBFF_B5G6R5PC) ? 6 :
+                                          (workprefs.picasso96_modeflags & RGBFF_B5G5R5PC) ? 7 : 0, 0);
+       SendDlgItemMessage(hDlg, IDC_RTG_24BIT, CB_SETCURSEL,
+                                          (manybits(workprefs.picasso96_modeflags, RGBFF_R8G8B8 | RGBFF_B8G8R8)) ? 1 :
+                                          (workprefs.picasso96_modeflags & RGBFF_R8G8B8) ? 2 :
+                                          (workprefs.picasso96_modeflags & RGBFF_B8G8R8) ? 3 : 0, 0);
+       SendDlgItemMessage(hDlg, IDC_RTG_32BIT, CB_SETCURSEL,
+                                          (manybits(workprefs.picasso96_modeflags, RGBFF_A8R8G8B8 | RGBFF_A8B8G8R8 | RGBFF_R8G8B8A8 | RGBFF_B8G8R8A8)) ? 1 :
+                                          (workprefs.picasso96_modeflags & RGBFF_A8R8G8B8) ? 2 :
+                                          (workprefs.picasso96_modeflags & RGBFF_A8B8G8R8) ? 3 :
+                                          (workprefs.picasso96_modeflags & RGBFF_R8G8B8A8) ? 4 :
+                                          (workprefs.picasso96_modeflags & RGBFF_B8G8R8A8) ? 5 : 0, 0);
+       if (workprefs.win32_rtgvblankrate <= 0 ||
+               workprefs.win32_rtgvblankrate == 50 ||
+               workprefs.win32_rtgvblankrate == 60 ||
+               workprefs.win32_rtgvblankrate == 70 ||
+               workprefs.win32_rtgvblankrate == 75) {
+               SendDlgItemMessage(hDlg, IDC_RTG_VBLANKRATE, CB_SETCURSEL,
+                                                  (workprefs.win32_rtgvblankrate == 0) ? 0 :
+                                                  (workprefs.win32_rtgvblankrate == -1) ? 1 :
+                                                  (workprefs.win32_rtgvblankrate == -2) ? 0 :
+                                                  (workprefs.win32_rtgvblankrate == 50) ? 2 :
+                                                  (workprefs.win32_rtgvblankrate == 60) ? 3 :
+                                                  (workprefs.win32_rtgvblankrate == 70) ? 4 :
+                                                  (workprefs.win32_rtgvblankrate == 75) ? 5 : 0, 0);
+       } else {
+               TCHAR tmp[10];
+               _stprintf(tmp, _T("%d"), workprefs.win32_rtgvblankrate);
+               SendDlgItemMessage(hDlg, IDC_RTG_VBLANKRATE, WM_SETTEXT, 0, (LPARAM) tmp);
+       }
+
+
+       CheckDlgButton(hDlg, IDC_RTG_SCALE, workprefs.gf[1].gfx_filter_autoscale == RTG_MODE_SCALE);
+       CheckDlgButton(hDlg, IDC_RTG_CENTER, workprefs.gf[1].gfx_filter_autoscale == RTG_MODE_CENTER);
+       CheckDlgButton(hDlg, IDC_RTG_SCALE_ALLOW, workprefs.win32_rtgallowscaling);
+       CheckDlgButton(hDlg, IDC_RTG_MATCH_DEPTH, workprefs.win32_rtgmatchdepth);
+       CheckDlgButton(hDlg, IDC_RTG_VBINTERRUPT, workprefs.rtg_hardwareinterrupt);
+       CheckDlgButton(hDlg, IDC_RTG_HWSPRITE, workprefs.rtg_hardwaresprite);
+
+       SendDlgItemMessage(hDlg, IDC_RTG_SCALE_ASPECTRATIO, CB_SETCURSEL,
+                                          (workprefs.win32_rtgscaleaspectratio == 0) ? 0 :
+                                          (workprefs.win32_rtgscaleaspectratio < 0) ? 1 :
+                                          getaspectratioindex(workprefs.win32_rtgscaleaspectratio) + 2, 0);
+}
+
+static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+       int v;
+       TCHAR tmp[100];
+       static int recursive = 0;
+       static int enumerated;
+
+       switch (msg)
+       {
+       case WM_INITDIALOG:
+               pages[EXPANSION_ID] = hDlg;
+               currentpage = EXPANSION_ID;
+
+               init_displays_combo (hDlg, true);
+
+               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_RESETCONTENT, 0, 0);
+               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("-"));
+               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("UAE Zorro II"));
+               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("UAE Zorro III (*)"));
+               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Picasso II  Zorro II"));
+               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Picasso II+  Zorro II"));
+               SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Piccolo Zorro II"));
                SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Piccolo Zorro III"));
                SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Piccolo SD64 Zorro II"));
                SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_ADDSTRING, 0, (LPARAM)_T("Piccolo SD64 Zorro III"));
@@ -8294,617 +8966,253 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP
                SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_ADDSTRING, 0, (LPARAM)_T("60"));
                SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_ADDSTRING, 0, (LPARAM)_T("70"));
                SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_ADDSTRING, 0, (LPARAM)_T("75"));
-               SendDlgItemMessage(hDlg, IDC_RTG_BUFFERCNT, CB_RESETCONTENT, 0, 0);
-               WIN32GUI_LoadUIString(IDS_BUFFER_DOUBLE, tmp, sizeof tmp / sizeof (TCHAR));
-               SendDlgItemMessage(hDlg, IDC_RTG_BUFFERCNT, CB_ADDSTRING, 0, (LPARAM)tmp);
-               WIN32GUI_LoadUIString(IDS_BUFFER_TRIPLE, tmp, sizeof tmp / sizeof (TCHAR));
-               SendDlgItemMessage(hDlg, IDC_RTG_BUFFERCNT, CB_ADDSTRING, 0, (LPARAM)tmp);
-
-       case WM_USER:
-               recursive++;
-               values_to_expansiondlg (hDlg);
-               enable_for_expansiondlg (hDlg);
-               values_to_memorydlg (hDlg);
-               enable_for_memorydlg (hDlg);
-               recursive--;
-               break;
-
-       case WM_HSCROLL:
-               workprefs.rtgmem_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0)]];
-               values_to_memorydlg (hDlg);
-               enable_for_memorydlg (hDlg);
-               break;
-
-       case WM_COMMAND:
-               {
-                       if (recursive > 0)
-                               break;
-                       recursive++;
-                       switch (LOWORD (wParam))
-                       {
-                       case IDC_RTG_MATCH_DEPTH:
-                               workprefs.win32_rtgmatchdepth = ischecked (hDlg, IDC_RTG_MATCH_DEPTH);
-                               break;
-                       case IDC_RTG_SCALE:
-                               workprefs.gf[1].gfx_filter_autoscale = ischecked(hDlg, IDC_RTG_SCALE) ? RTG_MODE_SCALE : 0;
-                               setchecked (hDlg, IDC_RTG_CENTER,  false);
-                               break;
-                       case IDC_RTG_CENTER:
-                               workprefs.gf[1].gfx_filter_autoscale = ischecked(hDlg, IDC_RTG_CENTER) ? RTG_MODE_CENTER : 0;
-                               setchecked (hDlg, IDC_RTG_SCALE,  false);
-                               break;
-                       case IDC_RTG_SCALE_ALLOW:
-                               workprefs.win32_rtgallowscaling = ischecked (hDlg, IDC_RTG_SCALE_ALLOW);
-                               break;
-                       case IDC_RTG_VBINTERRUPT:
-                               workprefs.rtg_hardwareinterrupt = ischecked (hDlg, IDC_RTG_VBINTERRUPT);
-                               break;
-                       case IDC_RTG_HWSPRITE:
-                               workprefs.rtg_hardwaresprite = ischecked (hDlg, IDC_RTG_HWSPRITE);
-                               break;
-                       case IDC_SOCKETS:
-                               workprefs.socket_emu = ischecked (hDlg, IDC_SOCKETS);
-                               break;
-                       case IDC_SCSIDEVICE:
-                               workprefs.scsi = ischecked (hDlg, IDC_SCSIDEVICE);
-                               enable_for_expansiondlg (hDlg);
-                               break;
-                       case IDC_SANA2:
-                               workprefs.sana2 = ischecked (hDlg, IDC_SANA2);
-                               break;
-                       case IDC_A2065:
-                       if (ischecked(hDlg, IDC_A2065)) {
-                               _tcscpy(workprefs.a2065name, _T("none"));
-                               expansion_net(hDlg);
-                               enable_for_expansiondlg(hDlg);
-                       } else {
-                               if (!workprefs.ne2000pciname[0])
-                                       ew(hDlg, IDC_NETDEVICE, FALSE);
-                               workprefs.a2065name[0] = 0;
-                               enable_for_expansiondlg(hDlg);
-                       }
-                       break;
-                       case IDC_NE2000:
-                       if (ischecked(hDlg, IDC_NE2000)) {
-                               _tcscpy(workprefs.ne2000pciname, _T("none"));
-                               expansion_net(hDlg);
-                               enable_for_expansiondlg(hDlg);
-                       } else {
-                               if (!workprefs.a2065name[0])
-                                       ew(hDlg, IDC_NETDEVICE, FALSE);
-                               workprefs.ne2000pciname[0] = 0;
-                               enable_for_expansiondlg(hDlg);
-                       }
-                       break;
-                       case IDC_CATWEASEL:
-                               workprefs.catweasel = ischecked (hDlg, IDC_CATWEASEL) ? -1 : 0;
-                               break;
-                       case IDC_CS_CD32FMV:
-                               workprefs.cs_cd32fmv = ischecked(hDlg, IDC_CS_CD32FMV) ? 1 : 0;
-                               break;
-                       case IDC_CS_TOCCATA:
-                               workprefs.sound_toccata = ischecked(hDlg, IDC_CS_TOCCATA) ? 1 : 0;
-                               if (!workprefs.sound_toccata)
-                                       workprefs.sound_toccata_mixer = false;
-                               enable_for_expansiondlg(hDlg);
-                               break;
-                       case IDC_CS_TOCCATAMIXER:
-                               workprefs.sound_toccata_mixer = ischecked(hDlg, IDC_CS_TOCCATAMIXER) ? 1 : 0;
-                               break;
-                       }
-                       if (HIWORD (wParam) == CBN_SELENDOK || HIWORD (wParam) == CBN_KILLFOCUS || HIWORD (wParam) == CBN_EDITCHANGE)  {
-                               uae_u32 mask = workprefs.picasso96_modeflags;
-                               switch (LOWORD (wParam))
-                               {
-                               case IDC_RTG_DISPLAYSELECT:
-                                       get_displays_combo (hDlg, true);
-                                       break;
-                               case  IDC_RTG_BUFFERCNT:
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_BUFFERCNT, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               v++;
-                                               workprefs.gfx_apmode[1].gfx_backbuffers = v;
-                                       }
-                                       break;
-                               case IDC_RTG_SCALE_ASPECTRATIO:
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_SCALE_ASPECTRATIO, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               if (v == 0)
-                                                       workprefs.win32_rtgscaleaspectratio = 0;
-                                               else if (v == 1)
-                                                       workprefs.win32_rtgscaleaspectratio = -1;
-                                               else if (v >= 2)
-                                                       workprefs.win32_rtgscaleaspectratio = getaspectratio (v - 2);
-                                       }
-                                       break;
-                               case IDC_RTG_Z2Z3:
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               if (v == 0) {
-                                                       workprefs.rtgmem_type = 1;
-                                                       workprefs.rtgmem_size = 0;
-                                               } else {
-                                                       workprefs.rtgmem_type = v - 1;
-                                                       if (workprefs.rtgmem_size == 0)
-                                                               workprefs.rtgmem_size = 4096 * 1024;
-                                               }
-                                               enable_for_expansiondlg (hDlg);
-                                       }
-                                       break;
-                               case IDC_RTG_8BIT:
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_8BIT, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               mask &= ~RGBFF_CLUT;
-                                               if (v == 1)
-                                                       mask |= RGBFF_CLUT;
-                                       }
-                                       break;
-                               case IDC_RTG_16BIT:
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_16BIT, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               mask &= ~(RGBFF_R5G6B5PC | RGBFF_R5G5B5PC | RGBFF_R5G6B5 | RGBFF_R5G5B5 | RGBFF_B5G6R5PC | RGBFF_B5G5R5PC);
-                                               if (v == 1)
-                                                       mask |= RGBFF_R5G6B5PC | RGBFF_R5G6B5PC | RGBFF_R5G5B5PC | RGBFF_R5G6B5 | RGBFF_R5G5B5 | RGBFF_B5G6R5PC | RGBFF_B5G5R5PC;
-                                               if (v == 2)
-                                                       mask |= RGBFF_R5G6B5PC;
-                                               if (v == 3)
-                                                       mask |= RGBFF_R5G5B5PC;
-                                               if (v == 4)
-                                                       mask |= RGBFF_R5G6B5;
-                                               if (v == 5)
-                                                       mask |= RGBFF_R5G5B5;
-                                               if (v == 6)
-                                                       mask |= RGBFF_B5G6R5PC;
-                                               if (v == 7)
-                                                       mask |= RGBFF_B5G5R5PC;
-                                       }
-                                       break;
-                               case IDC_RTG_24BIT:
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_24BIT, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               mask &= ~(RGBFF_R8G8B8 | RGBFF_B8G8R8);
-                                               if (v == 1)
-                                                       mask |= RGBFF_R8G8B8 | RGBFF_B8G8R8;
-                                               if (v == 2)
-                                                       mask |= RGBFF_R8G8B8;
-                                               if (v == 3)
-                                                       mask |= RGBFF_B8G8R8;
-                                       }
-                                       break;
-                               case IDC_RTG_32BIT:
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_32BIT, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               mask &= ~(RGBFF_A8R8G8B8 | RGBFF_A8B8G8R8 | RGBFF_R8G8B8A8 | RGBFF_B8G8R8A8);
-                                               if (v == 1)
-                                                       mask |= RGBFF_A8R8G8B8 | RGBFF_A8B8G8R8 | RGBFF_R8G8B8A8 | RGBFF_B8G8R8A8;
-                                               if (v == 2)
-                                                       mask |= RGBFF_A8R8G8B8;
-                                               if (v == 3)
-                                                       mask |= RGBFF_A8B8G8R8;
-                                               if (v == 4)
-                                                       mask |= RGBFF_R8G8B8A8;
-                                               if (v == 5)
-                                                       mask |= RGBFF_B8G8R8A8;
-                                       }
-                                       break;
-                               case IDC_RTG_VBLANKRATE:
-                                       tmp[0] = 0;
-                                       v = SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               if (v == 0) {
-                                                       workprefs.win32_rtgvblankrate = 0;
-                                               } else if (v == 1) {
-                                                       workprefs.win32_rtgvblankrate = -1;
-                                               } else {
-                                                       v = SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_GETLBTEXT, (WPARAM)v, (LPARAM)tmp);
-                                               }
-                                       } else {
-                                               v = SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, WM_GETTEXT, (WPARAM)sizeof tmp / sizeof (TCHAR), (LPARAM)tmp);
-                                       }
-                                       if (tmp[0])
-                                               workprefs.win32_rtgvblankrate = _tstol (tmp);
-                                       break;
-                               case IDC_NETDEVICE:
-                                       v = SendDlgItemMessage (hDlg, IDC_NETDEVICE, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR) {
-                                               const TCHAR *s;
-                                               if (v == 0) {
-                                                       s = _T("none");
-                                               } else if (ndd) {
-                                                       v--;
-                                                       s = ndd[v]->name;
-                                               }
-                                               if (ischecked(hDlg, IDC_A2065))
-                                                       _tcscpy(workprefs.a2065name, s);
-                                               if (ischecked(hDlg, IDC_NE2000))
-                                                       _tcscpy(workprefs.ne2000pciname, s);
-                                       }
-                                       break;
-
-                               }
-                               workprefs.picasso96_modeflags = mask;
-                               values_to_memorydlg (hDlg);
-                       }
-                       recursive--;
-               }
-               break;
-       }
-       return FALSE;
-}
-
-static void updatecpuboardsubtypes(HWND hDlg)
-{
-       SendDlgItemMessage (hDlg, IDC_CPUBOARD_SUBTYPE, CB_RESETCONTENT, 0, 0);
-       for (int i = 0; cpuboards[workprefs.cpuboard_type].subtypes[i].name; i++) {
-               SendDlgItemMessage(hDlg, IDC_CPUBOARD_SUBTYPE, CB_ADDSTRING, 0, (LPARAM)cpuboards[workprefs.cpuboard_type].subtypes[i].name);
-       }
-       const struct expansionboardsettings *cbs = cpuboards[workprefs.cpuboard_type].subtypes[workprefs.cpuboard_subtype].settings;
-       int i = 0;
-       if (cbs) {
-               for (i = 0; cbs[i].name; i++) {
-                       int id = cpuboard_settings_id[i];
-                       if (id < 0)
-                               break;
-                       SetWindowText (GetDlgItem(hDlg, id), cbs[i].name);
-               }
-       }
-       while (cpuboard_settings_id[i] >= 0) {
-               int id = cpuboard_settings_id[i];
-               SetWindowText (GetDlgItem(hDlg, id), _T("-"));
-               i++;
-       }
-}
-
-static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
-       static int recursive = 0;
-       int v;
-
-       switch (msg)
-       {
-       case WM_INITDIALOG:
-               recursive++;
-               pages[MEMORY_ID] = hDlg;
-               currentpage = MEMORY_ID;
-               SendDlgItemMessage (hDlg, IDC_CHIPMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_CHIP_MEM, MAX_CHIP_MEM));
-               SendDlgItemMessage (hDlg, IDC_FASTMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_FAST_MEM, MAX_FAST_MEM));
-               SendDlgItemMessage (hDlg, IDC_FASTMEM2, TBM_SETRANGE, TRUE, MAKELONG (MIN_FAST_MEM, MAX_FAST_MEM));
-               SendDlgItemMessage (hDlg, IDC_SLOWMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_SLOW_MEM, MAX_SLOW_MEM));
-               SendDlgItemMessage (hDlg, IDC_Z3FASTMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_Z3_MEM, MAX_Z3_MEM));
-               SendDlgItemMessage (hDlg, IDC_Z3CHIPMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_Z3_MEM, MAX_Z3_CHIPMEM));
-               SendDlgItemMessage (hDlg, IDC_MBMEM1, TBM_SETRANGE, TRUE, MAKELONG (MIN_MB_MEM, MAX_MBL_MEM));
-               SendDlgItemMessage (hDlg, IDC_MBMEM2, TBM_SETRANGE, TRUE, MAKELONG (MIN_MB_MEM, MAX_MBH_MEM));
-               CheckDlgButton(hDlg, IDC_FASTMEMAUTOCONFIG, workprefs.fastmem_autoconfig);
-               SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_RESETCONTENT, 0, 0);
-               SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_ADDSTRING, 0, (LPARAM)_T("Automatic (*)"));
-               SendDlgItemMessage(hDlg, IDC_Z3MAPPING, CB_ADDSTRING, 0, (LPARAM)_T("UAE"));
-               SendDlgItemMessage(hDlg, IDC_Z3MAPPING, CB_ADDSTRING, 0, (LPARAM)_T("Real"));
-               SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_SETCURSEL, workprefs.z3_mapping_mode, 0);
-               SendDlgItemMessage (hDlg, IDC_CPUBOARD_TYPE, CB_RESETCONTENT, 0, 0);
-               for (int i = 0; cpuboards[i].name; i++) {
-                       SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_ADDSTRING, 0, (LPARAM)cpuboards[i].name);
-               }
-               updatecpuboardsubtypes(hDlg);
-               setcpuboardmemsize(hDlg);
-               recursive--;
+               SendDlgItemMessage(hDlg, IDC_RTG_BUFFERCNT, CB_RESETCONTENT, 0, 0);
+               WIN32GUI_LoadUIString(IDS_BUFFER_DOUBLE, tmp, sizeof tmp / sizeof (TCHAR));
+               SendDlgItemMessage(hDlg, IDC_RTG_BUFFERCNT, CB_ADDSTRING, 0, (LPARAM)tmp);
+               WIN32GUI_LoadUIString(IDS_BUFFER_TRIPLE, tmp, sizeof tmp / sizeof (TCHAR));
+               SendDlgItemMessage(hDlg, IDC_RTG_BUFFERCNT, CB_ADDSTRING, 0, (LPARAM)tmp);
 
        case WM_USER:
                recursive++;
-               fix_values_memorydlg ();
-               values_to_memorydlg (hDlg);
-               enable_for_memorydlg (hDlg);
+               values_to_expansiondlg (hDlg);
+               enable_for_expansiondlg (hDlg);
                recursive--;
                break;
 
+       case WM_HSCROLL:
+               workprefs.rtgmem_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0)]];
+               values_to_expansiondlg(hDlg);
+               enable_for_expansiondlg(hDlg);
+               break;
+
        case WM_COMMAND:
-               if (!recursive) {
+               {
+                       if (recursive > 0)
+                               break;
                        recursive++;
-                       if (HIWORD (wParam) == CBN_SELCHANGE || HIWORD (wParam) == CBN_KILLFOCUS)  {
+                       switch (LOWORD (wParam))
+                       {
+                       case IDC_RTG_MATCH_DEPTH:
+                               workprefs.win32_rtgmatchdepth = ischecked (hDlg, IDC_RTG_MATCH_DEPTH);
+                               break;
+                       case IDC_RTG_SCALE:
+                               workprefs.gf[1].gfx_filter_autoscale = ischecked(hDlg, IDC_RTG_SCALE) ? RTG_MODE_SCALE : 0;
+                               setchecked (hDlg, IDC_RTG_CENTER,  false);
+                               break;
+                       case IDC_RTG_CENTER:
+                               workprefs.gf[1].gfx_filter_autoscale = ischecked(hDlg, IDC_RTG_CENTER) ? RTG_MODE_CENTER : 0;
+                               setchecked (hDlg, IDC_RTG_SCALE,  false);
+                               break;
+                       case IDC_RTG_SCALE_ALLOW:
+                               workprefs.win32_rtgallowscaling = ischecked (hDlg, IDC_RTG_SCALE_ALLOW);
+                               break;
+                       case IDC_RTG_VBINTERRUPT:
+                               workprefs.rtg_hardwareinterrupt = ischecked (hDlg, IDC_RTG_VBINTERRUPT);
+                               break;
+                       case IDC_RTG_HWSPRITE:
+                               workprefs.rtg_hardwaresprite = ischecked (hDlg, IDC_RTG_HWSPRITE);
+                               break;
+                       }
+                       if (HIWORD (wParam) == CBN_SELENDOK || HIWORD (wParam) == CBN_KILLFOCUS || HIWORD (wParam) == CBN_EDITCHANGE)  {
+                               uae_u32 mask = workprefs.picasso96_modeflags;
                                switch (LOWORD (wParam))
                                {
-                                       case IDC_Z3MAPPING:
-                                       v = SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_GETCURSEL, 0, 0L);
+                               case IDC_RTG_DISPLAYSELECT:
+                                       get_displays_combo (hDlg, true);
+                                       break;
+                               case  IDC_RTG_BUFFERCNT:
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_BUFFERCNT, CB_GETCURSEL, 0, 0L);
                                        if (v != CB_ERR) {
-                                               workprefs.z3_mapping_mode = v;
+                                               v++;
+                                               workprefs.gfx_apmode[1].gfx_backbuffers = v;
                                        }
                                        break;
-                                       case IDC_CPUBOARD_TYPE:
-                                       v = SendDlgItemMessage (hDlg, IDC_CPUBOARD_TYPE, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR && v != workprefs.cpuboard_type) {
-                                               workprefs.cpuboard_type = v;
-                                               workprefs.cpuboard_subtype = 0;
-                                               workprefs.cpuboard_settings = 0;
-                                               updatecpuboardsubtypes(hDlg);
-                                               if (is_ppc_cpu(&workprefs)) {
-                                                       workprefs.ppc_mode = 2;
-                                               } else if (workprefs.ppc_mode == 2) {
-                                                       workprefs.ppc_mode = 0;
-                                               }
-                                               built_in_cpuboard_prefs(&workprefs);
-                                               setcpuboardmemsize(hDlg);
-                                               enable_for_memorydlg(hDlg);
+                               case IDC_RTG_SCALE_ASPECTRATIO:
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_SCALE_ASPECTRATIO, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               if (v == 0)
+                                                       workprefs.win32_rtgscaleaspectratio = 0;
+                                               else if (v == 1)
+                                                       workprefs.win32_rtgscaleaspectratio = -1;
+                                               else if (v >= 2)
+                                                       workprefs.win32_rtgscaleaspectratio = getaspectratio (v - 2);
                                        }
                                        break;
-                                       case IDC_CPUBOARD_SUBTYPE:
-                                       v = SendDlgItemMessage (hDlg, IDC_CPUBOARD_SUBTYPE, CB_GETCURSEL, 0, 0L);
-                                       if (v != CB_ERR && v != workprefs.cpuboard_subtype) {
-                                               workprefs.cpuboard_subtype = v;
-                                               workprefs.cpuboard_settings = 0;
-                                               if (is_ppc_cpu(&workprefs)) {
-                                                       workprefs.ppc_mode = 2;
-                                               } else if (workprefs.ppc_mode == 2) {
-                                                       workprefs.ppc_mode = 0;
+                               case IDC_RTG_Z2Z3:
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               if (v == 0) {
+                                                       workprefs.rtgmem_type = 1;
+                                                       workprefs.rtgmem_size = 0;
+                                               } else {
+                                                       workprefs.rtgmem_type = v - 1;
+                                                       if (workprefs.rtgmem_size == 0)
+                                                               workprefs.rtgmem_size = 4096 * 1024;
                                                }
-                                               built_in_cpuboard_prefs(&workprefs);
-                                               setcpuboardmemsize(hDlg);
-                                               enable_for_memorydlg(hDlg);
+                                               enable_for_expansiondlg (hDlg);
                                        }
                                        break;
-                               }
-                       }
-                       workprefs.fastmem_autoconfig = ischecked (hDlg, IDC_FASTMEMAUTOCONFIG);
-                       for (int i = 0; cpuboard_settings_id[i] >= 0; i++) {
-                               workprefs.cpuboard_settings &= ~(1 << i);
-                               if (ischecked(hDlg, cpuboard_settings_id[i]))
-                                       workprefs.cpuboard_settings |= 1 << i;
-                       }
-                       recursive--;
-               }
-               break;
-
-       case WM_HSCROLL:
-               workprefs.chipmem_size = memsizes[msi_chip[SendMessage (GetDlgItem (hDlg, IDC_CHIPMEM), TBM_GETPOS, 0, 0)]];
-               workprefs.bogomem_size = memsizes[msi_bogo[SendMessage (GetDlgItem (hDlg, IDC_SLOWMEM), TBM_GETPOS, 0, 0)]];
-               workprefs.fastmem_size = memsizes[msi_fast[SendMessage (GetDlgItem (hDlg, IDC_FASTMEM), TBM_GETPOS, 0, 0)]];
-               workprefs.fastmem2_size = memsizes[msi_fast[SendMessage (GetDlgItem (hDlg, IDC_FASTMEM2), TBM_GETPOS, 0, 0)]];
-               workprefs.z3fastmem_size = memsizes[msi_z3fast[SendMessage (GetDlgItem (hDlg, IDC_Z3FASTMEM), TBM_GETPOS, 0, 0)]];
-               updatez3 (&workprefs.z3fastmem_size, &workprefs.z3fastmem2_size);
-               workprefs.z3chipmem_size = memsizes[msi_z3chip[SendMessage (GetDlgItem (hDlg, IDC_Z3CHIPMEM), TBM_GETPOS, 0, 0)]];
-               workprefs.mbresmem_low_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM1), TBM_GETPOS, 0, 0)]];
-               workprefs.mbresmem_high_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM2), TBM_GETPOS, 0, 0)]];
-               workprefs.cpuboardmem1_size = memsizes[msi_cpuboard[SendMessage (GetDlgItem (hDlg, IDC_CPUBOARDMEM), TBM_GETPOS, 0, 0)]];
-               fix_values_memorydlg ();
-               values_to_memorydlg (hDlg);
-               enable_for_memorydlg (hDlg);
-               break;
-
-       }
-       return FALSE;
-}
-
-static void addromfiles (UAEREG *fkey, HWND hDlg, DWORD d, const TCHAR *path, int type1, int type2)
-{
-       int idx;
-       TCHAR tmp[MAX_DPATH];
-       TCHAR tmp2[MAX_DPATH];
-       TCHAR seltmp[MAX_DPATH];
-       struct romdata *rdx = NULL;
-
-       SendDlgItemMessage(hDlg, d, CB_RESETCONTENT, 0, 0);
-       SendDlgItemMessage(hDlg, d, CB_ADDSTRING, 0, (LPARAM)_T(""));
-       if (path)
-               rdx = scan_single_rom (path);
-       idx = 0;
-       seltmp[0] = 0;
-       for (;fkey;) {
-               int size = sizeof (tmp) / sizeof (TCHAR);
-               int size2 = sizeof (tmp2) / sizeof (TCHAR);
-               if (!regenumstr (fkey, idx, tmp, &size, tmp2, &size2))
-                       break;
-               if (_tcslen (tmp) == 7 || _tcslen (tmp) == 13) {
-                       int group = 0;
-                       int subitem = 0;
-                       int idx2 = _tstol (tmp + 4);
-                       if (_tcslen (tmp) == 13) {
-                               group = _tstol (tmp + 8);
-                               subitem = _tstol (tmp + 11);
-                       }
-                       if (idx2 >= 0) {
-                               struct romdata *rd = getromdatabyidgroup (idx2, group, subitem);
-                               for (int i = 0; i < 2; i++) {
-                                       int type = i ? type2 : type1;
-                                       if (type) {
-                                               if (rd && ((((rd->type & ROMTYPE_GROUP_MASK) & (type & ROMTYPE_GROUP_MASK)) && ((rd->type & ROMTYPE_SUB_MASK) == (type & ROMTYPE_SUB_MASK) || !(type & ROMTYPE_SUB_MASK))) ||
-                                                       (rd->type & type) == ROMTYPE_NONE || (rd->type & type) == ROMTYPE_NOT)) {
-                                                       getromname (rd, tmp);
-                                                       if (SendDlgItemMessage (hDlg, d, CB_FINDSTRING, (WPARAM)-1, (LPARAM)tmp) < 0)
-                                                               SendDlgItemMessage(hDlg, d, CB_ADDSTRING, 0, (LPARAM)tmp);
-                                                       if (rd == rdx)
-                                                               _tcscpy (seltmp, tmp);
-                                                       break;
-                                               }
+                               case IDC_RTG_8BIT:
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_8BIT, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               mask &= ~RGBFF_CLUT;
+                                               if (v == 1)
+                                                       mask |= RGBFF_CLUT;
+                                       }
+                                       break;
+                               case IDC_RTG_16BIT:
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_16BIT, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               mask &= ~(RGBFF_R5G6B5PC | RGBFF_R5G5B5PC | RGBFF_R5G6B5 | RGBFF_R5G5B5 | RGBFF_B5G6R5PC | RGBFF_B5G5R5PC);
+                                               if (v == 1)
+                                                       mask |= RGBFF_R5G6B5PC | RGBFF_R5G6B5PC | RGBFF_R5G5B5PC | RGBFF_R5G6B5 | RGBFF_R5G5B5 | RGBFF_B5G6R5PC | RGBFF_B5G5R5PC;
+                                               if (v == 2)
+                                                       mask |= RGBFF_R5G6B5PC;
+                                               if (v == 3)
+                                                       mask |= RGBFF_R5G5B5PC;
+                                               if (v == 4)
+                                                       mask |= RGBFF_R5G6B5;
+                                               if (v == 5)
+                                                       mask |= RGBFF_R5G5B5;
+                                               if (v == 6)
+                                                       mask |= RGBFF_B5G6R5PC;
+                                               if (v == 7)
+                                                       mask |= RGBFF_B5G5R5PC;
+                                       }
+                                       break;
+                               case IDC_RTG_24BIT:
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_24BIT, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               mask &= ~(RGBFF_R8G8B8 | RGBFF_B8G8R8);
+                                               if (v == 1)
+                                                       mask |= RGBFF_R8G8B8 | RGBFF_B8G8R8;
+                                               if (v == 2)
+                                                       mask |= RGBFF_R8G8B8;
+                                               if (v == 3)
+                                                       mask |= RGBFF_B8G8R8;
                                        }
-                               }
-                       }
-               }
-               idx++;
-       }
-       if (seltmp[0])
-               SendDlgItemMessage (hDlg, d, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)seltmp);
-       else
-               SetDlgItemText(hDlg, d, path);
-}
-
-static void getromfile (HWND hDlg, DWORD d, TCHAR *path, int size)
-{
-       LRESULT val = SendDlgItemMessage (hDlg, d, CB_GETCURSEL, 0, 0L);
-       if (val == CB_ERR) {
-               SendDlgItemMessage (hDlg, d, WM_GETTEXT, (WPARAM)size, (LPARAM)path);
-       } else {
-               TCHAR tmp1[MAX_DPATH];
-               struct romdata *rd;
-               SendDlgItemMessage (hDlg, d, CB_GETLBTEXT, (WPARAM)val, (LPARAM)tmp1);
-               path[0] = 0;
-               rd = getromdatabyname (tmp1);
-               if (rd) {
-                       struct romlist *rl = getromlistbyromdata(rd);
-                       if (rd->configname)
-                               _stprintf (path, _T(":%s"), rd->configname);
-                       else if (rl)
-                               _tcsncpy (path, rl->path, size);
-               }
-       }
-}
-
-static const int expansion_settings_id[] = { IDC_EXPANSION_SETTING1, IDC_EXPANSION_SETTING2, -1 };
-
-static void values_to_kickstartdlg_sub(HWND hDlg)
-{
-       SendDlgItemMessage(hDlg, IDC_CPUBOARDROMSUBSELECT, CB_RESETCONTENT, 0, 0);
-       ew(hDlg, IDC_CPUBOARDROMSUBSELECT, false);
-
-       SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_RESETCONTENT, 0, 0);
-       const struct expansionromtype *er = &expansionroms[scsiromselected];
-       const struct expansionsubromtype *srt = er->subtypes;
-       ew(hDlg, IDC_SCSIROMSUBSELECT, srt != NULL);
-       while (srt && srt->name) {
-               SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_ADDSTRING, 0, (LPARAM)srt->name);
-               srt++;
-       }
-       int index;
-       struct boardromconfig *brc = get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
-       if (brc) {
-               SendDlgItemMessage (hDlg, IDC_SCSIROMSUBSELECT, CB_SETCURSEL, brc->roms[index].subtype, 0);
-               SendDlgItemMessage (hDlg, IDC_SCSIROMID, CB_SETCURSEL, brc->roms[index].device_id, 0);
-       } else if (srt) {
-               SendDlgItemMessage (hDlg, IDC_SCSIROMSUBSELECT, CB_SETCURSEL, 0, 0);
-               SendDlgItemMessage (hDlg, IDC_SCSIROMID, CB_SETCURSEL, 0, 0);
-       }
-       if (er->zorro < 2 || er->singleonly) {
-               scsiromselectednum = 0;
-               SendDlgItemMessage (hDlg, IDC_SCSIROMSELECTNUM, CB_SETCURSEL, 0, 0);
-       }
-       ew(hDlg, IDC_SCSIROMSELECTNUM, er->zorro >= 2 && !er->singleonly);
-}
-
-static void values_from_kickstartdlg (HWND hDlg)
-{
-       int index;
-       struct boardromconfig *brc;
-       TCHAR tmp[MAX_DPATH];
-
-       getromfile(hDlg, IDC_ROMFILE, workprefs.romfile, sizeof (workprefs.romfile) / sizeof (TCHAR));
-       getromfile(hDlg, IDC_ROMFILE2, workprefs.romextfile, sizeof (workprefs.romextfile) / sizeof (TCHAR));
-       getromfile(hDlg, IDC_CARTFILE, workprefs.cartfile, sizeof (workprefs.cartfile) / sizeof (TCHAR));
-
-       getromfile(hDlg, IDC_SCSIROMFILE, tmp, MAX_DPATH / sizeof (TCHAR));
-       if (tmp[0]) {
-               const struct expansionromtype *ert = &expansionroms[scsiromselected];
-               brc = get_device_rom_new(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
-               bool changed = _tcscmp(tmp, brc->roms[index].romfile) != 0;
-               getromfile(hDlg, IDC_SCSIROMFILE, brc->roms[index].romfile, MAX_DPATH / sizeof (TCHAR));
-               brc->roms[index].autoboot_disabled = ischecked(hDlg, IDC_SCSIROMFILEAUTOBOOT);
-
-               int v = SendDlgItemMessage (hDlg, IDC_SCSIROMID, CB_GETCURSEL, 0, 0L);
-               if (v != CB_ERR)
-                       brc->roms[index].device_id = v;
-
-               const struct expansionboardsettings *cbs = ert->settings;
-               if (cbs) {
-                       for (int i = 0; cbs[i].name; i++) {
-                               int id = expansion_settings_id[i];
-                               if (id < 0)
                                        break;
-                               brc->roms[index].device_settings &= ~(1 << i);
-                               if (ischecked(hDlg, id))
-                                       brc->roms[index].device_settings |= 1 << i;
+                               case IDC_RTG_32BIT:
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_32BIT, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               mask &= ~(RGBFF_A8R8G8B8 | RGBFF_A8B8G8R8 | RGBFF_R8G8B8A8 | RGBFF_B8G8R8A8);
+                                               if (v == 1)
+                                                       mask |= RGBFF_A8R8G8B8 | RGBFF_A8B8G8R8 | RGBFF_R8G8B8A8 | RGBFF_B8G8R8A8;
+                                               if (v == 2)
+                                                       mask |= RGBFF_A8R8G8B8;
+                                               if (v == 3)
+                                                       mask |= RGBFF_A8B8G8R8;
+                                               if (v == 4)
+                                                       mask |= RGBFF_R8G8B8A8;
+                                               if (v == 5)
+                                                       mask |= RGBFF_B8G8R8A8;
+                                       }
+                                       break;
+                               case IDC_RTG_VBLANKRATE:
+                                       tmp[0] = 0;
+                                       v = SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               if (v == 0) {
+                                                       workprefs.win32_rtgvblankrate = 0;
+                                               } else if (v == 1) {
+                                                       workprefs.win32_rtgvblankrate = -1;
+                                               } else {
+                                                       v = SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, CB_GETLBTEXT, (WPARAM)v, (LPARAM)tmp);
+                                               }
+                                       } else {
+                                               v = SendDlgItemMessage (hDlg, IDC_RTG_VBLANKRATE, WM_GETTEXT, (WPARAM)sizeof tmp / sizeof (TCHAR), (LPARAM)tmp);
+                                       }
+                                       if (tmp[0])
+                                               workprefs.win32_rtgvblankrate = _tstol (tmp);
+                                       break;
+                               }
+                               workprefs.picasso96_modeflags = mask;
+                               values_to_expansiondlg (hDlg);
                        }
+                       recursive--;
                }
-
-               v = SendDlgItemMessage (hDlg, IDC_SCSIROMSUBSELECT, CB_GETCURSEL, 0, 0L);
-               if (v != CB_ERR)
-                       brc->roms[index].subtype = v;
-
-               if (changed)
-                       values_to_kickstartdlg_sub(hDlg);
-       } else {
-               brc = get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
-               clear_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum);
-               if (brc && brc->roms[index].romfile[0])
-                       values_to_kickstartdlg_sub(hDlg);
-       }
-       getromfile(hDlg, IDC_CPUBOARDROMFILE, tmp, sizeof(brc->roms[index].romfile) / sizeof(TCHAR));
-       if (tmp[0]) {
-               brc = get_device_rom_new(&workprefs, ROMTYPE_CPUBOARD, 0, &index);
-               getromfile(hDlg, IDC_CPUBOARDROMFILE, brc->roms[index].romfile, sizeof(brc->roms[index].romfile) / sizeof(TCHAR));
-       } else {
-               clear_device_rom(&workprefs, ROMTYPE_CPUBOARD, 0);
+               break;
        }
+       return FALSE;
 }
 
-static void values_to_kickstartdlg_expansion_roms(HWND hDlg, UAEREG *fkey)
+static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 {
-       int index;
-       bool keyallocated = false;
-       struct boardromconfig *brc;
+       static int recursive = 0;
+       int v;
 
-       if (!fkey) {
-               fkey = regcreatetree(NULL, _T("DetectedROMs"));
-               keyallocated = true;
-       }
-       if (scsiromselected) {
-               const struct expansionromtype *ert = &expansionroms[scsiromselected];
-               int romtype = ert->romtype;
-               int romtype_extra = ert->romtype_extra;
+       switch (msg)
+       {
+       case WM_INITDIALOG:
+               recursive++;
+               pages[MEMORY_ID] = hDlg;
+               currentpage = MEMORY_ID;
+               SendDlgItemMessage (hDlg, IDC_CHIPMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_CHIP_MEM, MAX_CHIP_MEM));
+               SendDlgItemMessage (hDlg, IDC_FASTMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_FAST_MEM, MAX_FAST_MEM));
+               SendDlgItemMessage (hDlg, IDC_FASTMEM2, TBM_SETRANGE, TRUE, MAKELONG (MIN_FAST_MEM, MAX_FAST_MEM));
+               SendDlgItemMessage (hDlg, IDC_SLOWMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_SLOW_MEM, MAX_SLOW_MEM));
+               SendDlgItemMessage (hDlg, IDC_Z3FASTMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_Z3_MEM, MAX_Z3_MEM));
+               SendDlgItemMessage (hDlg, IDC_Z3CHIPMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_Z3_MEM, MAX_Z3_CHIPMEM));
+               SendDlgItemMessage (hDlg, IDC_MBMEM1, TBM_SETRANGE, TRUE, MAKELONG (MIN_MB_MEM, MAX_MBL_MEM));
+               SendDlgItemMessage (hDlg, IDC_MBMEM2, TBM_SETRANGE, TRUE, MAKELONG (MIN_MB_MEM, MAX_MBH_MEM));
+               CheckDlgButton(hDlg, IDC_FASTMEMAUTOCONFIG, workprefs.fastmem_autoconfig);
+               SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_RESETCONTENT, 0, 0);
+               SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_ADDSTRING, 0, (LPARAM)_T("Automatic (*)"));
+               SendDlgItemMessage(hDlg, IDC_Z3MAPPING, CB_ADDSTRING, 0, (LPARAM)_T("UAE"));
+               SendDlgItemMessage(hDlg, IDC_Z3MAPPING, CB_ADDSTRING, 0, (LPARAM)_T("Real"));
+               SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_SETCURSEL, workprefs.z3_mapping_mode, 0);
+               recursive--;
 
-               brc = get_device_rom(&workprefs, romtype, scsiromselectednum, &index);
-               if (brc && ert->subtypes) {
-                       const struct expansionsubromtype *esrt = &ert->subtypes[brc->roms[index].subtype];
-                       if (esrt->romtype) {
-                               romtype = esrt->romtype;
-                               romtype_extra = 0;
+       case WM_USER:
+               recursive++;
+               fix_values_memorydlg ();
+               values_to_memorydlg (hDlg);
+               enable_for_memorydlg (hDlg);
+               recursive--;
+               break;
+
+       case WM_COMMAND:
+               if (!recursive) {
+                       recursive++;
+                       if (HIWORD (wParam) == CBN_SELCHANGE || HIWORD (wParam) == CBN_KILLFOCUS)  {
+                               switch (LOWORD (wParam))
+                               {
+                                       case IDC_Z3MAPPING:
+                                       v = SendDlgItemMessage (hDlg, IDC_Z3MAPPING, CB_GETCURSEL, 0, 0L);
+                                       if (v != CB_ERR) {
+                                               workprefs.z3_mapping_mode = v;
+                                       }
+                                       break;
+                               }
                        }
+                       workprefs.fastmem_autoconfig = ischecked (hDlg, IDC_FASTMEMAUTOCONFIG);
+                       recursive--;
                }
-               addromfiles(fkey, hDlg, IDC_SCSIROMFILE, brc ? brc->roms[index].romfile : NULL, romtype, romtype_extra);
-               CheckDlgButton(hDlg, IDC_SCSIROMFILEAUTOBOOT, brc && brc->roms[index].autoboot_disabled);
-       }
-       if (keyallocated)
-               regclosetree(fkey);
-}
+               break;
 
-static void values_to_kickstartdlg_expansion_settings(HWND hDlg)
-{
-       int index;
-       struct boardromconfig *brc;
-       const struct expansionromtype *ert = &expansionroms[scsiromselected];
-       brc = get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
-       if (brc) {
-               if (brc->roms[index].romfile[0])
-                       ew(hDlg, IDC_SCSIROMFILEAUTOBOOT, ert->autoboot_jumper);
-       } else {
-               if (brc)
-                       brc->roms[index].autoboot_disabled = false;
-               ew(hDlg, IDC_SCSIROMFILEAUTOBOOT, FALSE);
-               setchecked(hDlg, IDC_SCSIROMFILEAUTOBOOT, false);
-       }
-       ew(hDlg, IDC_SCSIROMID, ert->id_jumper);
+       case WM_HSCROLL:
+               workprefs.chipmem_size = memsizes[msi_chip[SendMessage (GetDlgItem (hDlg, IDC_CHIPMEM), TBM_GETPOS, 0, 0)]];
+               workprefs.bogomem_size = memsizes[msi_bogo[SendMessage (GetDlgItem (hDlg, IDC_SLOWMEM), TBM_GETPOS, 0, 0)]];
+               workprefs.fastmem_size = memsizes[msi_fast[SendMessage (GetDlgItem (hDlg, IDC_FASTMEM), TBM_GETPOS, 0, 0)]];
+               workprefs.fastmem2_size = memsizes[msi_fast[SendMessage (GetDlgItem (hDlg, IDC_FASTMEM2), TBM_GETPOS, 0, 0)]];
+               workprefs.z3fastmem_size = memsizes[msi_z3fast[SendMessage (GetDlgItem (hDlg, IDC_Z3FASTMEM), TBM_GETPOS, 0, 0)]];
+               updatez3 (&workprefs.z3fastmem_size, &workprefs.z3fastmem2_size);
+               workprefs.z3chipmem_size = memsizes[msi_z3chip[SendMessage (GetDlgItem (hDlg, IDC_Z3CHIPMEM), TBM_GETPOS, 0, 0)]];
+               workprefs.mbresmem_low_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM1), TBM_GETPOS, 0, 0)]];
+               workprefs.mbresmem_high_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM2), TBM_GETPOS, 0, 0)]];
+               workprefs.cpuboardmem1_size = memsizes[msi_cpuboard[SendMessage (GetDlgItem (hDlg, IDC_CPUBOARDMEM), TBM_GETPOS, 0, 0)]];
+               fix_values_memorydlg ();
+               values_to_memorydlg (hDlg);
+               enable_for_memorydlg (hDlg);
+               break;
 
-       const struct expansionboardsettings *cbs = ert->settings;
-       for (int i = 0; expansion_settings_id[i] >= 0; i++) {
-               hide(hDlg, expansion_settings_id[i], !(cbs && cbs[i].name));
-       }
-       int i = 0;
-       if (cbs) {
-               for (i = 0; cbs[i].name; i++) {
-                       int id = expansion_settings_id[i];
-                       if (id < 0)
-                               break;
-                       SetWindowText (GetDlgItem(hDlg, id), cbs[i].name);
-                       setchecked(hDlg, id, (brc && (brc->roms[index].device_settings & (1 << i))));
-               }
-       }
-       while (expansion_settings_id[i] >= 0) {
-               int id = expansion_settings_id[i];
-               SetWindowText (GetDlgItem(hDlg, id), _T("-"));
-               i++;
        }
+       return FALSE;
 }
 
 static void values_to_kickstartdlg (HWND hDlg)
 {
        UAEREG *fkey;
-       int index;
-       struct boardromconfig *brc;
 
        fkey = regcreatetree (NULL, _T("DetectedROMs"));
 
@@ -8917,31 +9225,23 @@ static void values_to_kickstartdlg (HWND hDlg)
        addromfiles (fkey, hDlg, IDC_CARTFILE, workprefs.cartfile,
                ROMTYPE_FREEZER | ROMTYPE_ARCADIAGAME | ROMTYPE_CD32CART, 0);
 
-       values_to_kickstartdlg_expansion_roms(hDlg, fkey);
-       values_to_kickstartdlg_expansion_settings(hDlg);
-
-       if (workprefs.cpuboard_type) {
-               const struct cpuboardsubtype *cst = &cpuboards[workprefs.cpuboard_type].subtypes[workprefs.cpuboard_subtype];
-               brc = get_device_rom(&workprefs, ROMTYPE_CPUBOARD, 0, &index);
-               addromfiles(fkey, hDlg, IDC_CPUBOARDROMFILE, brc ? brc->roms[index].romfile : NULL,
-                       cst->romtype, cst->romtype_extra);
-       } else {
-               SendDlgItemMessage(hDlg, IDC_CPUBOARDROMFILE, CB_RESETCONTENT, 0, 0);
-       }
-
        regclosetree(fkey);
 
        SetDlgItemText(hDlg, IDC_FLASHFILE, workprefs.flashfile);
        SetDlgItemText(hDlg, IDC_RTCFILE, workprefs.rtcfile);
        CheckDlgButton(hDlg, IDC_KICKSHIFTER, workprefs.kickshifter);
        CheckDlgButton(hDlg, IDC_MAPROM, workprefs.maprom);
-       gui_set_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, scsiromselected);
-       values_to_kickstartdlg_sub(hDlg);
+}
+
+static void values_from_kickstartdlg(HWND hDlg)
+{
+       getromfile(hDlg, IDC_ROMFILE, workprefs.romfile, sizeof(workprefs.romfile) / sizeof(TCHAR));
+       getromfile(hDlg, IDC_ROMFILE2, workprefs.romextfile, sizeof(workprefs.romextfile) / sizeof(TCHAR));
+       getromfile(hDlg, IDC_CARTFILE, workprefs.cartfile, sizeof(workprefs.cartfile) / sizeof(TCHAR));
 }
 
 static void init_kickstart (HWND hDlg)
 {
-       static int first = -1;
 #if !defined(AUTOCONFIG)
        ew (hDlg, IDC_MAPROM), FALSE);
 #endif
@@ -8958,69 +9258,6 @@ static void init_kickstart (HWND hDlg)
        ew (hDlg, IDC_CARTCHOOSER), FALSE);
        ew (hDlg, IDC_FLASHCHOOSER), FALSE);
 #endif
-       ew(hDlg, IDC_CPUBOARDROMFILE, workprefs.cpuboard_type != 0);
-
-       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECT, CB_RESETCONTENT, 0, 0);
-       scsiromselect_table[0] = -1;
-       for (int i = 0; expansionroms[i].name; i++) {
-               TCHAR name[256];
-               if (expansionroms[i].romtype & ROMTYPE_CPUBOARD)
-                       continue;
-               name[0] = 0;
-               int cnt = 0;
-               for (int j = 0; j < MAX_DUPLICATE_EXPANSION_BOARDS; j++) {
-                       if (cfgfile_board_enabled(&workprefs, expansionroms[i].romtype, j)) {
-                               cnt++;
-                       }
-               }
-               if (cnt > 0) {
-                       if (first < 0)
-                               first = i;
-               }
-               if (cnt == 1)
-                       _tcscat(name, _T("* "));
-               else if (cnt > 1)
-                       _stprintf(name + _tcslen(name), _T("[%d] "), cnt);
-               if (expansionroms[i].friendlymanufacturer) {
-                       _tcscat(name, expansionroms[i].friendlymanufacturer);
-                       _tcscat(name, _T(" "));
-               }
-               _tcscat(name, expansionroms[i].friendlyname);
-               gui_add_string(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, i, name);
-       }
-       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_RESETCONTENT, 0, 0);
-       for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
-               TCHAR tmp[10];
-               _stprintf(tmp, _T("%d"), i + 1);
-               SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_ADDSTRING, 0, (LPARAM)tmp);
-       }
-
-       int found = -1;
-       for (int i = 0; expansionroms[i].name; i++) {
-               int romtype = expansionroms[i].romtype;
-               if (romtype & ROMTYPE_CPUBOARD)
-                       continue;
-               if (cfgfile_board_enabled(&workprefs, romtype, 0)) {
-                       if (found == -1)
-                               found = i;
-                       else
-                               found = -2;
-               }
-       }
-       if (scsiromselected < 0 && found < 0)
-               found = first;
-       if (found >= 0) {
-               scsiromselected = found;
-               gui_set_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, scsiromselected);
-       }
-       SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_SETCURSEL, scsiromselectednum, 0);
-
-       SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_RESETCONTENT, 0, 0);
-       for (int i = 0; i < 8; i++) {
-               TCHAR tmp[10];
-               _stprintf(tmp, _T("%d"), i);
-               SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_ADDSTRING, 0, (LPARAM)tmp);
-       }
 
        if (!regexiststree(NULL, _T("DetectedROMs")))
                scan_roms (NULL, rp_isactive () ? 0 : 1);
@@ -9052,14 +9289,6 @@ static void kickstartfilebuttons (HWND hDlg, WPARAM wParam, TCHAR *path)
                DiskSelection(hDlg, IDC_CARTFILE, 6, &workprefs, path);
                values_to_kickstartdlg (hDlg);
                break;
-       case IDC_SCSIROMCHOOSER:
-               DiskSelection(hDlg, IDC_SCSIROMFILE, 6, &workprefs, path);
-               values_to_kickstartdlg (hDlg);
-               break;
-       case IDC_CPUBOARDROMCHOOSER:
-               DiskSelection(hDlg, IDC_CPUBOARDROMFILE, 6, &workprefs, path);
-               values_to_kickstartdlg(hDlg);
-               break;
        }
 }
 
@@ -9073,7 +9302,7 @@ static INT_PTR CALLBACK KickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP
        {
        case WM_INITDIALOG:
                {
-                       int ids[] = { IDC_ROMFILE, IDC_ROMFILE2, IDC_CARTFILE, IDC_SCSIROMFILE, IDC_CPUBOARDROMFILE, -1 };
+                       int ids[] = { IDC_ROMFILE, IDC_ROMFILE2, IDC_CARTFILE, -1 };
                        pages[KICKSTART_ID] = hDlg;
                        currentpage = KICKSTART_ID;
                        init_kickstart (hDlg);
@@ -9110,45 +9339,13 @@ static INT_PTR CALLBACK KickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP
                        case IDC_ROMFILE:
                        case IDC_ROMFILE2:
                        case IDC_CARTFILE:
-                       case IDC_SCSIROMFILE:
-                       case IDC_SCSIROMID:
-                       case IDC_CPUBOARDROMFILE:
-                       case IDC_CPUBOARDROMSUBSELECT:
                                values_from_kickstartdlg (hDlg);
-                               values_to_kickstartdlg_expansion_settings(hDlg);
-                               break;
-                       case IDC_SCSIROMSUBSELECT:
-                               values_from_kickstartdlg(hDlg);
-                               values_to_kickstartdlg_expansion_roms(hDlg, NULL);
-                               values_to_kickstartdlg_expansion_settings(hDlg);
-                               break;
-                       case IDC_SCSIROMSELECTNUM:
-                       case IDC_SCSIROMSELECT:
-                               val = SendDlgItemMessage (hDlg, IDC_SCSIROMSELECTNUM, CB_GETCURSEL, 0, 0);
-                               if (val != CB_ERR)
-                                       scsiromselectednum = val;
-                               val = gui_get_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT);      
-                               if (val != CB_ERR) {
-                                       scsiromselected = val;
-                                       values_to_kickstartdlg_expansion_roms(hDlg, NULL);
-                                       values_to_kickstartdlg_expansion_settings(hDlg);
-                                       values_to_kickstartdlg_sub(hDlg);
-                               }
                                break;
                        }
                }
                kickstartfilebuttons (hDlg, wParam, NULL);
                switch (LOWORD (wParam))
                {
-               case IDC_EXPANSION_SETTING1:
-               case IDC_EXPANSION_SETTING2:
-                       values_from_kickstartdlg (hDlg);
-                       break;
-
-               case IDC_SCSIROMFILEAUTOBOOT:
-                       values_from_kickstartdlg (hDlg);
-                       break;
-                       
                case IDC_FLASHFILE:
                        GetWindowText (GetDlgItem (hDlg, IDC_FLASHFILE), tmp, sizeof (tmp) / sizeof (TCHAR));
                        _tcscpy (workprefs.flashfile, tmp);
@@ -11005,16 +11202,18 @@ static void inithdcontroller (HWND hDlg, int ctype, int ctype_unit, int devtype)
                }
                ew(hDlg, IDC_HDF_CONTROLLER_UNIT, TRUE);
        } else if (ctype >= HD_CONTROLLER_TYPE_SCSI_FIRST && ctype <= HD_CONTROLLER_TYPE_SCSI_LAST) {
+               const struct expansionromtype *ert = get_unit_expansion_rom(ctype);
                SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("0"));
                SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("1"));
-               SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("2"));
-               SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("3"));
-               SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("4"));
-               SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("5"));
-               SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("6"));
-               const struct expansionromtype *ert = get_unit_expansion_rom(ctype);
-               if (devtype == UAEDEV_HDF && ert && !_tcscmp(ert->name, _T("a2091")))
-                       SendDlgItemMessage(hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("XT"));
+               if (!ert || !(ert->deviceflags & EXPANSIONTYPE_SASI)) {
+                       SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("2"));
+                       SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("3"));
+                       SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("4"));
+                       SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("5"));
+                       SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("6"));
+                       if (devtype == UAEDEV_HDF && ert && !_tcscmp(ert->name, _T("a2091")))
+                               SendDlgItemMessage(hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("XT"));
+               }
                ew(hDlg, IDC_HDF_CONTROLLER_UNIT, TRUE);
        } else {
                ew(hDlg, IDC_HDF_CONTROLLER_UNIT, FALSE);
@@ -11031,7 +11230,8 @@ static void inithdcontroller (HWND hDlg, int ctype, int ctype_unit, int devtype)
                SendDlgItemMessage (hDlg, IDC_HDF_FEATURE_LEVEL, CB_ADDSTRING, 0, (LPARAM)_T("ATA-2+ Strict"));
        } else if (ctype >= HD_CONTROLLER_TYPE_SCSI_FIRST && ctype <= HD_CONTROLLER_TYPE_SCSI_LAST) {
                SendDlgItemMessage (hDlg, IDC_HDF_FEATURE_LEVEL, CB_ADDSTRING, 0, (LPARAM)_T("SCSI-1"));
-               SendDlgItemMessage (hDlg, IDC_HDF_FEATURE_LEVEL, CB_ADDSTRING, 0, (LPARAM)_T("SCSI-2"));
+               SendDlgItemMessage(hDlg, IDC_HDF_FEATURE_LEVEL, CB_ADDSTRING, 0, (LPARAM) _T("SCSI-2"));
+               SendDlgItemMessage(hDlg, IDC_HDF_FEATURE_LEVEL, CB_ADDSTRING, 0, (LPARAM) _T("SASI"));
        }
 }
 
@@ -11129,8 +11329,8 @@ static void updatehdfinfo (HWND hDlg, bool force, bool defaults)
        }
 
        if (current_hfdlg.ci.controller_type >= HD_CONTROLLER_TYPE_IDE_FIRST && current_hfdlg.ci.controller_type <= HD_CONTROLLER_TYPE_IDE_LAST) {
-               if (!current_hfdlg.ci.unit_feature_level && bsize >= 4 * (uae_u64)0x40000000)
-                       current_hfdlg.ci.unit_feature_level = 1;
+               if (current_hfdlg.ci.unit_feature_level == HD_LEVEL_ATA_1 && bsize >= 4 * (uae_u64)0x40000000)
+                       current_hfdlg.ci.unit_feature_level = HD_LEVEL_ATA_2;
        }
 
        cyls = phys ? current_hfdlg.ci.pcyls : current_hfdlg.forcedcylinders;
@@ -17267,7 +17467,8 @@ static void createTreeView (HWND hDlg)
        CN (MEMORY_ID, _T("ram"));
        CN (FLOPPY_ID, _T("floppy"));
        CN (HARDDISK_ID, _T("harddisk"));
-       CN (EXPANSION_ID, _T("expansion"));
+       CN(EXPANSION2_ID, _T("expansion2"));
+       CN(EXPANSION_ID, _T("expansion"));
 
        p2 = p = CreateFolderNode (TVhDlg, IDS_TREEVIEW_HOST, root, LOADSAVE_ID, CONFIG_TYPE_HOST, _T("configuration_host"));
        CN (DISPLAY_ID, _T("display"));
@@ -18039,7 +18240,8 @@ static int GetSettings (int all_options, HWND hwnd)
                panelresource = getresource (IDD_PANEL);
                LOADSAVE_ID = init_page (IDD_LOADSAVE, IDI_FILE, IDS_LOADSAVE, LoadSaveDlgProc, NULL, _T("gui/configurations.htm"), IDC_CONFIGTREE);
                MEMORY_ID = init_page (IDD_MEMORY, IDI_MEMORY, IDS_MEMORY, MemoryDlgProc, NULL, _T("gui/ram.htm"), 0);
-               EXPANSION_ID = init_page (IDD_EXPANSION, IDI_EXPANSION, IDS_EXPANSION, ExpansionDlgProc, NULL, _T("gui/expansion.htm"), 0);
+               EXPANSION_ID = init_page(IDD_EXPANSION, IDI_EXPANSION, IDS_EXPANSION, ExpansionDlgProc, NULL, _T("gui/expansion.htm"), 0);
+               EXPANSION2_ID = init_page(IDD_EXPANSION2, IDI_EXPANSION, IDS_EXPANSION2, Expansion2DlgProc, NULL, _T("gui/expansion2.htm"), 0);
                KICKSTART_ID = init_page (IDD_KICKSTART, IDI_MEMORY, IDS_KICKSTART, KickstartDlgProc, NULL, _T("gui/rom.htm"), 0);
                CPU_ID = init_page (IDD_CPU, IDI_CPU, IDS_CPU, CPUDlgProc, NULL, _T("gui/cpu.htm"), 0);
                DISPLAY_ID = init_page (IDD_DISPLAY, IDI_DISPLAY, IDS_DISPLAY, DisplayDlgProc, NULL, _T("gui/display.htm"), 0);
index ccc395e89c83d88986fe5d15c5dd3993f1d86cf0..c0d52550303dd5c4f814d77af09cb7b16e59abc7 100644 (file)
       <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
       <OmitFramePointers>false</OmitFramePointers>
       <WholeProgramOptimization>false</WholeProgramOptimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;..\..\prowizard\include;..\..\slirp;..\..\ppc\pearpc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;..\..\prowizard\include;..\..\slirp;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WINVER=0x0601;_WIN32_IE=0x0700;WIN32;UAE;WINUAE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <ExceptionHandling>Sync</ExceptionHandling>
-      <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <BufferSecurityCheck>true</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
index 75e5cdc76ebf24969a60f0c89cbccb74a225a6dc..ea4cbcc44cc8a72f841b8206ac0b6fb18bad7b23 100644 (file)
@@ -56,6 +56,9 @@
     <Filter Include="ppc">
       <UniqueIdentifier>{a238ed36-3d5f-4fd0-afd7-a34029119da7}</UniqueIdentifier>
     </Filter>
+    <Filter Include="mame">
+      <UniqueIdentifier>{961c1680-65e6-445a-bf6e-82775255ef2d}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\ahidsound_dsonly.cpp">
diff --git a/pci.cpp b/pci.cpp
index fd4f95f130c3b71e93d15c9cfc7ab529d25d132c..839c130109240ed67e8d66aa396344ee5912e349 100644 (file)
--- a/pci.cpp
+++ b/pci.cpp
@@ -26,6 +26,7 @@
 #include "newcpu.h"
 #include "uae.h"
 #include "rommgr.h"
+#include "cpuboard.h"
 
 #include "qemuvga/qemuuaeglue.h"
 #include "qemuvga/queue.h"
@@ -945,7 +946,9 @@ static void REGPARAM2 pci_bridge_bput(uaecptr addr, uae_u32 b)
        }
        if (pcib == bridges[PCI_BRIDGE_WILDFIRE]) {
                addr &= 15;
-               if (addr == 8) {
+               if (addr == 0) {
+                       cpuboard_set_flash_unlocked((b & 4) != 0);
+               } else if (addr == 8) {
                        pcib->config[2] = b;
                        if (b & 1) {
                                write_log(_T("Wildfire 68000 mode!\n"));
index 6323f37e70767daf17f9dd375a8c963efad1bbde..f8c8546ba9680ee56b1db93252bcabfe4da93e39 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 143
+#define NEXT_ROM_ID 144
 
 static struct romheader romheaders[] = {
        { _T("Freezer Cartridges"), 1 },
@@ -336,7 +336,7 @@ static struct romdata roms[] = {
        0xce270bc0, 0xe043c1aa,0x3bb06e06,0xd4dabff3,0x0a8c6317,0xabfef2bb },
        ALTROMPN(92, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xa6023f20, 0xdfb048d6, 0xbdc03587, 0x241e8121, 0x26aba603, 0xd69b0238)
        ALTROMPN(92, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x9635a9cd, 0x47578b27, 0xc4ba6e54, 0x891930dd, 0xcb4b6a45, 0x5d6b31b2)
-       { _T("Blizzard SCSI Kit IV"), 8, 5, 8, 5, _T("BSCSIIV\0"), 32768, 94, 0, 0, ROMTYPE_CPUBOARDEXT, 0, 0, NULL,
+       { _T("Blizzard SCSI Kit IV"), 8, 5, 8, 5, _T("BSCSIIV\0"), 32768, 94, 0, 0, ROMTYPE_BLIZKIT4, 0, 0, NULL,
        0xf53a0fca, 0xefe17ca5,0x88c44a7f,0x0f8c62be,0x20f23278,0xcfe06727, NULL, _T("blizzard_scsi_kit_iv.rom") },
        { _T("Fastlane"), 8, 5, 8, 5, _T("FASTLANE\0"), 20788, 102, 0, 0, ROMTYPE_FASTLANE, 0, 0, NULL,
        0xe4f485a5, 0x20bf7de5,0x05e45d0a,0xc411cfd2,0x806d0fd8,0xe46276de, NULL, _T("fastlanez3.rom") },
@@ -369,7 +369,9 @@ static struct romdata roms[] = {
        { _T("GVP A3001 Series I"), 3, 3, 3, 3, _T("A3001SI\0"), 8192, 114, 0, 0, ROMTYPE_CB_A3001S1, 0, 0, NULL,
        0xaaff7c65, 0x424cf3da,0xcc9da794,0x0ba74446,0x69dd1691,0x44ae87ee, NULL, NULL },
        { _T("Kupke Golem 030"), 0, 0, 0, 0, _T("GOLEM030\0"), 8192, 126, 0, 0, ROMTYPE_CB_GOLEM030, 0, 0, NULL,
-       0x05d473f4, 0x574ec567,0xcc67e06f,0x91dcecb9,0x8c204399,0x5fe2a09f, NULL, NULL },
+       0x05d473f4, 0x574ec567, 0xcc67e06f, 0x91dcecb9, 0x8c204399, 0x5fe2a09f, NULL, NULL },
+       { _T("DKB WildFire"), 1, 1, 1, 1, _T("WILDFIRE\0"), 18352, 143, 0, 0, ROMTYPE_CB_DBK_WF, 0, 0, NULL,
+       0xb2dae8c4, 0xcdfe2d96, 0xe44d4f8d, 0x3833a5e8, 0xb6c832fd, 0xc7b341a9, NULL, NULL },
 
        { _T("Preferred Technologies Nexus"), 1, 0, 1, 0, _T("PTNEXUS\0"), 8192, 139, 0, 0, ROMTYPE_PTNEXUS, 0, 0, NULL,
        0xf495879a, 0xa3bd0202, 0xe14aa5b6, 0x49d3ce88, 0x22975950, 0x6500dbc2, NULL, NULL },
@@ -728,7 +730,6 @@ static void addkey (uae_u8 *key, int size, const TCHAR *name)
        }
        keyring[i].key = key;
        keyring[i].size = size;
-       write_log (_T("ROM KEY '%s' %d bytes loaded\n"), name, size);
 }
 
 void addkeyfile (const TCHAR *path)
@@ -1609,8 +1610,6 @@ int configure_rom (struct uae_prefs *p, const int *rom, int msg)
                _tcscpy (p->cartfile, path);
        if (rd->type & ROMTYPE_CPUBOARD)
                set_device_rom(p, path, ROMTYPE_CPUBOARD, 0);
-       if (rd->type & ROMTYPE_CPUBOARDEXT)
-               set_device_rom(p, path, ROMTYPE_CPUBOARDEXT, 0);
        return 1;
 }