vid_svga.c: Hardware cursors with negative Y values work properly now
* Fixes cursor disappearing completely in Matrox cards in some cases. * Allows emulated video adapters allowing negative Y values for hardware cursor to render those properly
This commit is contained in:
@@ -1529,16 +1529,14 @@ chips_69000_write_ext_reg(chips_69000_t* chips, uint8_t val)
|
||||
chips->ext_regs[chips->ext_index] = val;
|
||||
chips->svga.hwcursor.y = val | (chips->ext_regs[0xA7] & 7) << 8;
|
||||
if (chips->ext_regs[0xA7] & 0x80) {
|
||||
chips->svga.hwcursor.yoff = chips->svga.hwcursor.y;
|
||||
chips->svga.hwcursor.y = 0;
|
||||
chips->svga.hwcursor.y = -chips->svga.hwcursor.y;
|
||||
}
|
||||
break;
|
||||
case 0xA7:
|
||||
chips->ext_regs[chips->ext_index] = val;
|
||||
chips->svga.hwcursor.y = chips->ext_regs[0xA6] | (val & 7) << 8;
|
||||
if (chips->ext_regs[0xA7] & 0x80){
|
||||
chips->svga.hwcursor.yoff = chips->svga.hwcursor.y;
|
||||
chips->svga.hwcursor.y = 0;
|
||||
if (chips->ext_regs[0xA7] & 0x80) {
|
||||
chips->svga.hwcursor.y = -chips->svga.hwcursor.y;
|
||||
}
|
||||
break;
|
||||
case 0xC8:
|
||||
|
||||
@@ -5924,9 +5924,9 @@ mystique_hwcursor_draw(svga_t *svga, int displine)
|
||||
case XCURCTRL_CURMODE_XGA:
|
||||
for (uint8_t x = 0; x < 64; x++) {
|
||||
if (!(dat[1] & (1ULL << 63)))
|
||||
svga->monitor->target_buffer->line[displine][offset + svga->x_add] = (dat[0] & (1ULL << 63)) ? svga_lookup_lut_ram(svga, mystique->cursor.col[1]) : svga_lookup_lut_ram(svga, mystique->cursor.col[0]);
|
||||
svga->monitor->target_buffer->line[displine][(offset + svga->x_add) & 2047] = (dat[0] & (1ULL << 63)) ? svga_lookup_lut_ram(svga, mystique->cursor.col[1]) : svga_lookup_lut_ram(svga, mystique->cursor.col[0]);
|
||||
else if (dat[0] & (1ULL << 63))
|
||||
svga->monitor->target_buffer->line[displine][offset + svga->x_add] ^= 0xffffff;
|
||||
svga->monitor->target_buffer->line[displine][(offset + svga->x_add) & 2047] ^= 0xffffff;
|
||||
|
||||
offset++;
|
||||
dat[0] <<= 1;
|
||||
|
||||
@@ -981,7 +981,7 @@ svga_do_render(svga_t *svga)
|
||||
|
||||
if (svga->dac_hwcursor_on) {
|
||||
if (!svga->override && svga->dac_hwcursor_draw)
|
||||
svga->dac_hwcursor_draw(svga, svga->displine + svga->y_add);
|
||||
svga->dac_hwcursor_draw(svga, (svga->displine + svga->y_add + ((svga->dac_hwcursor_latch.y >= 0) ? 0 : svga->dac_hwcursor_latch.y)) & 2047);
|
||||
svga->dac_hwcursor_on--;
|
||||
if (svga->dac_hwcursor_on && svga->interlace)
|
||||
svga->dac_hwcursor_on--;
|
||||
@@ -989,7 +989,7 @@ svga_do_render(svga_t *svga)
|
||||
|
||||
if (svga->hwcursor_on) {
|
||||
if (!svga->override && svga->hwcursor_draw)
|
||||
svga->hwcursor_draw(svga, svga->displine + svga->y_add);
|
||||
svga->hwcursor_draw(svga, (svga->displine + svga->y_add + ((svga->hwcursor_latch.y >= 0) ? 0 : svga->hwcursor_latch.y)) & 2047);
|
||||
svga->hwcursor_on--;
|
||||
if (svga->hwcursor_on && svga->interlace)
|
||||
svga->hwcursor_on--;
|
||||
@@ -1018,22 +1018,22 @@ svga_poll(void *priv)
|
||||
}
|
||||
|
||||
if (!svga->linepos) {
|
||||
if (svga->displine == svga->hwcursor_latch.y && svga->hwcursor_latch.ena) {
|
||||
if (svga->displine == ((svga->hwcursor_latch.y < 0) ? 0 : svga->hwcursor_latch.y) && svga->hwcursor_latch.ena) {
|
||||
svga->hwcursor_on = svga->hwcursor_latch.cur_ysize - svga->hwcursor_latch.yoff;
|
||||
svga->hwcursor_oddeven = 0;
|
||||
}
|
||||
|
||||
if (svga->displine == (svga->hwcursor_latch.y + 1) && svga->hwcursor_latch.ena && svga->interlace) {
|
||||
if (svga->displine == (((svga->hwcursor_latch.y < 0) ? 0 : svga->hwcursor_latch.y) + 1) && svga->hwcursor_latch.ena && svga->interlace) {
|
||||
svga->hwcursor_on = svga->hwcursor_latch.cur_ysize - (svga->hwcursor_latch.yoff + 1);
|
||||
svga->hwcursor_oddeven = 1;
|
||||
}
|
||||
|
||||
if (svga->displine == svga->dac_hwcursor_latch.y && svga->dac_hwcursor_latch.ena) {
|
||||
if (svga->displine == ((svga->dac_hwcursor_latch.y < 0) ? 0 : svga->dac_hwcursor_latch.y) && svga->dac_hwcursor_latch.ena) {
|
||||
svga->dac_hwcursor_on = svga->dac_hwcursor_latch.cur_ysize - svga->dac_hwcursor_latch.yoff;
|
||||
svga->dac_hwcursor_oddeven = 0;
|
||||
}
|
||||
|
||||
if (svga->displine == (svga->dac_hwcursor_latch.y + 1) && svga->dac_hwcursor_latch.ena && svga->interlace) {
|
||||
if (svga->displine == (((svga->dac_hwcursor_latch.y < 0) ? 0 : svga->dac_hwcursor_latch.y) + 1) && svga->dac_hwcursor_latch.ena && svga->interlace) {
|
||||
svga->dac_hwcursor_on = svga->dac_hwcursor_latch.cur_ysize - (svga->dac_hwcursor_latch.yoff + 1);
|
||||
svga->dac_hwcursor_oddeven = 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user