]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix Mediator 1200TX second PCI window.
authorToni Wilen <twilen@winuae.net>
Mon, 17 Mar 2025 16:39:21 +0000 (18:39 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 17 Mar 2025 16:39:21 +0000 (18:39 +0200)
pci.cpp

diff --git a/pci.cpp b/pci.cpp
index 8ba126714f4475ffbfb6eec3248a6dfa40878900..1ff2d83252cbc414ffb8b741de63050fd91991e9 100644 (file)
--- a/pci.cpp
+++ b/pci.cpp
@@ -1233,6 +1233,13 @@ static void REGPARAM2 pci_bridge_bput(uaecptr addr, uae_u32 b)
        }
 }
 
+static void mediator_set_window_offset_window(struct pci_bridge *pcib, int window)
+{
+       pcib->memory_start_offset[window] = ((pcib->window[0] & 0xe000) | (pcib->window[window] & 0x1fff)) << 16;
+       pcib->memory_start_offset[window] -= window * 0x00400000;
+       pcib->memory_start_offset[window] -= pcib->baseaddress;
+       pcib->memory_start_offset[window] = 0 - pcib->memory_start_offset[window];
+}
 
 static void mediator_set_window_offset(struct pci_bridge *pcib, uae_u16 v)
 {
@@ -1246,21 +1253,15 @@ static void mediator_set_window_offset(struct pci_bridge *pcib, uae_u16 v)
                if (pcib->multiwindow) {
                        // TX has 2x4M banks
                        if (v & 0x0010) {
+                               // Second bank limit: 3 top bits come from window 0.
                                pcib->window[1] = v & 0xffc0;
-                               pcib->memory_start_offset[1] = pcib->window[1] << 16;
-                               pcib->memory_start_offset[1] -= 0x00400000;
-                               pcib->memory_start_offset[1] -= pcib->baseaddress;
-                               pcib->memory_start_offset[1] = 0 - pcib->memory_start_offset[1];
                        }
-               } else {
-                       v &= ~0x0010;
                }
                if (!(v& 0x0010)) {
                        pcib->window[0] = v & 0xffc0;
-                       pcib->memory_start_offset[0] = pcib->window[0] << 16;
-                       pcib->memory_start_offset[0] -= pcib->baseaddress;
-                       pcib->memory_start_offset[0] = 0 - pcib->memory_start_offset[0];
                }
+               mediator_set_window_offset_window(pcib, 0);
+               mediator_set_window_offset_window(pcib, 1);
        }
 }