From 9b9f1a261056dbb288210583768bc6b99d9af1fc Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 11 Aug 2025 22:55:47 +0200 Subject: [PATCH] 8514/A (and XGA) compatible refresh rate fixes. Correct the refresh rates of the 8514/A compatibles and XGA cards to match their real world rates. --- src/video/vid_ati_mach8.c | 46 ++++++++++++++++++++------------------- src/video/vid_svga.c | 11 +++++----- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 32b466740..45a69ffab 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2928,10 +2928,12 @@ mach_recalctimings(svga_t *svga) dev->h_disp_time = dev->hdisp >> 3; - svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen); + svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen) / 2; if (mach->accel.clock_sel & 0x40) svga->clock_8514 *= 2; + mach_log("8514/A clock sel=%x, divide reg ibm=%02x, divide reg vga=%02x.\n", clock_sel, mach->accel.clock_sel & 0x40, mach->regs[0xb8] & 0xc0); + if (dev->interlace) dev->dispend >>= 1; @@ -3060,29 +3062,29 @@ mach_recalctimings(svga_t *svga) if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { mach_log("GDCREG5=%02x, ATTR10=%02x, ATI B0 bit 5=%02x, ON=%d.\n", svga->gdcreg[5] & 0x60, svga->attrregs[0x10] & 0x40, mach->regs[0xb0] & 0x20, dev->on); + svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel, svga->clock_gen); + mach_log("VGA clock sel=%x, divide reg=%02x.\n", clock_sel, mach->regs[0xb8] & 0xc0); + if (ATI_MACH32) { + if (mach->regs[0xb8] & 0x40) + svga->clock *= 2; + } else { + switch (mach->regs[0xb8] & 0xc0) { + case 0x40: + svga->clock *= 2; + break; + case 0x80: + svga->clock *= 3; + break; + case 0xc0: + svga->clock *= 4; + break; + + default: + break; + } + } if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) { if ((svga->gdcreg[5] & 0x40) || (svga->attrregs[0x10] & 0x40) || (mach->regs[0xb0] & 0x20)) { - svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel, svga->clock_gen); - mach_log("VGA clock=%02x.\n", mach->regs[0xa7] & 0x80); - if (ATI_MACH32) { - if (mach->regs[0xb8] & 0x40) - svga->clock *= 2; - } else { - switch (mach->regs[0xb8] & 0xc0) { - case 0x40: - svga->clock *= 2; - break; - case 0x80: - svga->clock *= 3; - break; - case 0xc0: - svga->clock *= 4; - break; - - default: - break; - } - } svga->map8 = svga->pallook; mach_log("Lowres=%x, seqreg[1]bit3=%x.\n", svga->lowres, svga->seqregs[1] & 8); if (svga->lowres) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 113a8984f..caed7113f 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -799,9 +799,10 @@ svga_recalctimings(svga_t *svga) if ((svga->bpp <= 8) || ((svga->gdcreg[5] & 0x60) <= 0x20)) { if ((svga->gdcreg[5] & 0x60) == 0x00) { - if (svga->seqregs[1] & 8) /*Low res (320)*/ + if (svga->seqregs[1] & 8) { /*Low res (320)*/ svga->render = svga_render_4bpp_lowres; - else + svga_log("4 bpp low res.\n"); + } else svga->render = svga_render_4bpp_highres; } else if ((svga->gdcreg[5] & 0x60) == 0x20) { if (svga->seqregs[1] & 8) { /*Low res (320)*/ @@ -1045,11 +1046,11 @@ svga_recalctimings(svga_t *svga) crtcconst = svga->clock * svga->char_width; if (ibm8514_active && (svga->dev8514 != NULL)) { if (dev->on) - crtcconst8514 = svga->clock_8514; + crtcconst8514 = svga->clock_8514 * 8; } if (xga_active && (svga->xga != NULL)) { if (xga->on) - crtcconst_xga = svga->clock_xga; + crtcconst_xga = svga->clock_xga * svga->char_width; } #ifdef ENABLE_SVGA_LOG @@ -1093,7 +1094,6 @@ svga_recalctimings(svga_t *svga) if (dev->on) { disptime8514 = dev->h_total; _dispontime8514 = dev->h_disp_time; - svga_log("HTOTAL=%d, HDISP=%d.\n", dev->h_total, dev->h_disp); } } @@ -1135,6 +1135,7 @@ svga_recalctimings(svga_t *svga) case 1: /*Plus 8514/A*/ if (dev->on) { _dispofftime8514 = disptime8514 - _dispontime8514; + svga_log("DISPTIME8514=%lf, off=%lf, DISPONTIME8514=%lf, CRTCCONST8514=%lf.\n", disptime8514, _dispofftime8514, _dispontime8514, crtcconst8514); _dispontime8514 *= crtcconst8514; _dispofftime8514 *= crtcconst8514;