return &cd->aci;
}
-struct autoconfig_info *expansion_get_autoconfig_by_address(struct uae_prefs *p, uaecptr addr)
+struct autoconfig_info *expansion_get_autoconfig_by_address(struct uae_prefs *p, uaecptr addr, int index)
{
- for (int i = 0; i < cardno; i++) {
+ if (index >= cardno)
+ return NULL;
+ for (int i = index; i < cardno; i++) {
struct card_data *cd = cards[i];
if (addr >= cd->base && addr < cd->base + cd->size)
return &cd->aci;
{
if (currprefs.cs_pcmcia == 0)
return;
- struct autoconfig_info *aci = expansion_get_autoconfig_by_address(&currprefs, 6 * 1024 * 1024);
+ int idx = 0;
+ bool pcmcia_override = false;
+ while (!pcmcia_override) {
+ int cnt = 0;
+ for (int i = 0; i < 8; i++) {
+ struct autoconfig_info *aci = expansion_get_autoconfig_by_address(&currprefs, 6 * 1024 * 1024 + i * 512 * 1024, idx);
+ if (aci) {
+ if (aci->zorro > 0) {
+ pcmcia_override = true;
+ }
+ } else {
+ cnt++;
+ }
+ }
+ if (cnt >= 8)
+ break;
+ idx++;
+ }
if (pcmcia_card == 0 || (gayle_cs & GAYLE_CS_DIS)) {
map_banks_cond (&dummy_bank, 0xa0, 8, 0);
- if (currprefs.chipmem_size <= 4 * 1024 * 1024 && (!aci || aci->zorro == 0))
+ if (currprefs.chipmem_size <= 4 * 1024 * 1024 && !pcmcia_override)
map_banks_cond (&dummy_bank, PCMCIA_COMMON_START >> 16, PCMCIA_COMMON_SIZE >> 16, 0);
} else {
map_banks_cond (&gayle_attr_bank, 0xa0, 8, 0);
- if (currprefs.chipmem_size <= 4 * 1024 * 1024 && (!aci || aci->zorro == 0))
+ if (currprefs.chipmem_size <= 4 * 1024 * 1024 && !pcmcia_override)
map_banks_cond (&gayle_common_bank, PCMCIA_COMMON_START >> 16, PCMCIA_COMMON_SIZE >> 16, 0);
}
}
extern void expansion_generate_autoconfig_info(struct uae_prefs *p);
extern struct autoconfig_info *expansion_get_autoconfig_info(struct uae_prefs*, int romtype, int devnum);
extern struct autoconfig_info *expansion_get_autoconfig_data(struct uae_prefs *p, int index);
-extern struct autoconfig_info *expansion_get_autoconfig_by_address(struct uae_prefs *p, uaecptr addr);
+extern struct autoconfig_info *expansion_get_autoconfig_by_address(struct uae_prefs *p, uaecptr addr, int index);
extern void expansion_set_autoconfig_sort(struct uae_prefs *p);
extern int expansion_autoconfig_move(struct uae_prefs *p, int index, int direction, bool test);
extern bool expansion_can_move(struct uae_prefs *p, int index);
if (!_tcscmp(ab->label, _T("*"))) {
start = ab->start;
got = true;
- if (expansion_get_autoconfig_by_address(&currprefs, ab->start) && !expansion_get_autoconfig_by_address(&currprefs, ab->start + size))
+ if (expansion_get_autoconfig_by_address(&currprefs, ab->start, 0) && !expansion_get_autoconfig_by_address(&currprefs, ab->start + size, 0))
barrier = true;
} else if (!_tcscmp(ab->label, _T("*B"))) {
start = ab->start;
} else if (!_tcscmp(ab->label, _T("chip"))) {
start = 0;
got = true;
- if (!expansion_get_autoconfig_by_address(&currprefs, 0x00200000) && currprefs.chipmem_size == 2 * 1024 * 1024)
+ if (!expansion_get_autoconfig_by_address(&currprefs, 0x00200000, 0) && currprefs.chipmem_size == 2 * 1024 * 1024)
barrier = true;
if (currprefs.chipmem_size != 2 * 1024 * 1024)
barrier = true;