Add support for 64x64 cursors to Cirrus Logic cards (used by OS/2 Warp).
This commit is contained in:
parent
12f8751e5c
commit
e2c7bf02ab
1 changed files with 52 additions and 17 deletions
|
|
@ -126,10 +126,17 @@ void gd5429_out(uint16_t addr, uint8_t val, void *p)
|
||||||
svga->hwcursor.ena = val & 1;
|
svga->hwcursor.ena = val & 1;
|
||||||
svga->hwcursor.ysize = (val & 4) ? 64 : 32;
|
svga->hwcursor.ysize = (val & 4) ? 64 : 32;
|
||||||
svga->hwcursor.yoff = 0;
|
svga->hwcursor.yoff = 0;
|
||||||
|
if (svga->hwcursor.ysize == 64)
|
||||||
|
svga->hwcursor.addr = (0x3fc000 + ((svga->seqregs[0x13] & 0x3c) * 256)) & svga->vram_mask;
|
||||||
|
else
|
||||||
|
svga->hwcursor.addr = (0x3fc000 + ((svga->seqregs[0x13] & 0x3f) * 256)) & svga->vram_mask;
|
||||||
// pclog("svga->hwcursor.ena = %i\n", svga->hwcursor.ena);
|
// pclog("svga->hwcursor.ena = %i\n", svga->hwcursor.ena);
|
||||||
break;
|
break;
|
||||||
case 0x13:
|
case 0x13:
|
||||||
svga->hwcursor.addr = (0x3fc000 + ((val & 0x3f) * 256)) & svga->vram_mask;
|
if (svga->hwcursor.ysize == 64)
|
||||||
|
svga->hwcursor.addr = (0x3fc000 + ((val & 0x3c) * 256)) & svga->vram_mask;
|
||||||
|
else
|
||||||
|
svga->hwcursor.addr = (0x3fc000 + ((val & 0x3f) * 256)) & svga->vram_mask;
|
||||||
// pclog("svga->hwcursor.addr = %x\n", svga->hwcursor.addr);
|
// pclog("svga->hwcursor.addr = %x\n", svga->hwcursor.addr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -577,33 +584,61 @@ void gd5429_hwcursor_draw(svga_t *svga, int displine)
|
||||||
uint8_t dat[2];
|
uint8_t dat[2];
|
||||||
int xx;
|
int xx;
|
||||||
int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff;
|
int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff;
|
||||||
|
int line_offset = (svga->seqregs[0x12] & 0x04) ? 16 : 4;
|
||||||
|
|
||||||
if (svga->interlace && svga->hwcursor_oddeven)
|
if (svga->interlace && svga->hwcursor_oddeven)
|
||||||
svga->hwcursor_latch.addr += 4;
|
svga->hwcursor_latch.addr += line_offset;
|
||||||
|
|
||||||
for (x = 0; x < 32; x += 8)
|
if (svga->seqregs[0x12] & 0x04)
|
||||||
{
|
{
|
||||||
dat[0] = svga->vram[svga->hwcursor_latch.addr];
|
for (x = 0; x < 64; x += 8)
|
||||||
dat[1] = svga->vram[svga->hwcursor_latch.addr + 0x80];
|
|
||||||
for (xx = 0; xx < 8; xx++)
|
|
||||||
{
|
{
|
||||||
if (offset >= svga->hwcursor_latch.x)
|
dat[0] = svga->vram[svga->hwcursor_latch.addr];
|
||||||
|
dat[1] = svga->vram[svga->hwcursor_latch.addr + 8];
|
||||||
|
for (xx = 0; xx < 8; xx++)
|
||||||
{
|
{
|
||||||
if (dat[1] & 0x80)
|
if (offset >= svga->hwcursor_latch.x)
|
||||||
((uint32_t *)buffer32->line[displine])[offset + 32] = 0;
|
{
|
||||||
if (dat[0] & 0x80)
|
if (dat[1] & 0x80)
|
||||||
((uint32_t *)buffer32->line[displine])[offset + 32] ^= 0xffffff;
|
((uint32_t *)buffer32->line[displine])[offset + 32] = 0;
|
||||||
}
|
if (dat[0] & 0x80)
|
||||||
|
((uint32_t *)buffer32->line[displine])[offset + 32] ^= 0xffffff;
|
||||||
|
}
|
||||||
|
|
||||||
offset++;
|
offset++;
|
||||||
dat[0] <<= 1;
|
dat[0] <<= 1;
|
||||||
dat[1] <<= 1;
|
dat[1] <<= 1;
|
||||||
|
}
|
||||||
|
svga->hwcursor_latch.addr++;
|
||||||
|
}
|
||||||
|
svga->hwcursor_latch.addr += 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (x = 0; x < 32; x += 8)
|
||||||
|
{
|
||||||
|
dat[0] = svga->vram[svga->hwcursor_latch.addr];
|
||||||
|
dat[1] = svga->vram[svga->hwcursor_latch.addr + 0x80];
|
||||||
|
for (xx = 0; xx < 8; xx++)
|
||||||
|
{
|
||||||
|
if (offset >= svga->hwcursor_latch.x)
|
||||||
|
{
|
||||||
|
if (dat[1] & 0x80)
|
||||||
|
((uint32_t *)buffer32->line[displine])[offset + 32] = 0;
|
||||||
|
if (dat[0] & 0x80)
|
||||||
|
((uint32_t *)buffer32->line[displine])[offset + 32] ^= 0xffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset++;
|
||||||
|
dat[0] <<= 1;
|
||||||
|
dat[1] <<= 1;
|
||||||
|
}
|
||||||
|
svga->hwcursor_latch.addr++;
|
||||||
}
|
}
|
||||||
svga->hwcursor_latch.addr++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (svga->interlace && !svga->hwcursor_oddeven)
|
if (svga->interlace && !svga->hwcursor_oddeven)
|
||||||
svga->hwcursor_latch.addr += 4;
|
svga->hwcursor_latch.addr += line_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue