Fixed the hardware cursor on divided-by-two clock modes.
This commit is contained in:
@@ -43,6 +43,7 @@ typedef struct ht216_t
|
|||||||
rom_t bios_rom;
|
rom_t bios_rom;
|
||||||
|
|
||||||
uint32_t vram_mask;
|
uint32_t vram_mask;
|
||||||
|
uint8_t adjust_cursor;
|
||||||
|
|
||||||
int ext_reg_enable;
|
int ext_reg_enable;
|
||||||
int clk_sel;
|
int clk_sel;
|
||||||
@@ -163,8 +164,6 @@ ht216_out(uint16_t addr, uint8_t val, void *p)
|
|||||||
break;
|
break;
|
||||||
case 0x9c: case 0x9d:
|
case 0x9c: case 0x9d:
|
||||||
svga->hwcursor.x = ht216->ht_regs[0x9d] | ((ht216->ht_regs[0x9c] & 7) << 8);
|
svga->hwcursor.x = ht216->ht_regs[0x9d] | ((ht216->ht_regs[0x9c] & 7) << 8);
|
||||||
if (ht216->ht_regs[0xff] & 0x10)
|
|
||||||
svga->hwcursor.x >>= 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x9e: case 0x9f:
|
case 0x9e: case 0x9f:
|
||||||
svga->hwcursor.y = ht216->ht_regs[0x9f] | ((ht216->ht_regs[0x9e] & 3) << 8);
|
svga->hwcursor.y = ht216->ht_regs[0x9f] | ((ht216->ht_regs[0x9e] & 3) << 8);
|
||||||
@@ -504,9 +503,12 @@ ht216_recalctimings(svga_t *svga)
|
|||||||
else
|
else
|
||||||
high_res_256 = (svga->htotal * 8) > (svga->vtotal * 2);
|
high_res_256 = (svga->htotal * 8) > (svga->vtotal * 2);
|
||||||
|
|
||||||
|
ht216->adjust_cursor = 0;
|
||||||
if ((svga->bpp == 8) && (!svga->lowres || high_res_256)) {
|
if ((svga->bpp == 8) && (!svga->lowres || high_res_256)) {
|
||||||
if (high_res_256)
|
if (high_res_256) {
|
||||||
svga->hdisp /= 2;
|
svga->hdisp /= 2;
|
||||||
|
ht216->adjust_cursor = 1;
|
||||||
|
}
|
||||||
svga->render = svga_render_8bpp_highres;
|
svga->render = svga_render_8bpp_highres;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -515,9 +517,14 @@ ht216_recalctimings(svga_t *svga)
|
|||||||
static void
|
static void
|
||||||
ht216_hwcursor_draw(svga_t *svga, int displine)
|
ht216_hwcursor_draw(svga_t *svga, int displine)
|
||||||
{
|
{
|
||||||
int x;
|
ht216_t *ht216 = (ht216_t *)svga->p;
|
||||||
|
int x, shift = (ht216->adjust_cursor ? 2 : 1);
|
||||||
uint32_t dat[2];
|
uint32_t dat[2];
|
||||||
int offset = svga->hwcursor_latch.x + svga->hwcursor_latch.xoff;
|
int offset = svga->hwcursor_latch.x + svga->hwcursor_latch.xoff;
|
||||||
|
int width = (ht216->adjust_cursor ? 16 : 32);
|
||||||
|
|
||||||
|
if (ht216->adjust_cursor)
|
||||||
|
offset >>= 1;
|
||||||
|
|
||||||
if (svga->interlace && svga->hwcursor_oddeven)
|
if (svga->interlace && svga->hwcursor_oddeven)
|
||||||
svga->hwcursor_latch.addr += 4;
|
svga->hwcursor_latch.addr += 4;
|
||||||
@@ -531,14 +538,14 @@ ht216_hwcursor_draw(svga_t *svga, int displine)
|
|||||||
(svga->vram[svga->hwcursor_latch.addr+128+2] << 8) |
|
(svga->vram[svga->hwcursor_latch.addr+128+2] << 8) |
|
||||||
svga->vram[svga->hwcursor_latch.addr+128+3];
|
svga->vram[svga->hwcursor_latch.addr+128+3];
|
||||||
|
|
||||||
for (x = 0; x < 32; x++) {
|
for (x = 0; x < width; x++) {
|
||||||
if (!(dat[0] & 0x80000000))
|
if (!(dat[0] & 0x80000000))
|
||||||
((uint32_t *)buffer32->line[displine])[svga->x_add + offset + x] = 0;
|
((uint32_t *)buffer32->line[displine])[svga->x_add + offset + x] = 0;
|
||||||
if (dat[1] & 0x80000000)
|
if (dat[1] & 0x80000000)
|
||||||
((uint32_t *)buffer32->line[displine])[svga->x_add + offset + x] ^= 0xffffff;
|
((uint32_t *)buffer32->line[displine])[svga->x_add + offset + x] ^= 0xffffff;
|
||||||
|
|
||||||
dat[0] <<= 1;
|
dat[0] <<= shift;
|
||||||
dat[1] <<= 1;
|
dat[1] <<= shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
svga->hwcursor_latch.addr += 4;
|
svga->hwcursor_latch.addr += 4;
|
||||||
|
Reference in New Issue
Block a user