]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Expansion PCI handling updates
authorToni Wilen <twilen@winuae.net>
Mon, 17 Mar 2025 16:36:55 +0000 (18:36 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 17 Mar 2025 16:36:55 +0000 (18:36 +0200)
expansion.cpp
gfxboard.cpp
include/autoconf.h
od-win32/win32gui.cpp
pci.cpp

index 06472315edcf4d57e35b80131d7df3423822ffa3..a44c2b85d4e75765d31f831a7d08dcba80cd821a 100644 (file)
 #define CARD_FLAG_CHILD 8
 #define CARD_FLAG_UAEROM 16
 
-// More information in first revision HRM Appendix_G
-#define BOARD_PROTOAUTOCONFIG 1
-
-#define BOARD_AUTOCONFIG_Z2 2
-#define BOARD_AUTOCONFIG_Z3 3
-#define BOARD_NONAUTOCONFIG_BEFORE 4
-#define BOARD_NONAUTOCONFIG_AFTER_Z2 5
-#define BOARD_NONAUTOCONFIG_AFTER_Z3 6
-#define BOARD_IGNORE 7
-
 #define KS12_BOOT_HACK 1
 
 #define EXP_DEBUG 0
@@ -215,7 +205,8 @@ static bool isnonautoconfig(int v)
 {
        return v == BOARD_NONAUTOCONFIG_AFTER_Z2 ||
                v == BOARD_NONAUTOCONFIG_AFTER_Z3 ||
-               v == BOARD_NONAUTOCONFIG_BEFORE;
+               v == BOARD_NONAUTOCONFIG_BEFORE ||
+               v == BOARD_PCI;
 }
 
 static bool ks12orolder(void)
@@ -2985,19 +2976,22 @@ static void set_order(struct uae_prefs *p, struct card_data *cd, int order)
                return;
        }
        int devnum = (cd->flags >> 16) & 255;
-       if (!_tcsicmp(cd->name, _T("Z2Fast"))) {
-               p->fastmem[devnum].device_order = order;
-               return;
-       }
-       if (!_tcsicmp(cd->name, _T("Z3Fast"))) {
-               p->z3fastmem[devnum].device_order = order;
-               return;
+       if (devnum < MAX_RAM_BOARDS) {
+               if (!_tcsicmp(cd->name, _T("Z2Fast"))) {
+                       p->fastmem[devnum].device_order = order;
+                       return;
+               }
+               if (!_tcsicmp(cd->name, _T("Z3Fast"))) {
+                       p->z3fastmem[devnum].device_order = order;
+                       return;
+               }
        }
-       if (!_tcsicmp(cd->name, _T("Z3RTG")) || !_tcsicmp(cd->name, _T("Z2RTG"))) {
-               p->rtgboards[devnum].device_order = order;
-               return;
+       if (devnum < MAX_RTG_BOARDS) {
+               if (!_tcsicmp(cd->name, _T("Z3RTG")) || !_tcsicmp(cd->name, _T("Z2RTG"))) {
+                       p->rtgboards[devnum].device_order = order;
+                       return;
+               }
        }
-
 }
 
 static int get_order(struct uae_prefs *p, struct card_data *cd)
@@ -3015,17 +3009,23 @@ static int get_order(struct uae_prefs *p, struct card_data *cd)
        }
        if (cd->zorro <= 0)
                return -1;
-       if (cd->zorro >= 4)
+       if (cd->zorro == BOARD_PCI)
+               return EXPANSION_ORDER_MAX - 1;
+       if (cd->zorro >= BOARD_NONAUTOCONFIG_BEFORE)
                return -2;
        if (cd->rc && cd->rc->back)
                return cd->rc->back->device_order;
        int devnum = (cd->flags >> 16) & 255;
