Fixed some newly introduced Cirrus Logic bugs.
This commit is contained in:
@@ -539,7 +539,7 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
|
|||||||
svga_recalctimings(svga);
|
svga_recalctimings(svga);
|
||||||
} else {
|
} else {
|
||||||
switch (svga->gdcaddr) {
|
switch (svga->gdcaddr) {
|
||||||
case 0x09: case 0x0a: /* case 0x0b: */
|
case 0x09: case 0x0a: case 0x0b:
|
||||||
gd54xx_recalc_banking(gd54xx);
|
gd54xx_recalc_banking(gd54xx);
|
||||||
if (svga->gdcreg[0xb] & 0x04)
|
if (svga->gdcreg[0xb] & 0x04)
|
||||||
svga->writemode = svga->gdcreg[5] & 7;
|
svga->writemode = svga->gdcreg[5] & 7;
|
||||||
|
|||||||
@@ -881,25 +881,17 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p)
|
|||||||
if (!(svga->gdcreg[6] & 1))
|
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_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");
|
|
||||||
addr <<= 3;
|
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);
|
writemask2 = 1 << (addr & 3);
|
||||||
addr &= ~3;
|
addr &= ~3;
|
||||||
if (svga->writemode >= 4)
|
|
||||||
fatal("write mode %i in chain4 mode\n", svga->writemode);
|
|
||||||
} else if (svga->chain2_write) {
|
} else if (svga->chain2_write) {
|
||||||
writemask2 &= ~0xa;
|
writemask2 &= ~0xa;
|
||||||
if (addr & 1)
|
if (addr & 1)
|
||||||
writemask2 <<= 1;
|
writemask2 <<= 1;
|
||||||
addr &= ~1;
|
addr &= ~1;
|
||||||
addr <<= 2;
|
addr <<= 2;
|
||||||
if (svga->writemode >= 4)
|
|
||||||
fatal("write mode %i in chain odd/even\n", svga->writemode);
|
|
||||||
} else
|
} else
|
||||||
addr <<= 2;
|
addr <<= 2;
|
||||||
|
|
||||||
@@ -1102,13 +1094,9 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p)
|
|||||||
latch_addr = (addr << 2) & svga->decode_mask;
|
latch_addr = (addr << 2) & svga->decode_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (svga->adv_flags & FLAG_ADDR_BY8) {
|
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");
|
|
||||||
addr <<= 3;
|
addr <<= 3;
|
||||||
} else if (svga->chain4 || svga->fb_only) {
|
else if (svga->chain4 || svga->fb_only) {
|
||||||
addr &= svga->decode_mask;
|
addr &= svga->decode_mask;
|
||||||
if (addr >= svga->vram_max)
|
if (addr >= svga->vram_max)
|
||||||
return 0xff;
|
return 0xff;
|
||||||
|
|||||||
Reference in New Issue
Block a user