Fixed black screen and crash when using the ATI VGA Wonder XL24.
This commit is contained in:
@@ -42,26 +42,26 @@ void ati28800_out(uint16_t addr, uint8_t val, void *p)
|
|||||||
ati28800->index = val;
|
ati28800->index = val;
|
||||||
break;
|
break;
|
||||||
case 0x1cf:
|
case 0x1cf:
|
||||||
ati28800->regs[ati28800->index] = val;
|
ati28800->regs[ati28800->index & 0x3f] = val;
|
||||||
switch (ati28800->index)
|
switch (ati28800->index & 0x3f)
|
||||||
{
|
{
|
||||||
case 0xad:
|
case 0x2d:
|
||||||
if (gfxcard == GFX_VGAWONDERXL24)
|
if ((gfxcard == GFX_VGAWONDERXL24) && (val & 8))
|
||||||
{
|
{
|
||||||
svga->charseta = (svga->charseta & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
svga->charseta = (svga->charseta & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
||||||
svga->charsetb = (svga->charsetb & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
svga->charsetb = (svga->charsetb & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xb2:
|
case 0x32:
|
||||||
case 0xbe:
|
case 0x3e:
|
||||||
if (ati28800->regs[0xbe] & 8) /*Read/write bank mode*/
|
if (ati28800->regs[0x3e] & 8) /*Read/write bank mode*/
|
||||||
{
|
{
|
||||||
svga->read_bank = ((ati28800->regs[0xb2] >> 5) & 7) * 0x10000;
|
svga->read_bank = ((ati28800->regs[0x32] >> 5) & 7) * 0x10000;
|
||||||
svga->write_bank = ((ati28800->regs[0xb2] >> 1) & 7) * 0x10000;
|
svga->write_bank = ((ati28800->regs[0x32] >> 1) & 7) * 0x10000;
|
||||||
}
|
}
|
||||||
else /*Single bank mode*/
|
else /*Single bank mode*/
|
||||||
svga->read_bank = svga->write_bank = ((ati28800->regs[0xb2] >> 1) & 7) * 0x10000;
|
svga->read_bank = svga->write_bank = ((ati28800->regs[0x32] >> 1) & 7) * 0x10000;
|
||||||
break;
|
break;
|
||||||
case 0xb3:
|
case 0xb3:
|
||||||
ati_eeprom_write(&ati28800->eeprom, val & 8, val & 2, val & 1);
|
ati_eeprom_write(&ati28800->eeprom, val & 8, val & 2, val & 1);
|
||||||
@@ -110,20 +110,20 @@ uint8_t ati28800_in(uint16_t addr, void *p)
|
|||||||
temp = ati28800->index;
|
temp = ati28800->index;
|
||||||
break;
|
break;
|
||||||
case 0x1cf:
|
case 0x1cf:
|
||||||
switch (ati28800->index)
|
switch (ati28800->index & 0x3f)
|
||||||
{
|
{
|
||||||
case 0xaa:
|
case 0x2a:
|
||||||
temp = (gfxcard == GFX_VGAWONDERXL24) ? 6 : 5;
|
temp = (gfxcard == GFX_VGAWONDERXL24) ? 6 : 5;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xb7:
|
case 0x37:
|
||||||
temp = ati28800->regs[ati28800->index] & ~8;
|
temp = ati28800->regs[ati28800->index & 0x3f] & ~8;
|
||||||
if (ati_eeprom_read(&ati28800->eeprom))
|
if (ati_eeprom_read(&ati28800->eeprom))
|
||||||
temp |= 8;
|
temp |= 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
temp = ati28800->regs[ati28800->index];
|
temp = ati28800->regs[ati28800->index & 0x3f];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -187,7 +187,7 @@ void ati28800_svga_recalctimings(ati28800_t *ati28800)
|
|||||||
svga->hdisp++;
|
svga->hdisp++;
|
||||||
|
|
||||||
svga->htotal = svga->crtc[0];
|
svga->htotal = svga->crtc[0];
|
||||||
if ((ati28800->regs[0xad] & 8) && (gfxcard == GFX_VGAWONDERXL24)) svga->htotal |= (ati28800->regs[0xad] & 1) ? 0x100 : 0;
|
if ((ati28800->regs[0x2d] & 8) && (gfxcard == GFX_VGAWONDERXL24)) svga->htotal |= (ati28800->regs[0x2d] & 1) ? 0x100 : 0;
|
||||||
svga->htotal += 6; /*+6 is required for Tyrian*/
|
svga->htotal += 6; /*+6 is required for Tyrian*/
|
||||||
|
|
||||||
svga->rowoffset = svga->crtc[0x13];
|
svga->rowoffset = svga->crtc[0x13];
|
||||||
@@ -312,7 +312,7 @@ void ati28800_recalctimings(svga_t *svga)
|
|||||||
#ifndef RELEASE_BUILD
|
#ifndef RELEASE_BUILD
|
||||||
pclog("ati28800_recalctimings\n");
|
pclog("ati28800_recalctimings\n");
|
||||||
#endif
|
#endif
|
||||||
if (!svga->scrblank && (ati28800->regs[0xb0] & 0x20)) /*Extended 256 colour modes*/
|
if (!svga->scrblank && (ati28800->regs[0x30] & 0x20)) /*Extended 256 colour modes*/
|
||||||
{
|
{
|
||||||
#ifndef RELEASE_BUILD
|
#ifndef RELEASE_BUILD
|
||||||
pclog("8bpp_highres\n");
|
pclog("8bpp_highres\n");
|
||||||
|
@@ -276,8 +276,11 @@ void mach64_out(uint16_t addr, uint8_t val, void *p)
|
|||||||
mach64->regs[mach64->index & 0x3f] = val;
|
mach64->regs[mach64->index & 0x3f] = val;
|
||||||
if ((mach64->index & 0x3f) == 0x2d)
|
if ((mach64->index & 0x3f) == 0x2d)
|
||||||
{
|
{
|
||||||
svga->charseta = (svga->charseta & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
if (val & 8)
|
||||||
svga->charsetb = (svga->charsetb & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
{
|
||||||
|
svga->charseta = (svga->charseta & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
||||||
|
svga->charsetb = (svga->charsetb & 0x3ffff) | ((((uint32_t) val) >> 4) << 18);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((mach64->index & 0x3f) == 0x36)
|
if ((mach64->index & 0x3f) == 0x36)
|
||||||
|
@@ -136,8 +136,10 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
|
|||||||
svga->writemask = val & 0xf;
|
svga->writemask = val & 0xf;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
svga->charsetb = (((val >> 2) & 3) * 0x10000) + 2;
|
svga->charsetb &= ~0x3ffff;
|
||||||
svga->charseta = ((val & 3) * 0x10000) + 2;
|
svga->charseta &= ~0x3ffff;
|
||||||
|
svga->charsetb |= (((val >> 2) & 3) * 0x10000) + 2;
|
||||||
|
svga->charseta |= ((val & 3) * 0x10000) + 2;
|
||||||
if (val & 0x10)
|
if (val & 0x10)
|
||||||
svga->charseta += 0x8000;
|
svga->charseta += 0x8000;
|
||||||
if (val & 0x20)
|
if (val & 0x20)
|
||||||
|
@@ -128,6 +128,7 @@ void svga_render_text_80(svga_t *svga)
|
|||||||
attr = svga->vram[(svga->ma << 1) + 1];
|
attr = svga->vram[(svga->ma << 1) + 1];
|
||||||
if (attr & 8) charaddr = svga->charsetb + (chr * 128);
|
if (attr & 8) charaddr = svga->charsetb + (chr * 128);
|
||||||
else charaddr = svga->charseta + (chr * 128);
|
else charaddr = svga->charseta + (chr * 128);
|
||||||
|
pclog("Character address is: %08X\n", charaddr);
|
||||||
|
|
||||||
if (drawcursor)
|
if (drawcursor)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user