Fixed EGA and CL-GD542x odd/even mode;
(S)VGA linear write no longer has planar access or ALU things, both of which don't even make sense at linear write.
This commit is contained in:
@@ -353,12 +353,17 @@ void gd5429_write_linear(uint32_t addr, uint8_t val, void *p)
|
|||||||
else if (svga->chain2_write)
|
else if (svga->chain2_write)
|
||||||
{
|
{
|
||||||
/* Redone because the original code caused problems when using Windows 3.1 EGA driver on (S)VGA card. */
|
/* Redone because the original code caused problems when using Windows 3.1 EGA driver on (S)VGA card. */
|
||||||
plane = (addr & 1) | (svga->oddeven_page ? 2 : 0);
|
if (svga->oddeven_chain)
|
||||||
|
plane = (addr & 1) | (svga->oddeven_page ? 2 : 0);
|
||||||
|
else
|
||||||
|
plane = (svga->oddeven_page ? 2 : 0);
|
||||||
mask = (1 << plane);
|
mask = (1 << plane);
|
||||||
if (svga->seqregs[2] & mask)
|
if (svga->seqregs[2] & mask)
|
||||||
{
|
{
|
||||||
addr = (((addr & ~1) | svga->oddeven_chain) << 2) | plane;
|
if (svga->oddeven_chain)
|
||||||
addr &= 0x7fffff;
|
addr = ((addr & ~1) << 2) | plane;
|
||||||
|
else
|
||||||
|
addr = (addr << 2) | plane;
|
||||||
if ((!svga->extvram) && (addr >= 0x10000)) return;
|
if ((!svga->extvram) && (addr >= 0x10000)) return;
|
||||||
if (addr >= svga->vram_limit) return;
|
if (addr >= svga->vram_limit) return;
|
||||||
if ((raddr <= 0xA0000) || (raddr >= 0xBFFFF)) return;
|
if ((raddr <= 0xA0000) || (raddr >= 0xBFFFF)) return;
|
||||||
|
@@ -724,11 +724,18 @@ void ega_write(uint32_t addr, uint8_t val, void *p)
|
|||||||
|
|
||||||
if (ega->chain2_write)
|
if (ega->chain2_write)
|
||||||
{
|
{
|
||||||
plane = (addr & 1) | (ega->oddeven_page ? 2 : 0);
|
/* Redone because the original code caused problems when using Windows 3.1 EGA driver on (S)VGA card. */
|
||||||
|
if (ega->oddeven_chain)
|
||||||
|
plane = (addr & 1) | (ega->oddeven_page ? 2 : 0);
|
||||||
|
else
|
||||||
|
plane = (ega->oddeven_page ? 2 : 0);
|
||||||
mask = (1 << plane);
|
mask = (1 << plane);
|
||||||
if (ega->seqregs[2] & mask)
|
if (ega->seqregs[2] & mask)
|
||||||
{
|
{
|
||||||
addr = (((addr & ~1) | ega->oddeven_chain) << 2) | plane;
|
if (ega->oddeven_chain)
|
||||||
|
addr = ((addr & ~1) << 2) | plane;
|
||||||
|
else
|
||||||
|
addr = (addr << 2) | plane;
|
||||||
if ((!ega->extvram) && (addr >= 0x10000)) return;
|
if ((!ega->extvram) && (addr >= 0x10000)) return;
|
||||||
if (addr >= 0x40000) return;
|
if (addr >= 0x40000) return;
|
||||||
if ((raddr <= 0xA0000) || (raddr >= 0xBFFFF)) return;
|
if ((raddr <= 0xA0000) || (raddr >= 0xBFFFF)) return;
|
||||||
@@ -863,10 +870,20 @@ uint8_t ega_read(uint32_t addr, void *p)
|
|||||||
if (addr >= 0xb0000) addr &= 0x7fff;
|
if (addr >= 0xb0000) addr &= 0x7fff;
|
||||||
else addr &= 0xffff;
|
else addr &= 0xffff;
|
||||||
|
|
||||||
if (ega->chain2_read)
|
if (svga->chain2_read)
|
||||||
{
|
{
|
||||||
plane = (addr & 1) | (ega->oddeven_page ? 2 : 0);
|
/* Redone because the original code caused problems when using Windows 3.1 EGA driver on (S)VGA card. */
|
||||||
addr = (((addr & ~1) | ega->oddeven_chain) << 2) | plane;
|
if (ega->oddeven_chain)
|
||||||
|
{
|
||||||
|
plane = (addr & 1) | (ega->oddeven_page ? 2 : 0);
|
||||||
|
addr = ((addr & ~1) << 2) | plane;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plane = (ega->oddeven_page ? 2 : 0);
|
||||||
|
addr = (addr << 2) | plane;
|
||||||
|
}
|
||||||
|
|
||||||
if ((!ega->extvram) && (addr >= 0x10000)) return 0xff;
|
if ((!ega->extvram) && (addr >= 0x10000)) return 0xff;
|
||||||
if (addr >= 0x40000) return 0xff;
|
if (addr >= 0x40000) return 0xff;
|
||||||
return ega->vram[addr];
|
return ega->vram[addr];
|
||||||
|
@@ -1098,6 +1098,7 @@ uint8_t svga_read(uint32_t addr, void *p)
|
|||||||
return svga->vram[addr | readplane];
|
return svga->vram[addr | readplane];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
void svga_write_linear(uint32_t addr, uint8_t val, void *p)
|
void svga_write_linear(uint32_t addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
svga_t *svga = (svga_t *)p;
|
svga_t *svga = (svga_t *)p;
|
||||||
@@ -1377,6 +1378,7 @@ uint8_t svga_read_linear(uint32_t addr, void *p)
|
|||||||
//printf("Read %02X %04X %04X\n",vram[addr|svga->readplane],addr,svga->readplane);
|
//printf("Read %02X %04X %04X\n",vram[addr|svga->readplane],addr,svga->readplane);
|
||||||
return svga->vram[addr | readplane];
|
return svga->vram[addr | readplane];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void svga_doblit(int y1, int y2, int wx, int wy, svga_t *svga)
|
void svga_doblit(int y1, int y2, int wx, int wy, svga_t *svga)
|
||||||
{
|
{
|
||||||
@@ -1553,7 +1555,6 @@ uint32_t svga_readl(uint32_t addr, void *p)
|
|||||||
return *(uint32_t *)&svga->vram[addr];
|
return *(uint32_t *)&svga->vram[addr];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
void svga_write_linear(uint32_t addr, uint8_t val, void *p)
|
void svga_write_linear(uint32_t addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
svga_t *svga = (svga_t *)p;
|
svga_t *svga = (svga_t *)p;
|
||||||
@@ -1573,7 +1574,6 @@ void svga_write_linear(uint32_t addr, uint8_t val, void *p)
|
|||||||
svga->changedvram[addr >> 12] = changeframecount;
|
svga->changedvram[addr >> 12] = changeframecount;
|
||||||
*(uint8_t *)&svga->vram[addr] = val;
|
*(uint8_t *)&svga->vram[addr] = val;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void svga_writew_linear(uint32_t addr, uint16_t val, void *p)
|
void svga_writew_linear(uint32_t addr, uint16_t val, void *p)
|
||||||
{
|
{
|
||||||
@@ -1631,7 +1631,6 @@ void svga_writel_linear(uint32_t addr, uint32_t val, void *p)
|
|||||||
*(uint32_t *)&svga->vram[addr] = val;
|
*(uint32_t *)&svga->vram[addr] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
uint8_t svga_read_linear(uint32_t addr, void *p)
|
uint8_t svga_read_linear(uint32_t addr, void *p)
|
||||||
{
|
{
|
||||||
svga_t *svga = (svga_t *)p;
|
svga_t *svga = (svga_t *)p;
|
||||||
@@ -1649,7 +1648,6 @@ uint8_t svga_read_linear(uint32_t addr, void *p)
|
|||||||
|
|
||||||
return *(uint8_t *)&svga->vram[addr];
|
return *(uint8_t *)&svga->vram[addr];
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t svga_readw_linear(uint32_t addr, void *p)
|
uint16_t svga_readw_linear(uint32_t addr, void *p)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user