From e6a87f3c3f2e521ad718d82a743945a998c8778a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 01:39:34 +0600 Subject: [PATCH 1/4] cl54xx: clear only FLAG_EXT_WRITE and FLAG_ADDR_BY16 --- src/video/vid_cl54xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index a1effc16a..f079bff9f 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -895,7 +895,7 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) else { svga->gdcreg[5] &= ~0x04; svga->writemode = svga->gdcreg[5] & 3; - svga->adv_flags = 0; + svga->adv_flags &= (FLAG_EXTRA_BANKS | FLAG_ADDR_BY8 | FLAG_LATCH8); svga->gdcreg[0] &= 0x0f; gd543x_mmio_write(0xb8000, svga->gdcreg[0], gd54xx); svga->gdcreg[1] &= 0x0f; From 261e20ba736b8c83de2bc97afe059a53f7d35dd0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 14:35:56 +0600 Subject: [PATCH 2/4] cl54xx: clear GR1 and GR0 when disabling enabled extensions --- src/video/vid_cl54xx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index f079bff9f..6b7223761 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -876,8 +876,6 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) svga_recalctimings(svga); } else { switch (svga->gdcaddr) { - case 0x09: - case 0x0a: case 0x0b: svga->adv_flags = 0; if (svga->gdcreg[0xb] & 0x01) @@ -888,11 +886,11 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) svga->adv_flags |= FLAG_EXT_WRITE; if (svga->gdcreg[0xb] & 0x08) svga->adv_flags |= FLAG_LATCH8; - if (svga->gdcreg[0xb] & 0x10) + if ((svga->gdcreg[0xb] & 0x10) && (svga->adv_flags & FLAG_EXT_WRITE)) svga->adv_flags |= FLAG_ADDR_BY16; if (svga->gdcreg[0xb] & 0x04) svga->writemode = svga->gdcreg[5] & 7; - else { + else if (o & 0x4) { svga->gdcreg[5] &= ~0x04; svga->writemode = svga->gdcreg[5] & 3; svga->adv_flags &= (FLAG_EXTRA_BANKS | FLAG_ADDR_BY8 | FLAG_LATCH8); @@ -902,6 +900,8 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) gd543x_mmio_write(0xb8004, svga->gdcreg[1], gd54xx); svga->seqregs[2] &= 0x0f; } + case 0x09: + case 0x0a: gd54xx_recalc_banking(gd54xx); break; From 82c9ce1d210abe4e04c9fa44c2fe270d687c97b4 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 15:10:19 +0600 Subject: [PATCH 3/4] CL-GD5436 leaves GR0 and GR1 untouched --- src/video/vid_cl54xx.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 6b7223761..8f145fc56 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -894,10 +894,12 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) svga->gdcreg[5] &= ~0x04; svga->writemode = svga->gdcreg[5] & 3; svga->adv_flags &= (FLAG_EXTRA_BANKS | FLAG_ADDR_BY8 | FLAG_LATCH8); - svga->gdcreg[0] &= 0x0f; - gd543x_mmio_write(0xb8000, svga->gdcreg[0], gd54xx); - svga->gdcreg[1] &= 0x0f; - gd543x_mmio_write(0xb8004, svga->gdcreg[1], gd54xx); + if (svga->crtc[0x27] != CIRRUS_ID_CLGD5436) { + svga->gdcreg[0] &= 0x0f; + gd543x_mmio_write(0xb8000, svga->gdcreg[0], gd54xx); + svga->gdcreg[1] &= 0x0f; + gd543x_mmio_write(0xb8004, svga->gdcreg[1], gd54xx); + } svga->seqregs[2] &= 0x0f; } case 0x09: From d4ed4a57dfbd0c079f5b7aee9f6442b4c9f6184f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 15:41:11 +0600 Subject: [PATCH 4/4] cl54xx: Device ID remains constant and read only --- src/video/vid_cl54xx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 8f145fc56..c3fd19e58 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -1031,6 +1031,8 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) case 0x3d5: if (((svga->crtcreg == 0x19) || (svga->crtcreg == 0x1a) || (svga->crtcreg == 0x1b) || (svga->crtcreg == 0x1d) || (svga->crtcreg == 0x25) || (svga->crtcreg == 0x27)) && !gd54xx->unlocked) return; + if ((svga->crtcreg == 0x25) || (svga->crtcreg == 0x27)) + return; if ((svga->crtcreg < 7) && (svga->crtc[0x11] & 0x80)) return; if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80))