From: Toni Wilen Date: Fri, 21 Oct 2016 15:59:16 +0000 (+0300) Subject: Expansion string config entry support. X-Git-Tag: 3400~49 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=e5afa105ede52f68b995cf7225068c8d9eb3827a;p=francis%2Fwinuae.git Expansion string config entry support. --- diff --git a/cfgfile.cpp b/cfgfile.cpp index f4c34088..e7ede28c 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -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); diff --git a/custom.cpp b/custom.cpp index 35a5401c..0d16b6cf 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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); diff --git a/idecontrollers.cpp b/idecontrollers.cpp index 7448998b..3922c192 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -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; diff --git a/include/autoconf.h b/include/autoconf.h index 04b4e7b7..6156670f 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -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; }; diff --git a/include/options.h b/include/options.h index 4b7a6a05..e48a793d 100644 --- a/include/options.h +++ b/include/options.h @@ -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); diff --git a/include/pci_hw.h b/include/pci_hw.h index 0608919c..d6fcaf51 100644 --- a/include/pci_hw.h +++ b/include/pci_hw.h @@ -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*); diff --git a/ncr9x_scsi.cpp b/ncr9x_scsi.cpp index 5378054f..da5b6284 100644 --- a/ncr9x_scsi.cpp +++ b/ncr9x_scsi.cpp @@ -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 b24bbd83..6e5e5e72 100644 --- 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; diff --git a/qemuvga/es1370.cpp b/qemuvga/es1370.cpp index e8806b29..fc5b3d60 100644 --- a/qemuvga/es1370.cpp +++ b/qemuvga/es1370.cpp @@ -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; diff --git a/rommgr.cpp b/rommgr.cpp index 6db72b61..57c5ae3f 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -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"))) diff --git a/sndboard.cpp b/sndboard.cpp index 39819519..edca1bb7 100644 --- a/sndboard.cpp +++ b/sndboard.cpp @@ -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 4e9cd955..af99fb4c 100644 --- 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;