diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index e843bbb95..73c176742 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -23,6 +23,7 @@ #define FLAG_EXT_WRITE 4 #define FLAG_LATCH8 8 #define FLAG_NOSKEW 16 +#define FLAG_ADDR_BY16 32 typedef struct { diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 5725d8914..777fdb348 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -901,6 +901,8 @@ 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) + svga->adv_flags |= FLAG_ADDR_BY16; gd54xx_recalc_banking(gd54xx); break; @@ -1994,7 +1996,7 @@ gd54xx_write_modes45(svga_t *svga, uint8_t val, uint32_t addr) switch (svga->writemode) { case 4: - if (svga->gdcreg[0xb] & 0x10) { + if (svga->adv_flags & FLAG_ADDR_BY16) { addr <<= 2; addr &= svga->decode_mask; @@ -2016,7 +2018,7 @@ gd54xx_write_modes45(svga_t *svga, uint8_t val, uint32_t addr) break; case 5: - if (svga->gdcreg[0xb] & 0x10) { + if (svga->adv_flags & FLAG_ADDR_BY16) { addr <<= 2; addr &= svga->decode_mask; diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 2dbd1566f..07f6f3823 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -1056,9 +1056,11 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) } if (!(svga->gdcreg[6] & 1)) - svga->fullchange = 2; + svga->fullchange = 2; - if ((svga->adv_flags & FLAG_ADDR_BY8) && (svga->writemode < 4)) + if ((svga->adv_flags & FLAG_ADDR_BY16) && (svga->writemode == 4 || svga->writemode == 5)) + addr <<= 4; + else if ((svga->adv_flags & FLAG_ADDR_BY8) && (svga->writemode < 4)) addr <<= 3; else if (((svga->chain4 && svga->packed_chain4) || svga->fb_only) && (svga->writemode < 4)) { writemask2 = 1 << (addr & 3); @@ -1244,7 +1246,9 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p) latch_addr = (addr << count) & svga->decode_mask; count = (1 << count); - if (svga->adv_flags & FLAG_ADDR_BY8) + if (svga->adv_flags & FLAG_ADDR_BY16) + addr <<= 4; + else if (svga->adv_flags & FLAG_ADDR_BY8) addr <<= 3; else if ((svga->chain4 && svga->packed_chain4) || svga->fb_only) { addr &= svga->decode_mask;