-       if (!_tcsicmp(cd->name, _T("Z2Fast")))
-               return p->fastmem[devnum].device_order;
-       if (!_tcsicmp(cd->name, _T("Z3Fast")))
-               return p->z3fastmem[devnum].device_order;
-       if (!_tcsicmp(cd->name, _T("Z3RTG")) || !_tcsicmp(cd->name, _T("Z2RTG")))
-               return p->rtgboards[devnum].device_order;
+       if (devnum < MAX_RAM_BOARDS) {
+               if (!_tcsicmp(cd->name, _T("Z2Fast")))
+                       return p->fastmem[devnum].device_order;
+               if (!_tcsicmp(cd->name, _T("Z3Fast")))
+                       return p->z3fastmem[devnum].device_order;
+       }
+       if (devnum < MAX_RTG_BOARDS) {
+               if (!_tcsicmp(cd->name, _T("Z3RTG")) || !_tcsicmp(cd->name, _T("Z2RTG")))
+                       return p->rtgboards[devnum].device_order;
+       }
        if (!_tcsicmp(cd->name, _T("MegaChipRAM")))
                return -1;
        return EXPANSION_ORDER_MAX - 1;
@@ -3375,7 +3375,7 @@ static bool add_card_sort(int index, bool *inuse, int *new_cardnop)
 
 static void expansion_autoconfig_sort(struct uae_prefs *p)
 {
-       const int zs[] = { BOARD_NONAUTOCONFIG_BEFORE, 0, BOARD_PROTOAUTOCONFIG, BOARD_AUTOCONFIG_Z2, BOARD_NONAUTOCONFIG_AFTER_Z2, BOARD_AUTOCONFIG_Z3, BOARD_NONAUTOCONFIG_AFTER_Z3, -1 };
+       const int zs[] = { BOARD_NONAUTOCONFIG_BEFORE, BOARD_PCI, 0, BOARD_PROTOAUTOCONFIG, BOARD_AUTOCONFIG_Z2, BOARD_NONAUTOCONFIG_AFTER_Z2, BOARD_AUTOCONFIG_Z3, BOARD_NONAUTOCONFIG_AFTER_Z3, -1 };
        bool inuse[MAX_EXPANSION_BOARD_SPACE];
        struct card_data *tcards[MAX_EXPANSION_BOARD_SPACE];
        int new_cardno = 0;
@@ -3627,10 +3627,10 @@ static void expansion_add_autoconfig(struct uae_prefs *p)
        for (int i = 0; i < MAX_RTG_BOARDS; i++) {
                struct rtgboardconfig *rbc = &p->rtgboards[i];
                int type = gfxboard_get_configtype(rbc);
-               if (rbc->rtgmem_size && rbc->rtgmem_type >= GFXBOARD_HARDWARE && type == BOARD_NONAUTOCONFIG_BEFORE) {
+               if (rbc->rtgmem_size && rbc->rtgmem_type >= GFXBOARD_HARDWARE && (type == BOARD_NONAUTOCONFIG_BEFORE || type == BOARD_PCI)) {
                        cards_set[cardno].flags = 4 | (i << 16);
                        cards_set[cardno].name = _T("MainBoardRTG");
-                       cards_set[cardno].zorro = BOARD_NONAUTOCONFIG_BEFORE;
+                       cards_set[cardno].zorro = type;
                        cards_set[cardno++].initnum = gfxboard_init_memory;
                }
        }
@@ -3638,6 +3638,7 @@ static void expansion_add_autoconfig(struct uae_prefs *p)
        // add possible non-autoconfig boards
        add_cpu_expansions(p, BOARD_NONAUTOCONFIG_BEFORE, NULL);
        add_expansions(p, BOARD_NONAUTOCONFIG_BEFORE, NULL, 0);
+       add_expansions(p, BOARD_PCI, NULL, 0);
 
        fastmem_num = 0;
        add_expansions(p, BOARD_PROTOAUTOCONFIG, &fastmem_num, 0);
@@ -5363,7 +5364,7 @@ const struct expansionromtype expansionroms[] = {
        },
 #endif
        {
-               _T("a1000wom512k"), _T("A1000 512k WOM"), _T("Jrg Huth"),
+               _T("a1000wom512k"), _T("A1000 512k WOM"), _T("Jörg Huth"),
                NULL, NULL, NULL, NULL, ROMTYPE_512KWOM | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
                NULL, 0,
                false, EXPANSIONTYPE_INTERNAL
@@ -6190,13 +6191,13 @@ const struct expansionromtype expansionroms[] = {
        },
        {
                _T("es1370"), _T("ES1370 PCI"), _T("Ensoniq"),
-               NULL, pci_expansion_init, NULL, NULL, ROMTYPE_ES1370 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
+               NULL, pci_expansion_init, NULL, NULL, ROMTYPE_ES1370 | ROMTYPE_NOT, 0, 0, BOARD_PCI, true,
                NULL, 0,
                false, EXPANSIONTYPE_SOUND
        },
        {
                _T("fm801"), _T("FM801 PCI"), _T("Fortemedia"),
-               NULL, pci_expansion_init, NULL, NULL, ROMTYPE_FM801 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
+               NULL, pci_expansion_init, NULL, NULL, ROMTYPE_FM801 | ROMTYPE_NOT, 0, 0, BOARD_PCI, true,
                NULL, 0,
                false, EXPANSIONTYPE_SOUND
        },
@@ -6323,7 +6324,7 @@ const struct expansionromtype expansionroms[] = {
        },
        {
                _T("ne2000_pci"), _T("RTL8029 PCI (NE2000 compatible)"), NULL,
-               NULL, pci_expansion_init, NULL, NULL, ROMTYPE_NE2KPCI | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
+               NULL, pci_expansion_init, NULL, NULL, ROMTYPE_NE2KPCI | ROMTYPE_NOT, 0, 0, BOARD_PCI, true,
                NULL, 0,
                false, EXPANSIONTYPE_NET,
                0, 0, 0, false, NULL,
index 71da64b5a5358940baa2899c8c4bbb428354042e..d09c549c29318e876a447cba811e571a16e1799b 100644 (file)
@@ -64,7 +64,7 @@ static bool memlogw = true;
 #include "qemuvga/qemuuaeglue.h"
 #include "qemuvga/vga.h"
 #include "draco.h"
-
+#include "autoconf.h"
 
 extern void put_io_pcem(uaecptr, uae_u32, int);
 extern uae_u32 get_io_pcem(uaecptr, int);
@@ -147,7 +147,7 @@ static const struct gfxboard boards[] =
                GFXBOARD_ID_A2410,
                _T("A2410 [Zorro II]"), _T("Commodore"), _T("A2410"),
                1030, 0, 0, 0,
-               0x00000000, 0x00200000, 0x00200000, 0x10000, 0, 0, 2, false, false,
+               0x00000000, 0x00200000, 0x00200000, 0x10000, 0, 2, 2, false, false,
                0, 0xc1, &a2410_func
        },
        {
@@ -217,7 +217,7 @@ static const struct gfxboard boards[] =
                GFXBOARD_ID_PERMEDIA2_PCI,
                _T("BlizzardVision/CyberVision PPC (Permedia2) [PCI]"), _T("3DLabs"), _T("PERMEDIA2_PCI"),
                0, 0, 0, 0,
-               0x00000000, 0x00800000, 0x00800000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00800000, 0x00800000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &permedia2_device, 0, GFXBOARD_BUSTYPE_PCI
        },
        {
@@ -268,7 +268,7 @@ static const struct gfxboard boards[] =
                GFXBOARD_ID_ALTAIS_Z3,
                _T("Altais [DracoBus]"), _T("MacroSystem"), _T("Altais"),
                18260, 19, 0, 0,
-               0x00000000, 0x00400000, 0x00400000, 0x00400000, 0, 4, 3, false, false,
+               0x00000000, 0x00400000, 0x00400000, 0x00400000, 0, BOARD_NONAUTOCONFIG_BEFORE, 3, false, false,
                0, 0, NULL, &ncr_retina_z3_device, 0, GFXBOARD_BUSTYPE_DRACO
        },
        {
@@ -305,7 +305,7 @@ static const struct gfxboard boards[] =
                GFXBOARD_ID_EGS_110_24,
                _T("EGS 110/24 [GVP local bus]"), _T("GVP"), _T("EGS_110_24"),
                2193, 0, 0, 0,
-               0x00000000, 0x00400000, 0x00800000, 0x00800000, 0, 4, 2, false, false,
+               0x00000000, 0x00400000, 0x00800000, 0x00800000, 0, BOARD_NONAUTOCONFIG_BEFORE, 2, false, false,
                0, 0, NULL, &inmos_egs_110_24_device
        },
        {
@@ -376,7 +376,7 @@ static const struct gfxboard boards[] =
                GFXBOARD_ID_VOODOO3_PCI,
                _T("Voodoo 3 3000 [PCI]"), _T("3dfx"), _T("V3_3000"),
                0, 0, 0, 0,
-               0x00000000, 0x01000000, 0x01000000, 0x01000000, 0, 0, -1, false, false,
+               0x00000000, 0x01000000, 0x01000000, 0x01000000, 0, BOARD_PCI, -1, false, false,
                ROMTYPE_VOODOO3,
                0, NULL, &voodoo_3_3000_device, 0, GFXBOARD_BUSTYPE_PCI
        },
@@ -384,42 +384,42 @@ static const struct gfxboard boards[] =
                GFXBOARD_ID_S3VIRGE_PCI,
                _T("Virge [PCI]"), _T("S3"), _T("S3VIRGE_PCI"),
                0, 0, 0, 0,
-               0x00000000, 0x00400000, 0x00400000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00400000, 0x00400000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &s3_virge_device, 0, GFXBOARD_BUSTYPE_PCI
        },
        {
                GFXBOARD_ID_S3TRIO64_PCI,
                _T("Trio64 [PCI]"), _T("S3"), _T("S3TRIO64_PCI"),
                0, 0, 0, 0,
-               0x00000000, 0x00200000, 0x00400000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00200000, 0x00400000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &s3_trio64_device, 0, GFXBOARD_BUSTYPE_PCI
        },
        {
                GFXBOARD_ID_MATROX_MILLENNIUM_PCI,
                _T("Matrox Millennium [PCI]"), _T("Matrox"), _T("Matrox_Millennium"),
                0, 0, 0, 0,
-               0x00000000, 0x00200000, 0x00400000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00200000, 0x00400000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &millennium_device, 0, GFXBOARD_BUSTYPE_PCI
        },
        {
                GFXBOARD_ID_MATROX_MILLENNIUM_II_PCI,
                _T("Matrox Millennium II [PCI]"), _T("Matrox"), _T("Matrox_Millennium_II"),
                0, 0, 0, 0,
-               0x00000000, 0x00200000, 0x01000000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00200000, 0x01000000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &millennium_ii_device, 0, GFXBOARD_BUSTYPE_PCI
        },
        {
                GFXBOARD_ID_MATROX_MYSTIQUE_PCI,
                _T("Matrox Mystique [PCI]"), _T("Matrox"), _T("Matrox_Mystique"),
                0, 0, 0, 0,
-               0x00000000, 0x00200000, 0x00800000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00200000, 0x00800000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &mystique_device, 0, GFXBOARD_BUSTYPE_PCI
        },
        {
                GFXBOARD_ID_MATROX_MYSTIQUE220_PCI,
                _T("Matrox Mystique 220 [PCI]"), _T("Matrox"), _T("Matrox_Mystique220"),
                0, 0, 0, 0,
-               0x00000000, 0x00200000, 0x00800000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00200000, 0x00800000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &mystique_220_device, 0, GFXBOARD_BUSTYPE_PCI
        },
 #if 0
@@ -427,7 +427,7 @@ static const struct gfxboard boards[] =
                GFXBOARD_ID_GD5446_PCI,
                _T("GD5446 [PCI]"), _T("Cirrus Logic"), _T("GD5446_PCI"),
                0, 0, 0, 0,
-               0x00000000, 0x00400000, 0x00400000, 0x10000000, 0, 0, -1, false, false,
+               0x00000000, 0x00400000, 0x00400000, 0x10000000, 0, BOARD_PCI, -1, false, false,
                0, 0, NULL, &gd5446_device, 0, GFXBOARD_BUSTYPE_PCI
        },
 #endif
index 887bb4ff0cfa63a2ed87cf60d52149d7c778a6e4..d302fe520804b9a6ec03be3debff57f219133b5b 100644 (file)
@@ -287,5 +287,14 @@ struct memoryboardtype
 };
 extern const struct memoryboardtype memoryboards[];
 
