Ported the Cirrus by16 fix.
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#define FLAG_EXT_WRITE 4
|
||||
#define FLAG_LATCH8 8
|
||||
#define FLAG_NOSKEW 16
|
||||
#define FLAG_ADDR_BY16 32
|
||||
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user