From e2d22d0fd0801f105da78d144df3431597fb6f61 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 1 Dec 2019 18:11:52 +0200 Subject: [PATCH] If Z2 conflicts with PCMCIA addres space, disable PCMCIA. --- expansion.cpp | 6 ++++-- gayle.cpp | 23 ++++++++++++++++++++--- include/autoconf.h | 2 +- od-win32/mman.cpp | 4 ++-- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index 66bec658..ae860ddd 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -2800,9 +2800,11 @@ struct autoconfig_info *expansion_get_autoconfig_data(struct uae_prefs *p, int i 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; diff --git a/gayle.cpp b/gayle.cpp index 5628abab..57e642ab 100644 --- a/gayle.cpp +++ b/gayle.cpp @@ -1845,14 +1845,31 @@ static void gayle_map_pcmcia (void) { 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); } } diff --git a/include/autoconf.h b/include/autoconf.h index 8830f4d3..bbba85df 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -155,7 +155,7 @@ extern void expansion_scan_autoconfig(struct uae_prefs*, bool); 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); diff --git a/od-win32/mman.cpp b/od-win32/mman.cpp index 82277f9e..0167c07f 100644 --- a/od-win32/mman.cpp +++ b/od-win32/mman.cpp @@ -726,7 +726,7 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md) 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; @@ -735,7 +735,7 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md) } 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; -- 2.47.3