]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
If Z2 conflicts with PCMCIA addres space, disable PCMCIA.
authorToni Wilen <twilen@winuae.net>
Sun, 1 Dec 2019 16:11:52 +0000 (18:11 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 1 Dec 2019 16:11:52 +0000 (18:11 +0200)
expansion.cpp
gayle.cpp
include/autoconf.h
od-win32/mman.cpp

index 66bec658eb39f9243a4490275033990092fd82ce..ae860ddd198301a77c069b2eaf116ee26dfa145f 100644 (file)
@@ -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;
index 5628abab5add7606b7717779b99dd3ce52e1c738..57e642abca238a0bf9bc41007c92421ea56eb835 100644 (file)
--- 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);
        }
 }
index 8830f4d3cad71d58df470ea310386d8a92c4cd50..bbba85df3aff35d167a1b0660a9c050c0728e4f4 100644 (file)
@@ -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);
index 82277f9e8c6ef55731a9909ef383d1149f92af9e..0167c07f9dfd31940c23945aaddc7d6c3338ca4a 100644 (file)
@@ -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;