From 6b80e58487de186faea190638fe5a63881bad30e Mon Sep 17 00:00:00 2001 From: SarahW Date: Sat, 29 May 2021 09:31:21 +0100 Subject: [PATCH] Fix BY16 addressing on Cirrus Logic cards. --- src/vid_cl5429.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/vid_cl5429.c b/src/vid_cl5429.c index 852406e..51584cd 100644 --- a/src/vid_cl5429.c +++ b/src/vid_cl5429.c @@ -96,9 +96,10 @@ typedef struct gd5429_t int vidsys_ena; } gd5429_t; -#define GRB_X8_ADDRESSING (1 << 1) -#define GRB_WRITEMODE_EXT (1 << 2) -#define GRB_8B_LATCHES (1 << 3) +#define GRB_X8_ADDRESSING (1 << 1) +#define GRB_WRITEMODE_EXT (1 << 2) +#define GRB_8B_LATCHES (1 << 3) +#define GRB_ENHANCED_16BIT (1 << 4) static void gd5429_mmio_write(uint32_t addr, uint8_t val, void *p); static void gd5429_mmio_writew(uint32_t addr, uint16_t val, void *p); @@ -845,7 +846,9 @@ void gd5429_write_linear(uint32_t addr, uint8_t val, void *p) // if (svga_output) pclog("Write LFB %08X %02X ", addr, val); if (!(svga->gdcreg[6] & 1)) svga->fullchange = 2; - if (svga->gdcreg[0xb] & GRB_X8_ADDRESSING) + if (svga->gdcreg[0xb] & GRB_ENHANCED_16BIT) + addr <<= 4; + else if (svga->gdcreg[0xb] & GRB_X8_ADDRESSING) addr <<= 3; else if (((svga->chain4 && svga->packed_chain4) || svga->fb_only) && (svga->writemode < 4)) { @@ -879,10 +882,9 @@ void gd5429_write_linear(uint32_t addr, uint8_t val, void *p) switch (svga->writemode) { case 4: - if (svga->gdcreg[0xb] & 0x10) + if (svga->gdcreg[0xb] & GRB_ENHANCED_16BIT) { // pclog("Writemode 4 : %X ", addr); - addr <<= 2; svga->changedvram[addr >> 12] = changeframecount; // pclog("%X %X %02x\n", addr, val, svga->gdcreg[0xb]); if (val & svga->seqregs[2] & 0x80) @@ -951,10 +953,9 @@ void gd5429_write_linear(uint32_t addr, uint8_t val, void *p) break; case 5: - if (svga->gdcreg[0xb] & 0x10) + if (svga->gdcreg[0xb] & GRB_ENHANCED_16BIT) { // pclog("Writemode 5 : %X ", addr); - addr <<= 2; svga->changedvram[addr >> 12] = changeframecount; // pclog("%X %X %02x\n", addr, val, svga->gdcreg[0xb]); if (svga->seqregs[2] & 0x80) @@ -1194,12 +1195,16 @@ uint8_t gd5429_read_linear(uint32_t addr, void *p) egareads++; - if (svga->gdcreg[0xb] & GRB_X8_ADDRESSING) + if (svga->gdcreg[0xb] & GRB_ENHANCED_16BIT) + latch_addr = (addr << 4) & svga->decode_mask; + else if (svga->gdcreg[0xb] & GRB_X8_ADDRESSING) latch_addr = (addr << 3) & svga->decode_mask; else latch_addr = (addr << 2) & svga->decode_mask; - if (svga->gdcreg[0xb] & GRB_X8_ADDRESSING) + if (svga->gdcreg[0xb] & GRB_ENHANCED_16BIT) + addr <<= 4; + else if (svga->gdcreg[0xb] & GRB_X8_ADDRESSING) addr <<= 3; else if ((svga->chain4 && svga->packed_chain4) || svga->fb_only) {