+// More information in first revision HRM Appendix_G
+#define BOARD_PROTOAUTOCONFIG 1
+#define BOARD_AUTOCONFIG_Z2 2
+#define BOARD_AUTOCONFIG_Z3 3
+#define BOARD_NONAUTOCONFIG_BEFORE 4
+#define BOARD_NONAUTOCONFIG_AFTER_Z2 5
+#define BOARD_NONAUTOCONFIG_AFTER_Z3 6
+#define BOARD_PCI 7
+#define BOARD_IGNORE 8
 
 #endif /* UAE_AUTOCONF_H */
index d12ff5129303fe3361b130884008a433a55fdfa7..99d22c8b3d849e62d5d8eb82a4bdb5862d515af5 100644 (file)
@@ -11238,7 +11238,7 @@ static void values_to_expansion2_expansion_roms(HWND hDlg, UAEREG *fkey)
                }
                ew(hDlg, IDC_SCSIROMFILE, true);
                ew(hDlg, IDC_SCSIROMCHOOSER, true);
-               hide(hDlg, IDC_SCSIROMFILEAUTOBOOT, 0);
+               hide(hDlg, IDC_SCSIROMFILEAUTOBOOT, !ert->autoboot_jumper);
                if (romtype & ROMTYPE_NOT) {
                        hide(hDlg, IDC_SCSIROMCHOOSER, 1);
                        hide(hDlg, IDC_SCSIROMFILE, 1);
diff --git a/pci.cpp b/pci.cpp
index d7fd47bfc91525a8dcddde7036c8fda4c4aa5b5b..8ba126714f4475ffbfb6eec3248a6dfa40878900 100644 (file)
--- a/pci.cpp
+++ b/pci.cpp
@@ -66,8 +66,11 @@ static struct pci_bridge *pci_bridge_alloc(void)
 
 static struct pci_bridge *pci_bridge_get_zorro(struct romconfig *rc)
 {
+       static int lastbridge;
        for (int i = 0; i < PCI_BRIDGE_MAX; i++) {
-               if (bridges[i] && bridges[i]->rc == rc) {
+               int idx = (i + lastbridge) % PCI_BRIDGE_MAX;
+               if (bridges[idx] && bridges[idx]->rc == rc) {
+                       lastbridge = i;
                        return bridges[i];
                }
        }
@@ -90,10 +93,13 @@ static struct pci_bridge *pci_bridge_alloc_zorro(int offset, struct romconfig *r
 
 struct pci_bridge *pci_bridge_get(void)
 {
-       // FIXME!
+       static int lastbridge;
        for (int i = 0; i < PCI_BRIDGE_MAX; i++) {
-               if (bridges[i])
-                       return bridges[i];
+               int idx = (i + lastbridge) % PCI_BRIDGE_MAX;
+               if (bridges[idx]) {
+                       lastbridge = i;
+                       return bridges[idx];
+               }
        }
        return NULL;
 }
@@ -1452,36 +1458,35 @@ static void REGPARAM2 pci_bridge_lput_2(uaecptr addr, uae_u32 b)
        pci_bridge_wput_2(addr + 2, b >>  0);
 }
 
-
-addrbank pci_config_bank = {
+static addrbank pci_config_bank = {
        pci_config_lget, pci_config_wget, pci_config_bget,
        pci_config_lput, pci_config_wput, pci_config_bput,
        default_xlate, default_check, NULL, NULL, _T("PCI CONFIG"),
        pci_config_lget, pci_config_wget,
        ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE
 };
-addrbank pci_io_bank = {
+static addrbank pci_io_bank = {
        pci_io_lget, pci_io_wget, pci_io_bget,
        pci_io_lput, pci_io_wput, pci_io_bput,
        default_xlate, default_check, NULL, NULL, _T("PCI IO"),
        pci_io_lget, pci_io_wget,
        ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE
 };
-addrbank pci_mem_bank = {
+static addrbank pci_mem_bank = {
        pci_mem_lget, pci_mem_wget, pci_mem_bget,
        pci_mem_lput, pci_mem_wput, pci_mem_bput,
        default_xlate, default_check, NULL, NULL, _T("PCI MEMORY"),
        pci_mem_lget, pci_mem_wget,
        ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE
 };
-addrbank pci_bridge_bank = {
+static addrbank pci_bridge_bank = {
        pci_bridge_lget, pci_bridge_wget, pci_bridge_bget,
        pci_bridge_lput, pci_bridge_wput, pci_bridge_bput,
        default_xlate, default_check, NULL, NULL, _T("PCI BRIDGE"),
        pci_bridge_lget, pci_bridge_wget,
        ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE
 };
-addrbank pci_bridge_bank_2 = {
+static addrbank pci_bridge_bank_2 = {
        pci_bridge_lget_2, pci_bridge_wget_2, pci_bridge_bget_2,
        pci_bridge_lput_2, pci_bridge_wput_2, pci_bridge_bput_2,
        default_xlate, default_check, NULL, NULL, _T("PCI BRIDGE #2"),