MGA flicker fixes.
It's time to end the flickers once and for all by making the start address correctly emulated in vblank_start when in power graphics mode.
This commit is contained in:
@@ -722,27 +722,6 @@ mystique_out(uint16_t addr, uint8_t val, void *priv)
|
|||||||
if (mystique->crtcext_idx < 6)
|
if (mystique->crtcext_idx < 6)
|
||||||
mystique->crtcext_regs[mystique->crtcext_idx] = val;
|
mystique->crtcext_regs[mystique->crtcext_idx] = val;
|
||||||
|
|
||||||
if (mystique->crtcext_idx == 0 && (mystique->crtcext_regs[3] & CRTCX_R3_MGAMODE))
|
|
||||||
{
|
|
||||||
svga->rowoffset = svga->crtc[0x13] | ((mystique->crtcext_regs[0] & CRTCX_R0_OFFSET_MASK) << 4);
|
|
||||||
svga->rowoffset <<= 1;
|
|
||||||
svga->ma_latch = ((mystique->crtcext_regs[0] & CRTCX_R0_STARTADD_MASK) << 16) | (svga->crtc[0xc] << 8) | svga->crtc[0xd];
|
|
||||||
if (mystique->pci_regs[0x41] & (OPTION_INTERLEAVE >> 8)) {
|
|
||||||
svga->rowoffset <<= 1;
|
|
||||||
svga->ma_latch <<= 1;
|
|
||||||
}
|
|
||||||
if (mystique->type >= MGA_1064SG) {
|
|
||||||
svga->ma_latch <<= 1;
|
|
||||||
if (svga->ma_latch != mystique->ma_latch_old) {
|
|
||||||
if (svga->interlace && svga->oddeven)
|
|
||||||
svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2) + (svga->rowoffset << 1);
|
|
||||||
else
|
|
||||||
svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2);
|
|
||||||
mystique->ma_latch_old = svga->ma_latch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mystique->crtcext_idx == 4) {
|
if (mystique->crtcext_idx == 4) {
|
||||||
if (svga->gdcreg[6] & 0xc) {
|
if (svga->gdcreg[6] & 0xc) {
|
||||||
/*64k banks*/
|
/*64k banks*/
|
||||||
@@ -829,6 +808,33 @@ mystique_line_compare(svga_t *svga)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mystique_vblank_start(svga_t *svga)
|
||||||
|
{
|
||||||
|
mystique_t *mystique = (mystique_t *) svga->priv;
|
||||||
|
|
||||||
|
if (mystique->crtcext_regs[3] & CRTCX_R3_MGAMODE) {
|
||||||
|
svga->ma_latch = ((mystique->crtcext_regs[0] & CRTCX_R0_STARTADD_MASK) << 16) | (svga->crtc[0xc] << 8) | svga->crtc[0xd];
|
||||||
|
if (mystique->pci_regs[0x41] & (OPTION_INTERLEAVE >> 8))
|
||||||
|
svga->ma_latch <<= 1;
|
||||||
|
|
||||||
|
if (mystique->type >= MGA_1064SG) {
|
||||||
|
/*Mystique, unlike most SVGA cards, allows display start to take
|
||||||
|
effect mid-screen*/
|
||||||
|
svga->ma_latch <<= 1;
|
||||||
|
/* Only change maback so the new display start will take effect on the next
|
||||||
|
horizontal retrace. */
|
||||||
|
if (svga->ma_latch != mystique->ma_latch_old) {
|
||||||
|
if (svga->interlace && svga->oddeven)
|
||||||
|
svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2) + (svga->rowoffset << 1);
|
||||||
|
else
|
||||||
|
svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2);
|
||||||
|
mystique->ma_latch_old = svga->ma_latch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mystique_vsync_callback(svga_t *svga)
|
mystique_vsync_callback(svga_t *svga)
|
||||||
{
|
{
|
||||||
@@ -896,39 +902,14 @@ mystique_recalctimings(svga_t *svga)
|
|||||||
if (mystique->crtcext_regs[3] & CRTCX_R3_MGAMODE) {
|
if (mystique->crtcext_regs[3] & CRTCX_R3_MGAMODE) {
|
||||||
svga->lowres = 0;
|
svga->lowres = 0;
|
||||||
svga->char_width = 8;
|
svga->char_width = 8;
|
||||||
svga->hdisp = (svga->crtc[1] + 1) * 8;
|
svga->hdisp = (svga->crtc[1] + 1) << 3;
|
||||||
svga->hdisp_time = svga->hdisp;
|
svga->hdisp_time = svga->hdisp;
|
||||||
svga->rowoffset = svga->crtc[0x13] | ((mystique->crtcext_regs[0] & CRTCX_R0_OFFSET_MASK) << 4);
|
svga->rowoffset = svga->crtc[0x13] | ((mystique->crtcext_regs[0] & CRTCX_R0_OFFSET_MASK) << 4);
|
||||||
svga->ma_latch = ((mystique->crtcext_regs[0] & CRTCX_R0_STARTADD_MASK) << 16) | (svga->crtc[0xc] << 8) | svga->crtc[0xd];
|
|
||||||
if (mystique->pci_regs[0x41] & (OPTION_INTERLEAVE >> 8)) {
|
if (mystique->pci_regs[0x41] & (OPTION_INTERLEAVE >> 8))
|
||||||
svga->rowoffset <<= 1;
|
svga->rowoffset <<= 1;
|
||||||
svga->ma_latch <<= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mystique->type >= MGA_1064SG) {
|
if (mystique->type >= MGA_1064SG) {
|
||||||
/*Mystique, unlike most SVGA cards, allows display start to take
|
|
||||||
effect mid-screen*/
|
|
||||||
svga->ma_latch <<= 1;
|
|
||||||
#ifdef CHANGE_MA
|
|
||||||
if (svga->ma_latch != mystique->ma_latch_old) {
|
|
||||||
if (svga->interlace && svga->oddeven)
|
|
||||||
svga->ma = svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2) + (svga->rowoffset << 1);
|
|
||||||
else
|
|
||||||
svga->ma = svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2);
|
|
||||||
mystique->ma_latch_old = svga->ma_latch;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* Only change maback so the new display start will take effect on the next
|
|
||||||
horizontal retrace. */
|
|
||||||
if (svga->ma_latch != mystique->ma_latch_old) {
|
|
||||||
if (svga->interlace && svga->oddeven)
|
|
||||||
svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2) + (svga->rowoffset << 1);
|
|
||||||
else
|
|
||||||
svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2);
|
|
||||||
mystique->ma_latch_old = svga->ma_latch;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
svga->rowoffset <<= 1;
|
svga->rowoffset <<= 1;
|
||||||
switch (mystique->xmulctrl & XMULCTRL_DEPTH_MASK) {
|
switch (mystique->xmulctrl & XMULCTRL_DEPTH_MASK) {
|
||||||
case XMULCTRL_DEPTH_8:
|
case XMULCTRL_DEPTH_8:
|
||||||
@@ -979,9 +960,11 @@ mystique_recalctimings(svga_t *svga)
|
|||||||
}
|
}
|
||||||
svga->packed_chain4 = 1;
|
svga->packed_chain4 = 1;
|
||||||
svga->line_compare = mystique_line_compare;
|
svga->line_compare = mystique_line_compare;
|
||||||
|
svga->vblank_start = mystique_vblank_start;
|
||||||
} else {
|
} else {
|
||||||
svga->packed_chain4 = 0;
|
svga->packed_chain4 = 0;
|
||||||
svga->line_compare = NULL;
|
svga->line_compare = NULL;
|
||||||
|
svga->vblank_start = NULL;
|
||||||
if (mystique->type >= MGA_1064SG)
|
if (mystique->type >= MGA_1064SG)
|
||||||
svga->bpp = 8;
|
svga->bpp = 8;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user