diff --git a/src/vid_cl5429.c b/src/vid_cl5429.c index a2aeedd7e..a73d57cdf 100644 --- a/src/vid_cl5429.c +++ b/src/vid_cl5429.c @@ -353,12 +353,17 @@ void gd5429_write_linear(uint32_t addr, uint8_t val, void *p) else if (svga->chain2_write) { /* Redone because the original code caused problems when using Windows 3.1 EGA driver on (S)VGA card. */ - plane = (addr & 1) | (svga->oddeven_page ? 2 : 0); + if (svga->oddeven_chain) + plane = (addr & 1) | (svga->oddeven_page ? 2 : 0); + else + plane = (svga->oddeven_page ? 2 : 0); mask = (1 << plane); if (svga->seqregs[2] & mask) { - addr = (((addr & ~1) | svga->oddeven_chain) << 2) | plane; - addr &= 0x7fffff; + if (svga->oddeven_chain) + addr = ((addr & ~1) << 2) | plane; + else + addr = (addr << 2) | plane; if ((!svga->extvram) && (addr >= 0x10000)) return; if (addr >= svga->vram_limit) return; if ((raddr <= 0xA0000) || (raddr >= 0xBFFFF)) return; diff --git a/src/vid_ega.c b/src/vid_ega.c index b236b039b..97b2762a5 100644 --- a/src/vid_ega.c +++ b/src/vid_ega.c @@ -724,11 +724,18 @@ void ega_write(uint32_t addr, uint8_t val, void *p) if (ega->chain2_write) { - plane = (addr & 1) | (ega->oddeven_page ? 2 : 0); + /* Redone because the original code caused problems when using Windows 3.1 EGA driver on (S)VGA card. */ + if (ega->oddeven_chain) + plane = (addr & 1) | (ega->oddeven_page ? 2 : 0); + else + plane = (ega->oddeven_page ? 2 : 0); mask = (1 << plane); if (ega->seqregs[2] & mask) { - addr = (((addr & ~1) | ega->oddeven_chain) << 2) | plane; + if (ega->oddeven_chain) + addr = ((addr & ~1) << 2) | plane; + else + addr = (addr << 2) | plane; if ((!ega->extvram) && (addr >= 0x10000)) return; if (addr >= 0x40000) return; if ((raddr <= 0xA0000) || (raddr >= 0xBFFFF)) return; @@ -863,10 +870,20 @@ uint8_t ega_read(uint32_t addr, void *p) if (addr >= 0xb0000) addr &= 0x7fff; else addr &= 0xffff; - if (ega->chain2_read) + if (svga->chain2_read) { - plane = (addr & 1) | (ega->oddeven_page ? 2 : 0); - addr = (((addr & ~1) | ega->oddeven_chain) << 2) | plane; + /* Redone because the original code caused problems when using Windows 3.1 EGA driver on (S)VGA card. */ + if (ega->oddeven_chain) + { + plane = (addr & 1) | (ega->oddeven_page ? 2 : 0); + addr = ((addr & ~1) << 2) | plane; + } + else + { + plane = (ega->oddeven_page ? 2 : 0); + addr = (addr << 2) | plane; + } + if ((!ega->extvram) && (addr >= 0x10000)) return 0xff; if (addr >= 0x40000) return 0xff; return ega->vram[addr]; diff --git a/src/vid_svga.c b/src/vid_svga.c index da960e84c..6952f0ed0 100644 --- a/src/vid_svga.c +++ b/src/vid_svga.c @@ -1098,6 +1098,7 @@ uint8_t svga_read(uint32_t addr, void *p) return svga->vram[addr | readplane]; } +#if 0 void svga_write_linear(uint32_t addr, uint8_t val, void *p) { svga_t *svga = (svga_t *)p; @@ -1377,6 +1378,7 @@ uint8_t svga_read_linear(uint32_t addr, void *p) //printf("Read %02X %04X %04X\n",vram[addr|svga->readplane],addr,svga->readplane); return svga->vram[addr | readplane]; } +#endif void svga_doblit(int y1, int y2, int wx, int wy, svga_t *svga) { @@ -1553,7 +1555,6 @@ uint32_t svga_readl(uint32_t addr, void *p) return *(uint32_t *)&svga->vram[addr]; } -#if 0 void svga_write_linear(uint32_t addr, uint8_t val, void *p) { svga_t *svga = (svga_t *)p; @@ -1573,7 +1574,6 @@ void svga_write_linear(uint32_t addr, uint8_t val, void *p) svga->changedvram[addr >> 12] = changeframecount; *(uint8_t *)&svga->vram[addr] = val; } -#endif void svga_writew_linear(uint32_t addr, uint16_t val, void *p) { @@ -1631,7 +1631,6 @@ void svga_writel_linear(uint32_t addr, uint32_t val, void *p) *(uint32_t *)&svga->vram[addr] = val; } -#if 0 uint8_t svga_read_linear(uint32_t addr, void *p) { svga_t *svga = (svga_t *)p; @@ -1649,7 +1648,6 @@ uint8_t svga_read_linear(uint32_t addr, void *p) return *(uint8_t *)&svga->vram[addr]; } -#endif uint16_t svga_readw_linear(uint32_t addr, void *p) {