]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Expansion string config entry support.
authorToni Wilen <twilen@winuae.net>
Fri, 21 Oct 2016 15:59:16 +0000 (18:59 +0300)
committerToni Wilen <twilen@winuae.net>
Fri, 21 Oct 2016 15:59:16 +0000 (18:59 +0300)
12 files changed:
cfgfile.cpp
custom.cpp
idecontrollers.cpp
include/autoconf.h
include/options.h
include/pci_hw.h
ncr9x_scsi.cpp
pci.cpp
qemuvga/es1370.cpp
rommgr.cpp
sndboard.cpp
x86.cpp

index f4c34088c57c5e4528bfc665e12793809e9f4b54..e7ede28c219c8101186040e1c9d13f646d2180f7 100644 (file)
@@ -36,6 +36,7 @@
 #include "gfxboard.h"
 #include "cpuboard.h"
 #include "luascript.h"
+#include "ethernet.h"
 #include "native2amiga_api.h"
 
 #define cfgfile_warning write_log
@@ -1094,14 +1095,25 @@ static void write_resolution (struct zfile *f, const TCHAR *ws, const TCHAR *hs,
        }
 }
 
-static int cfgfile_read_rom_settings(const struct expansionboardsettings *ebs, const TCHAR *buf)
+static int cfgfile_read_rom_settings(const struct expansionboardsettings *ebs, const TCHAR *buf, TCHAR *configtext)
 {
        int settings = 0;
        int bitcnt = 0;
+       int sstr = 0;
+       if (configtext)
+               configtext[0] = 0;
+       TCHAR *ct = configtext;
        for (int i = 0; ebs[i].name; i++) {
                const struct expansionboardsettings *eb = &ebs[i];
                bitcnt += eb->bitshift;
-               if (eb->multiselect) {
+               if (eb->type == EXPANSIONBOARD_STRING) {
+                       const TCHAR *p = cfgfile_option_get(buf, eb->configname);
+                       if (p) {
+                               _tcscpy(ct, p);
+                               ct += _tcslen(ct);
+                       }
+                       *ct++ = 0;
+               } else if (eb->type == EXPANSIONBOARD_MULTI) {
                        int itemcnt = -1;
                        int itemfound = 0;
                        const TCHAR *p = eb->configname;
@@ -1142,13 +1154,25 @@ static int cfgfile_read_rom_settings(const struct expansionboardsettings *ebs, c
        return settings;
 }
 
-static void cfgfile_write_rom_settings(const struct expansionboardsettings *ebs, TCHAR *buf, int settings)
+static void cfgfile_write_rom_settings(const struct expansionboardsettings *ebs, TCHAR *buf, int settings, const TCHAR *settingstring)
 {
        int bitcnt = 0;
+       int sstr = 0;
        for (int j = 0; ebs[j].name; j++) {
                const struct expansionboardsettings *eb = &ebs[j];
                bitcnt += eb->bitshift;
-               if (eb->multiselect) {
+               if (eb->type == EXPANSIONBOARD_STRING) {
+                       if (settingstring) {
+                               const TCHAR *p = settingstring;
+                               for (int i = 0; i < sstr; i++) {
+                                       p += _tcslen(p) + 1;
+                               }
+                               if (buf[0])
+                                       _tcscat(buf, _T(","));
+                               _stprintf(buf, _T("%s=%s"), eb->configname, p);
+                               sstr++;
+                       }
+               } else if (eb->type == EXPANSIONBOARD_MULTI) {
                        int itemcnt = -1;
                        const TCHAR *p = eb->configname;
                        while (p[0]) {
@@ -1247,7 +1271,7 @@ static void cfgfile_write_board_rom(struct uae_prefs *prefs, struct zfile *f, st
                                        _tcscat(buf2, tmp);
                                }
                                if (br->roms[i].device_settings && ert->settings) {
-                                       cfgfile_write_rom_settings(ert->settings, buf2, br->roms[i].device_settings);
+                                       cfgfile_write_rom_settings(ert->settings, buf2, br->roms[i].device_settings, br->roms[i].configtext);
                                }
                                if (buf2[0])
                                        cfgfile_dwrite_str (f, buf, buf2);
@@ -1627,12 +1651,27 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
        }
 
        cfgfile_write_bool (f, _T("bsdsocket_emu"), p->socket_emu);
-       if (p->a2065name[0])
-               cfgfile_write_str (f, _T("a2065"), p->a2065name);
-       if (p->ne2000pciname[0])
-               cfgfile_write_str(f, _T("ne2000_pci"), p->ne2000pciname);
-       if (p->ne2000pcmcianame[0])
-               cfgfile_write_str(f, _T("ne2000_pcmcia"), p->ne2000pcmcianame);
+
+       {
+               // backwards compatibility
+               const TCHAR *name;
+               struct romconfig *rc;
+               rc = get_device_romconfig(p, ROMTYPE_A2065, 0);
+               if (rc) {
+                       name = ethernet_getselectionname(rc ? rc->device_settings : 0);
+                       cfgfile_write_str(f, _T("a2065"), name);
+               }
+               rc = get_device_romconfig(p, ROMTYPE_NE2KPCMCIA, 0);
+               if (rc) {
+                       name = ethernet_getselectionname(rc ? rc->device_settings : 0);
+                       cfgfile_write_str(f, _T("ne2000_pcmcia"), name);
+               }
+               rc = get_device_romconfig(p, ROMTYPE_NE2KPCI, 0);
+               if (rc) {
+                       name = ethernet_getselectionname(rc ? rc->device_settings : 0);
+                       cfgfile_write_str(f, _T("ne2000_pci"), name);
+               }
+       }
 
 #ifdef WITH_SLIRP
        tmp[0] = 0;
@@ -1975,22 +2014,22 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
        cfgfile_dwrite_bool(f, _T("color_burst"), p->cs_color_burst);
        cfgfile_dwrite (f, _T("chipset_hacks"), _T("0x%x"), p->cs_hacks);
 
-       if (cfgfile_board_enabled(p, ROMTYPE_CD32CART, 0)) {
+       if (is_board_enabled(p, ROMTYPE_CD32CART, 0)) {
                cfgfile_dwrite_bool(f, _T("cd32fmv"), true);
        }
-       if (cfgfile_board_enabled(p, ROMTYPE_MB_IDE, 0) && p->cs_ide == 1) {
+       if (is_board_enabled(p, ROMTYPE_MB_IDE, 0) && p->cs_ide == 1) {
                cfgfile_dwrite_str(f, _T("ide"), _T("a600/a1200"));
        }
-       if (cfgfile_board_enabled(p, ROMTYPE_MB_IDE, 0) && p->cs_ide == 2) {
+       if (is_board_enabled(p, ROMTYPE_MB_IDE, 0) && p->cs_ide == 2) {
                cfgfile_dwrite_str(f, _T("ide"), _T("a4000"));
        }
-       if (cfgfile_board_enabled(p, ROMTYPE_CDTVSCSI, 0)) {
+       if (is_board_enabled(p, ROMTYPE_CDTVSCSI, 0)) {
                cfgfile_dwrite_bool(f, _T("scsi_cdtv"), true);
        }
-       if (cfgfile_board_enabled(p, ROMTYPE_SCSI_A3000, 0)) {
+       if (is_board_enabled(p, ROMTYPE_SCSI_A3000, 0)) {
                cfgfile_dwrite_bool(f, _T("scsi_a3000"), true);
        }
-       if (cfgfile_board_enabled(p, ROMTYPE_SCSI_A4000T, 0)) {
+       if (is_board_enabled(p, ROMTYPE_SCSI_A4000T, 0)) {
                cfgfile_dwrite_bool(f, _T("scsi_a4000t"), true);
        }
 
@@ -2034,7 +2073,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
                cfgfile_dwrite_str(f, _T("cpuboard_type"), cbst->configname);
                if (cbs && p->cpuboard_settings) {
                        tmp[0] = 0;
-                       cfgfile_write_rom_settings(cbs, tmp, p->cpuboard_settings);
+                       cfgfile_write_rom_settings(cbs, tmp, p->cpuboard_settings, NULL);
                        cfgfile_dwrite_str(f, _T("cpuboard_settings"), tmp);
                }
        } else {
@@ -4449,18 +4488,6 @@ invalid_fs:
        return 0;
 }
 
-bool cfgfile_board_enabled(struct uae_prefs *p, int romtype, int devnum)
-{
-       int idx;
-       if (romtype == ROMTYPE_CPUBOARD && p->cpuboard_type) {
-               return devnum == 0;
-       }
-       struct boardromconfig *brc = get_device_rom(p, romtype, devnum, &idx);
-       if (!brc)
-               return false;
-       return brc->roms[idx].romfile[0] != 0;
-}
-
 static bool cfgfile_read_board_rom(struct uae_prefs *p, const TCHAR *option, const TCHAR *value, struct multipath *mp)
 {
        TCHAR buf[256], buf2[MAX_DPATH], buf3[MAX_DPATH];
@@ -4489,6 +4516,10 @@ static bool cfgfile_read_board_rom(struct uae_prefs *p, const TCHAR *option, con
                        _stprintf(buf, _T("%s_rom_file"), name);
                        if (cfgfile_path(option, value, buf, buf2, MAX_DPATH / sizeof (TCHAR), mp)) {
                                if (buf2[0]) {
+                                       if (ert->deviceflags & EXPANSIONTYPE_NET) {
+                                               // make sure network settings are available before parsing net "rom" entries
+                                               ethernet_updateselection();
+                                       }
                                        brc = get_device_rom_new(p, ert->romtype, j, &idx);
                                        _tcscpy(brc->roms[idx].romfile, buf2);
                                }
@@ -4530,7 +4561,7 @@ static bool cfgfile_read_board_rom(struct uae_prefs *p, const TCHAR *option, con
                                                brc->device_order = _tstol(p);
                                        }
                                        if (ert->settings) {
-                                               brc->roms[idx].device_settings = cfgfile_read_rom_settings(ert->settings, buf2);
+                                               brc->roms[idx].device_settings = cfgfile_read_rom_settings(ert->settings, buf2, brc->roms[idx].configtext);
                                        }
                                        if (ert->id_jumper) {
                                                p = cfgfile_option_get(buf2, _T("id"));
@@ -4582,6 +4613,23 @@ static void addbcromtype(struct uae_prefs *p, int romtype, bool add, const TCHAR
        }
 }
 
+static void addbcromtypenet(struct uae_prefs *p, int romtype, const TCHAR *netname, int devnum)
+{
+       if (netname == NULL || netname[0] == 0) {
+               clear_device_rom(p, romtype, devnum, true);
+       } else {
+               struct boardromconfig *brc = get_device_rom_new(p, romtype, devnum, NULL);
+               if (brc) {
+                       if (!brc->roms[0].romfile[0]) {
+                               _tcscpy(brc->roms[0].romfile, _T(":ENABLED"));
+                       }
+                       ethernet_updateselection();
+                       if (!brc->roms[0].device_settings)
+                               brc->roms[0].device_settings = ethernet_getselection(netname);
+               }
+       }
+}
+
 static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCHAR *value)
 {
        int tmpval, dummyint, i;
@@ -4913,7 +4961,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH
                p->cpuboard_settings = 0;
                const struct cpuboardsubtype *cbst = &cpuboards[p->cpuboard_type].subtypes[p->cpuboard_subtype];
                if (cbst->settings) {
-                       p->cpuboard_settings = cfgfile_read_rom_settings(cbst->settings, tmpbuf);
+                       p->cpuboard_settings = cfgfile_read_rom_settings(cbst->settings, tmpbuf, NULL);
                }
                return 1;
        }
@@ -5109,15 +5157,15 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH
        return 0;
 }
 
-static void romtype_restricted(struct uae_prefs *p, int *list)
+static void romtype_restricted(struct uae_prefs *p, const int *list)
 {
        for (int i = 0; list[i]; i++) {
                int romtype = list[i];
-               if (cfgfile_board_enabled(p, romtype, 0)) {
+               if (is_board_enabled(p, romtype, 0)) {
                        i++;
                        while (list[i]) {
                                romtype = list[i];
-                               if (cfgfile_board_enabled(p, romtype, 0)) {
+                               if (is_board_enabled(p, romtype, 0)) {
                                        addbcromtype(p, romtype, false, NULL, 0);
                                }
                                i++;
@@ -5256,13 +5304,20 @@ void cfgfile_compatibility_romtype(struct uae_prefs *p)
 
        addbcromtype(p, ROMTYPE_CD32CART, p->cs_cd32fmv, p->cartfile,0);
 
-       addbcromtype(p, ROMTYPE_A2065, p->a2065name[0] != 0, NULL, 0);
-       addbcromtype(p, ROMTYPE_NE2KPCMCIA, p->ne2000pcmcianame[0] != 0, NULL, 0);
-       addbcromtype(p, ROMTYPE_NE2KPCI, p->ne2000pciname[0] != 0, NULL, 0);
+       if (p->config_version < ((3 << 16) | (4 << 8) | (0 << 0))) {
+               // 3.3.0 or older
+               addbcromtypenet(p, ROMTYPE_A2065, p->a2065name, 0);
+               addbcromtypenet(p, ROMTYPE_NE2KPCMCIA, p->ne2000pcmcianame, 0);
+               addbcromtypenet(p, ROMTYPE_NE2KPCI, p->ne2000pciname, 0);
+       }
 
-       static int restricted_net[] = { ROMTYPE_A2065, ROMTYPE_NE2KPCMCIA, ROMTYPE_NE2KPCI, ROMTYPE_NE2KISA, ROMTYPE_ARIADNE2, ROMTYPE_XSURF, ROMTYPE_XSURF100Z2, ROMTYPE_XSURF100Z3, 0 };
-       static int restricted_x86[] = { ROMTYPE_A1060, ROMTYPE_A2088, ROMTYPE_A2088T, ROMTYPE_A2286, ROMTYPE_A2386, 0 };
-       static int restricted_pci[] = { ROMTYPE_GREX, ROMTYPE_MEDIATOR, ROMTYPE_PROMETHEUS, 0 };
+       static const int restricted_net[] = {
+               ROMTYPE_A2065, ROMTYPE_NE2KPCMCIA, ROMTYPE_NE2KPCI, ROMTYPE_NE2KISA,
+               ROMTYPE_ARIADNE2, ROMTYPE_XSURF, ROMTYPE_XSURF100Z2, ROMTYPE_XSURF100Z3,
+               ROMTYPE_HYDRA, ROMTYPE_LANROVER,
+               0 };
+       static const int restricted_x86[] = { ROMTYPE_A1060, ROMTYPE_A2088, ROMTYPE_A2088T, ROMTYPE_A2286, ROMTYPE_A2386, 0 };
+       static const int restricted_pci[] = { ROMTYPE_GREX, ROMTYPE_MEDIATOR, ROMTYPE_PROMETHEUS, 0 };
        romtype_restricted(p, restricted_net);
        romtype_restricted(p, restricted_x86);
        romtype_restricted(p, restricted_pci);
index 35a5401c59c97bcaa21ec94fce13b8e9445a2459..0d16b6cf5a3057f84369328d0609e40641cf82b7 100644 (file)
@@ -9800,8 +9800,8 @@ uae_u8 *save_custom_extra (int *len, uae_u8 *dstptr)
        SB (currprefs.cs_a1000ram ? 1 : 0);
        SB (currprefs.cs_slowmemisfast ? 1 : 0);
 
-       SB (cfgfile_board_enabled(&currprefs, ROMTYPE_A2091, 0) ? 1 : 0);
-       SB (cfgfile_board_enabled(&currprefs, ROMTYPE_A4091, 0) ? 1 : 0);
+       SB (is_board_enabled(&currprefs, ROMTYPE_A2091, 0) ? 1 : 0);
+       SB (is_board_enabled(&currprefs, ROMTYPE_A4091, 0) ? 1 : 0);
        SB (currprefs.cs_cdtvscsi ? 1 : 0);
 
        SB (currprefs.cs_pcmcia ? 1 : 0);
index 7448998b3e82b5d45c265bcd921da7691362c8f0..3922c192ba0960025b53a927be3bf1a476191209 100644 (file)
@@ -1473,7 +1473,7 @@ static const uae_u8 alfplus_autoconfig[16] = { 0xd1, 38, 0x00, 0x00, 0x08, 0x2c,
 
 bool alf_init(struct autoconfig_info *aci)
 {
-       bool alfplus = cfgfile_board_enabled(&currprefs, ROMTYPE_ALFAPLUS, 0);
+       bool alfplus = is_board_enabled(&currprefs, ROMTYPE_ALFAPLUS, 0);
        if (!aci->doinit) {
                aci->autoconfigp = alfplus ? alfplus_autoconfig : alf_autoconfig;
                return true;
index 04b4e7b7234529e5d27d240ca750160ea8934a0b..6156670f5a6ce13f0d7a4c430e2c27b9756ef70f 100644 (file)
@@ -184,11 +184,15 @@ typedef void(*DEVICE_MEMORY_CALLBACK)(struct romconfig*, uae_u8*, int);
 #define EXPANSIONTYPE_FALLBACK_DISABLE 0x8000
 #define EXPANSIONTYPE_HAS_FALLBACK 0x10000
 
+#define EXPANSIONBOARD_CHECKBOX 0
+#define EXPANSIONBOARD_MULTI 1
+#define EXPANSIONBOARD_STRING 2
+
 struct expansionboardsettings
 {
        const TCHAR *name;
        const TCHAR *configname;
-       bool multiselect;
+       int type;
        bool invert;
        int bitshift;
 };
index 4b7a6a059b029dbe61a180654a6b02e41c77a1c9..e48a793df42ec32a07f2006a486e71b52ac19074 100644 (file)
@@ -359,6 +359,7 @@ struct romconfig
        int device_settings;
        int subtype;
        void *unitdata;
+       TCHAR configtext[256];
        struct boardromconfig *back;
 };
 #define MAX_BOARD_ROMS 2
@@ -869,7 +870,6 @@ extern int cfgfile_configuration_change (int);
 extern void fixup_prefs_dimensions (struct uae_prefs *prefs);
 extern void fixup_prefs (struct uae_prefs *prefs, bool userconfig);
 extern void fixup_cpu (struct uae_prefs *prefs);
-extern bool cfgfile_board_enabled(struct uae_prefs *p, int romtype, int devnum);
 extern void cfgfile_compatibility_romtype(struct uae_prefs *p);
 extern void cfgfile_compatibility_rtg(struct uae_prefs *p);
 
index 0608919c81165dd6bf5e2fd437376630d46967d3..d6fcaf518a0b82f4bb51f9cab87a1dd2b132aa68 100644 (file)
@@ -9,7 +9,7 @@
 typedef uae_u32(REGPARAM3 *pci_get_func)(struct pci_board_state*,uaecptr) REGPARAM;
 typedef void (REGPARAM3 *pci_put_func)(struct pci_board_state*,uaecptr,uae_u32) REGPARAM;
 typedef void (*pci_dev_irq)(struct pci_board_state*,bool);
-typedef bool(*pci_dev_init)(struct pci_board_state*);
+typedef bool(*pci_dev_init)(struct pci_board_state*,struct autoconfig_info*);
 typedef void(*pci_dev_reset)(struct pci_board_state*);
 typedef void(*pci_dev_hsync)(struct pci_board_state*);
 typedef void(*pci_dev_free)(struct pci_board_state*);
index 5378054f1ed92b685a7d7c93e76bdf039af06f3d..da5b6284e9efa4af8ef862a4a5eee134240a4bf8 100644 (file)
@@ -900,7 +900,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_BLIZKIT4, 0))
+               if (!is_board_enabled(&currprefs, ROMTYPE_BLIZKIT4, 0))
                        return;
                if (addr >= BLIZZARD_SCSI_KIT4_DMA_OFFSET) {
                        addr &= 0x18000;
@@ -1193,7 +1193,7 @@ static 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_BLIZKIT4, 0))
+               if (!is_board_enabled(&currprefs, ROMTYPE_BLIZKIT4, 0))
                        return 0;
                if (addr >= BLIZZARD_SCSI_KIT4_DMA_OFFSET)
                        return 0;
diff --git a/pci.cpp b/pci.cpp
index b24bbd83e0ce628d2907a3ba98692114901855eb..6e5e5e72181ec47fe10e983724364edec0621737 100644 (file)
--- a/pci.cpp
+++ b/pci.cpp
@@ -105,7 +105,7 @@ static struct pci_board *pci_board_alloc(struct pci_config *config)
        return pci;
 }
 
-static void pci_board_add(struct pci_bridge *pcib, const struct pci_board *pci, int slot, int func)
+static void pci_board_add(struct pci_bridge *pcib, const struct pci_board *pci, int slot, int func, struct autoconfig_info *aci)
 {
        struct pci_board_state *pcibs = &pcib->boards[pcib->slot_cnt];
        pcib->slot_cnt++;
@@ -119,7 +119,7 @@ static void pci_board_add(struct pci_bridge *pcib, const struct pci_board *pci,
                pcibs->bar_size[i] = pci->config->bars[i];
        }
        if (pci->init)
-               pci->init(pcibs);
+               pci->init(pcibs, aci);
        if (pci->hsync) {
                for (int i = 0; i < MAX_PCI_BOARDS; i++) {
                        if (hsyncs[i] == NULL) {
@@ -1465,27 +1465,23 @@ static const struct pci_board ncr_53c815_pci_board =
        }
 };
 
-static void add_pci_devices(struct pci_bridge *pcib)
+static void add_pci_devices(struct pci_bridge *pcib, struct autoconfig_info *aci)
 {
        int slot = 0;
 
-       if (currprefs.ne2000pciname[0]) {
-               pci_board_add(pcib, &ne2000_pci_board, slot++, 0);
+       if (is_device_rom(&currprefs, ROMTYPE_NE2KPCI, 0) >= 0) {
+               pci_board_add(pcib, &ne2000_pci_board, slot++, 0, aci);
        }
 
        if (is_device_rom(&currprefs, ROMTYPE_FM801, 0) >= 0) {
-               pci_board_add(pcib, &fm801_pci_board, slot, 0);
-               pci_board_add(pcib, &fm801_pci_board_func1, slot, 1);
+               pci_board_add(pcib, &fm801_pci_board, slot, 0, aci);
+               pci_board_add(pcib, &fm801_pci_board_func1, slot, 1, aci);
                slot++;
        }
 
        if (is_device_rom(&currprefs, ROMTYPE_ES1370, 0) >= 0) {
-               pci_board_add(pcib, &es1370_pci_board, slot++, 0);
+               pci_board_add(pcib, &es1370_pci_board, slot++, 0, aci);
        }
-
-       //pci_board_add(pcib, &solo1_pci_board, slot++, 0);
-
-       //pci_board_add(pcib, &ncr_53c815_pci_board, 1, 0);
 }
 
 // Wildfire
@@ -1513,7 +1509,7 @@ bool dkb_wildfire_pci_init(struct autoconfig_info *aci)
        pcib->configured = -1;
        pcib->pcipcidma = true;
        pcib->amigapicdma = true;
-       pci_board_add(pcib, &ncr_53c815_pci_board, 0, 0);
+       pci_board_add(pcib, &ncr_53c815_pci_board, 0, 0, aci);
        map_banks(&pci_config_bank, 0x80000000 >> 16, 0x10000000 >> 16, 0);
        map_banks(&pci_mem_bank, 0x90000000 >> 16, 0x30000000 >> 16, 0);
        map_banks(&pci_io_bank, 0xc0000000 >> 16, 0x30000000 >> 16, 0);
@@ -1577,7 +1573,7 @@ static bool prometheus_pci_init(struct autoconfig_info *aci)
        if (rc->device_settings & 1)
                pcib->amigapicdma = true;
 
-       add_pci_devices(pcib);
+       add_pci_devices(pcib, aci);
 
        memset(pcib->acmemory, 0xff, sizeof pcib->acmemory);
        for (int i = 0; i < sizeof prometheus_autoconfig; i++) {
@@ -1617,7 +1613,7 @@ static bool grex_pci_init(struct autoconfig_info *aci)
        pcib->pcipcidma = true;
        pcib->amigapicdma = true;
 
-       add_pci_devices(pcib);
+       add_pci_devices(pcib, aci);
 
        map_banks(&pci_config_bank, 0xfffc0000 >> 16, 0x20000 >> 16, 0);
        map_banks(&pci_mem_bank, 0x80000000 >> 16, 0x78000000 >> 16, 0);
@@ -1776,7 +1772,7 @@ static addrbank *mediator_pci_init_1200_1(struct autoconfig_info *aci, struct ro
                if (!pcib)
                        return &expamem_null;
                mediator_pci_init_1200(pcib);
-               add_pci_devices(pcib);
+               add_pci_devices(pcib, aci);
        } else {
                pcib = pci_bridge_get_zorro(rc);
                if (!pcib)
@@ -1810,7 +1806,7 @@ static addrbank *mediator_pci_init_1200_2(struct autoconfig_info *aci, struct ro
                if (!pcib)
                        return &expamem_null;
                mediator_pci_init_1200(pcib);
-               add_pci_devices(pcib);
+               add_pci_devices(pcib, aci);
        }
        memset(pcib->acmemory, 0xff, sizeof pcib->acmemory);
        const uae_u8 *ac = (rc->device_settings & 2) ? m_ac->mem_large : m_ac->mem_small;
@@ -1852,7 +1848,7 @@ static addrbank *mediator_pci_init_4000_1(struct autoconfig_info *aci, struct ro
                if (!pcib)
                        return &expamem_null;
                mediator_pci_init_4000(pcib);
-               add_pci_devices(pcib);
+               add_pci_devices(pcib, aci);
        } else {
                pcib = pci_bridge_get_zorro(rc);
                if (!pcib)
@@ -1883,7 +1879,7 @@ static addrbank *mediator_pci_init_4000_2(struct autoconfig_info *aci, struct ro
                        return &expamem_null;
 
                mediator_pci_init_4000(pcib);
-               add_pci_devices(pcib);
+               add_pci_devices(pcib, aci);
        }
        memset(pcib->acmemory, 0xff, sizeof pcib->acmemory);
        const uae_u8 *ac = (rc->device_settings & 2) ? m_ac->mem_large : m_ac->mem_small;
index e8806b298d27b09e198a8b2c66ea85bdef09df0c..fc5b3d6093f782520d1218e7437852e4acbd39c0 100644 (file)
@@ -1183,7 +1183,7 @@ static void es1370_free(struct pci_board_state *pcibs)
                return;
 }
 
-static bool es1370_init(struct pci_board_state *pcibs)
+static bool es1370_init(struct pci_board_state *pcibs, struct autoconfig_info *aci)
 {
        init(pcibs);
        es1370state.irq_callback = pcibs->irq_callback;
index 6db72b6134980439fa2edabf720d942db1c45061..57c5ae3f6e1300de16711ac4b4245853c74f5804 100644 (file)
@@ -1849,6 +1849,34 @@ struct romconfig *get_device_romconfig(struct uae_prefs *p, int romtype, int dev
        return NULL;
 }
 
+void board_prefs_changed(int romtype, int devnum)
+{
+       int idx1, idx2;
+       struct boardromconfig *brc1 = get_device_rom(&currprefs, romtype, devnum, &idx1);
+       struct boardromconfig *brc2 = get_device_rom(&changed_prefs, romtype, devnum, &idx2);
+       if (brc1 && brc2) {
+               memcpy(brc1, brc2, sizeof(struct boardromconfig));
+       } else if (brc1 && !brc2) {
+               clear_device_rom(&currprefs, romtype, devnum, true);
+       } else if (!brc1 && brc2) {
+               brc1 = get_device_rom_new(&currprefs, romtype, devnum, &idx1);
+               if (brc1)
+                       memcpy(brc1, brc2, sizeof(struct boardromconfig));
+       }
+}
+
+bool is_board_enabled(struct uae_prefs *p, int romtype, int devnum)
+{
+       int idx;
+       if (romtype == ROMTYPE_CPUBOARD && p->cpuboard_type) {
+               return devnum == 0;
+       }
+       struct boardromconfig *brc = get_device_rom(p, romtype, devnum, &idx);
+       if (!brc)
+               return false;
+       return brc->roms[idx].romfile[0] != 0;
+}
+
 static bool isspecialrom(const TCHAR *name)
 {
        if (!_tcsicmp(name, _T(":NOROM")))
index 398195193ed42049eb2ea4e044ba5478819493cf..edca1bb7b45ee6dc395d5fbadbeab815dde88089 100644 (file)
@@ -1764,7 +1764,7 @@ static void fm801_free(struct pci_board_state *pcibs)
        fm801_stop(data);
 }
 
-static bool fm801_init(struct pci_board_state *pcibs)
+static bool fm801_init(struct pci_board_state *pcibs, struct autoconfig_info *aci)
 {
        struct fm801_data *data = &fm801;
        memset(data, 0, sizeof(struct fm801_data));
@@ -1820,7 +1820,7 @@ static void solo1_free(struct pci_board_state *pcibs)
 {
 }
 
-static bool solo1_init(struct pci_board_state *pcibs)
+static bool solo1_init(struct pci_board_state *pcibs, struct autoconfig_info *aci)
 {
        return true;
 }
diff --git a/x86.cpp b/x86.cpp
index 4e9cd9550b65acc551548a16cdba3fc9e2040dfe..af99fb4c3a1ddddb979639659a0a4d8c83089b4d 100644 (file)
--- a/x86.cpp
+++ b/x86.cpp
@@ -3397,7 +3397,7 @@ bool x86_bridge_init(struct autoconfig_info *aci, uae_u32 romtype, int type)
                }
        }
 
-       if (cfgfile_board_enabled(&currprefs, ROMTYPE_NE2KISA, 0)) {
+       if (is_board_enabled(&currprefs, ROMTYPE_NE2KISA, 0)) {
                struct romconfig *rc = get_device_romconfig(&currprefs, ROMTYPE_NE2KISA, 0);
                if (rc) {
                        xb->ne2000_isa = &ne2000_pci_board;
@@ -3462,7 +3462,7 @@ bool x86_bridge_init(struct autoconfig_info *aci, uae_u32 romtype, int type)
                                xb->ne2000_irq = 15;
                                break;
                        }
-                       if (xb->ne2000_isa->init(xb->ne2000_isa_board_state)) {
+                       if (xb->ne2000_isa->init(xb->ne2000_isa_board_state, NULL)) {
                                write_log(_T("NE2000 ISA configured, IO=%3X, IRQ=%d\n"), xb->ne2000_io, xb->ne2000_irq);
                        } else {
                                xb->ne2000_isa = NULL;