Fixed some newly introduced Cirrus Logic bugs.

This commit is contained in:
OBattler
2019-10-01 16:21:35 +02:00
parent b026b244fe
commit c7b676dfef
2 changed files with 5 additions and 17 deletions

View File

@@ -539,7 +539,7 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
svga_recalctimings(svga);
} else {
switch (svga->gdcaddr) {
case 0x09: case 0x0a: /* case 0x0b: */
case 0x09: case 0x0a: case 0x0b:
gd54xx_recalc_banking(gd54xx);
if (svga->gdcreg[0xb] & 0x04)
svga->writemode = svga->gdcreg[5] & 7;

View File

@@ -881,25 +881,17 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p)
if (!(svga->gdcreg[6] & 1))
svga->fullchange = 2;
if ((svga->adv_flags & FLAG_ADDR_BY8) && (svga->writemode < 4)) {
if (svga->fb_only)
fatal("BY8 write in fb_only\n");
if (svga->chain2_write)
fatal("BY8 write in chain2\n");
if ((svga->adv_flags & FLAG_ADDR_BY8) && (svga->writemode < 4))
addr <<= 3;
} else if ((svga->chain4 || svga->fb_only) && (svga->writemode < 4)) {
else if ((svga->chain4 || svga->fb_only) && (svga->writemode < 4)) {
writemask2 = 1 << (addr & 3);
addr &= ~3;
if (svga->writemode >= 4)
fatal("write mode %i in chain4 mode\n", svga->writemode);
} else if (svga->chain2_write) {
writemask2 &= ~0xa;
if (addr & 1)
writemask2 <<= 1;
addr &= ~1;
addr <<= 2;
if (svga->writemode >= 4)
fatal("write mode %i in chain odd/even\n", svga->writemode);
} else
addr <<= 2;
@@ -1102,13 +1094,9 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p)
latch_addr = (addr << 2) & svga->decode_mask;
}
if (svga->adv_flags & FLAG_ADDR_BY8) {
if (svga->fb_only)
fatal("BY8 read in fb_only\n");
if (svga->chain2_read)
fatal("BY8 read in chain2\n");
if (svga->adv_flags & FLAG_ADDR_BY8)
addr <<= 3;
} else if (svga->chain4 || svga->fb_only) {
else if (svga->chain4 || svga->fb_only) {
addr &= svga->decode_mask;
if (addr >= svga->vram_max)
return 0xff;