From 13e8d9c923ef3198c91aa942aaf8af865968a396 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 30 Jun 2020 03:24:06 +0200 Subject: [PATCH] Fixed Shadow RAM handling for all OPTi 486 chipsets. --- src/chipset/opti495.c | 30 ++++++++++++++++-------------- src/chipset/opti895.c | 30 ++++++++++++++++-------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/chipset/opti495.c b/src/chipset/opti495.c index c192062a7..c3fa1bda4 100644 --- a/src/chipset/opti495.c +++ b/src/chipset/opti495.c @@ -90,14 +90,15 @@ opti495_recalc(opti495_t *dev) if ((dev->regs[0x22] & ((base >= 0xe0000) ? 0x20 : 0x40)) && (dev->regs[0x23] & (1 << i))) { - if (dev->regs[0x26] & 0x40) - shflags = MEM_READ_EXTANY | MEM_WRITE_INTERNAL; - else { - shflags = MEM_READ_INTERNAL; + shflags = MEM_READ_INTERNAL; + shflags |= (dev->regs[0x22] & ((base >= 0xe0000) ? 0x08 : 0x10)) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; + } else { + if (dev->regs[0x26] & 0x40) { + shflags = MEM_READ_EXTANY; shflags |= (dev->regs[0x22] & ((base >= 0xe0000) ? 0x08 : 0x10)) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; - } - } else - shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } else + shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } mem_set_mem_state_both(base, 0x4000, shflags); } @@ -106,14 +107,15 @@ opti495_recalc(opti495_t *dev) base = 0xc0000 + (i << 14); if ((dev->regs[0x26] & 0x10) && (dev->regs[0x26] & (1 << i))) { - if (dev->regs[0x26] & 0x40) - shflags = MEM_READ_EXTANY | MEM_WRITE_INTERNAL; - else { - shflags = MEM_READ_INTERNAL; + shflags = MEM_READ_INTERNAL; + shflags |= (dev->regs[0x26] & 0x20) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; + } else { + if (dev->regs[0x26] & 0x40) { + shflags = MEM_READ_EXTANY; shflags |= (dev->regs[0x26] & 0x20) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; - } - } else - shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } else + shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } mem_set_mem_state_both(base, 0x4000, shflags); } diff --git a/src/chipset/opti895.c b/src/chipset/opti895.c index a01bf099d..8c1f050b4 100644 --- a/src/chipset/opti895.c +++ b/src/chipset/opti895.c @@ -89,14 +89,15 @@ opti895_recalc(opti895_t *dev) base = 0xd0000 + (i << 14); if (dev->regs[0x23] & (1 << i)) { - if (dev->regs[0x26] & 0x40) - shflags = MEM_READ_EXTANY | MEM_WRITE_INTERNAL; - else { - shflags = MEM_READ_INTERNAL; + shflags = MEM_READ_INTERNAL; + shflags |= (dev->regs[0x22] & ((base >= 0xe0000) ? 0x08 : 0x10)) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; + } else { + if (dev->regs[0x26] & 0x40) { + shflags = MEM_READ_EXTANY; shflags |= (dev->regs[0x22] & ((base >= 0xe0000) ? 0x08 : 0x10)) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; - } - } else - shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } else + shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } mem_set_mem_state_both(base, 0x4000, shflags); } @@ -105,14 +106,15 @@ opti895_recalc(opti895_t *dev) base = 0xc0000 + (i << 14); if (dev->regs[0x26] & (1 << i)) { - if (dev->regs[0x26] & 0x40) - shflags = MEM_READ_EXTANY | MEM_WRITE_INTERNAL; - else { - shflags = MEM_READ_INTERNAL; + shflags = MEM_READ_INTERNAL; + shflags |= (dev->regs[0x26] & 0x20) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; + } else { + if (dev->regs[0x26] & 0x40) { + shflags = MEM_READ_EXTANY; shflags |= (dev->regs[0x26] & 0x20) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; - } - } else - shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } else + shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; + } mem_set_mem_state_both(base, 0x4000, shflags); }