Fix BY16 addressing on Cirrus Logic cards.

This commit is contained in:
SarahW 2021-05-29 09:31:21 +01:00
commit 6b80e58487

View file

@ -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)
{