From 3789398ca67aa31e5b6d4bd11097cb062bcaf117 Mon Sep 17 00:00:00 2001 From: TomW Date: Fri, 14 Aug 2015 21:54:42 +0100 Subject: [PATCH] Changed registers used for EGA/VGA odd/even mode. --- src/vid_ega.c | 9 ++++++--- src/vid_ega.h | 2 +- src/vid_svga.c | 12 ++++++++---- src/vid_svga.h | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/vid_ega.c b/src/vid_ega.c index d639429..a389176 100644 --- a/src/vid_ega.c +++ b/src/vid_ega.c @@ -77,6 +77,9 @@ void ega_out(uint16_t addr, uint8_t val, void *p) ega->charsetb = (((val >> 2) & 3) * 0x10000) + 2; ega->charseta = ((val & 3) * 0x10000) + 2; break; + case 4: + ega->chain2_write = !(val & 4); + break; } break; case 0x3ce: @@ -95,10 +98,10 @@ void ega_out(uint16_t addr, uint8_t val, void *p) case 5: ega->writemode = val & 3; ega->readmode = val & 8; + ega->chain2_read = val & 0x10; break; case 6: // pclog("Write mapping %02X\n", val); - ega->chain2 = val & 2; switch (val & 0xc) { case 0x0: /*128k at A0000*/ @@ -622,7 +625,7 @@ void ega_write(uint32_t addr, uint8_t val, void *p) if (addr >= 0xB0000) addr &= 0x7fff; else addr &= 0xffff; - if (ega->chain2) + if (ega->chain2_write) { writemask2 &= ~0xa; if (addr & 1) @@ -755,7 +758,7 @@ uint8_t ega_read(uint32_t addr, void *p) if (addr >= 0xb0000) addr &= 0x7fff; else addr &= 0xffff; - if (ega->chain2) + if (ega->chain2_read) { readplane = (readplane & 2) | (addr & 1); addr &= ~1; diff --git a/src/vid_ega.h b/src/vid_ega.h index fa227ae..c40190b 100644 --- a/src/vid_ega.h +++ b/src/vid_ega.h @@ -23,7 +23,7 @@ typedef struct ega_t int fast; uint8_t colourcompare, colournocare; int readmode, writemode, readplane; - int chain4, chain2; + int chain4, chain2_read, chain2_write; uint8_t writemask; uint32_t charseta, charsetb; diff --git a/src/vid_svga.c b/src/vid_svga.c index 6c0b533..2018b11 100644 --- a/src/vid_svga.c +++ b/src/vid_svga.c @@ -111,6 +111,7 @@ void svga_out(uint16_t addr, uint8_t val, void *p) svga->charsetb += 0x8000; break; case 4: + svga->chain2_write = !(val & 4); svga->chain4 = val & 8; svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && svga->chain4; break; @@ -159,10 +160,13 @@ void svga_out(uint16_t addr, uint8_t val, void *p) { case 2: svga->colourcompare=val; break; case 4: svga->readplane=val&3; break; - case 5: svga->writemode=val&3; svga->readmode=val&8; break; + case 5: + svga->writemode = val & 3; + svga->readmode = val & 8; + svga->chain2_read = val & 0x10; + break; case 6: // pclog("svga_out recalcmapping %p\n", svga); - svga->chain2 = val & 2; if ((svga->gdcreg[6] & 0xc) != (val & 0xc)) { // pclog("Write mapping %02X\n", val); @@ -741,7 +745,7 @@ void svga_write(uint32_t addr, uint8_t val, void *p) writemask2=1<<(addr&3); addr&=~3; } - else if (svga->chain2) + else if (svga->chain2_write) { writemask2 &= ~0xa; if (addr & 1) @@ -928,7 +932,7 @@ uint8_t svga_read(uint32_t addr, void *p) return 0xff; return svga->vram[addr]; } - else if (svga->chain2) + else if (svga->chain2_read) { readplane = (readplane & 2) | (addr & 1); addr &= ~1; diff --git a/src/vid_svga.h b/src/vid_svga.h index 141a6b3..0f514d4 100644 --- a/src/vid_svga.h +++ b/src/vid_svga.h @@ -31,7 +31,7 @@ typedef struct svga_t int fast; uint8_t colourcompare, colournocare; int readmode, writemode, readplane; - int chain4, chain2; + int chain4, chain2_write, chain2_read; uint8_t writemask; uint32_t charseta, charsetb;