From 963b7eec042a048327edf740e06e6b553ab0e4b6 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 20 Feb 2024 18:41:51 +0100 Subject: [PATCH] Some temporary video changes regarding the horizontal display. S3 side: Temporary changes to match the release (due to tomorrow) of 86box. Said changes are about the horizontal display of the tvp3026-based S3 chips. IBM/ATI 8514-based: Temporarily commented out the hblank side of it due to htotal bugs. TVP3026 side: When the upper clock selection bits are 0 and when extended VGA modes are set, double the hdisp. --- src/video/vid_s3.c | 27 ++++++++++++--- src/video/vid_svga.c | 43 ++++++++++++----------- src/video/vid_tvp3026_ramdac.c | 63 ++++------------------------------ 3 files changed, 52 insertions(+), 81 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index e387245c9..0ef48fa0e 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -3214,7 +3214,6 @@ s3_recalctimings(svga_t *svga) } svga->hdisp = svga->hdisp_old; - svga->ma_latch |= (s3->ma_ext << 16); if (s3->chip >= S3_86C928) { @@ -3222,7 +3221,7 @@ s3_recalctimings(svga_t *svga) svga->htotal |= 0x100; if (svga->crtc[0x5d] & 0x02) { svga->hdisp_time |= 0x100; - svga->hdisp |= 0x100 * svga->dots_per_clock; + svga->hdisp |= (0x100 * svga->dots_per_clock); } if (svga->crtc[0x5e] & 0x01) svga->vtotal |= 0x400; @@ -3442,8 +3441,13 @@ s3_recalctimings(svga_t *svga) break; case S3_VISION968: switch (s3->card_type) { - case S3_PHOENIX_VISION968: + case S3_MIROVIDEO40SV_ERGO_968: + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; case S3_NUMBER9_9FX_771: + case S3_PHOENIX_VISION968: + case S3_SPEA_MERCURY_P64V: svga->hdisp <<= 1; svga->dots_per_clock <<= 1; if (svga->hdisp == 832) @@ -3619,8 +3623,13 @@ s3_recalctimings(svga_t *svga) break; case S3_VISION968: switch (s3->card_type) { + case S3_MIROVIDEO40SV_ERGO_968: + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; case S3_NUMBER9_9FX_771: case S3_PHOENIX_VISION968: + case S3_SPEA_MERCURY_P64V: svga->hdisp <<= 1; svga->dots_per_clock <<= 1; /* TODO: Is this still needed? */ @@ -3801,8 +3810,13 @@ s3_recalctimings(svga_t *svga) break; case S3_VISION968: switch (s3->card_type) { + case S3_MIROVIDEO40SV_ERGO_968: + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; case S3_NUMBER9_9FX_771: case S3_PHOENIX_VISION968: + case S3_SPEA_MERCURY_P64V: svga->hdisp <<= 1; svga->dots_per_clock <<= 1; /* TODO: Is this still needed? */ @@ -4003,8 +4017,13 @@ s3_recalctimings(svga_t *svga) break; case S3_VISION968: switch (s3->card_type) { + case S3_MIROVIDEO40SV_ERGO_968: + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; case S3_NUMBER9_9FX_771: case S3_PHOENIX_VISION968: + case S3_SPEA_MERCURY_P64V: svga->hdisp <<= 1; svga->dots_per_clock <<= 1; /* TODO: Is this still needed? */ @@ -4165,7 +4184,7 @@ s3_trio64v_recalctimings(svga_t *svga) if ((svga->crtc[0x33] & 0x20) || ((svga->crtc[0x67] & 0xc) == 0xc)) { /* The S3 version of the Cirrus' special blanking mode, with identical behavior. */ svga->hblankstart = (((svga->crtc[0x5d] & 0x02) >> 1) << 8) + svga->crtc[1]/* + - ((svga->crtc[3] >> 5) & 3) + 1*/; + ((svga->crtc[3] >> 5) & 3)*/; svga->hblank_end_val = svga->htotal - 1 /* + ((svga->crtc[3] >> 5) & 3)*/; svga->monitor->mon_overscan_y = 0; diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index d0f02929d..d9c2ba892 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -794,8 +794,8 @@ svga_recalctimings(svga_t *svga) uint32_t eff_mask = (svga->hblank_end_val & ~0x0000003f) ? svga->hblank_end_mask : 0x0000003f; svga->hblank_sub = 0; - svga_log("Blank: %04i-%04i, Total: %04i, Mask: %02X\n", svga->hblankstart, svga->hblank_end_val, - svga->htotal, eff_mask); + svga_log("HDISP=%d, CRTC1+1=%d, Blank: %04i-%04i, Total: %04i, Mask: %02X, ADJ_DOT=%04i.\n", svga->hdisp, svga->crtc[1] + 1, svga->hblankstart, svga->hblank_end_val, + svga->htotal, eff_mask, adj_dot); while (adj_dot < (svga->htotal << 1)) { if (dot == svga->htotal) @@ -804,6 +804,7 @@ svga_recalctimings(svga_t *svga) if (adj_dot >= svga->htotal) svga->hblank_sub++; + svga_log("Loop: adjdot=%d, htotal=%d, dotmask=%02x, hblankendvalmask=%02x, blankendval=%02x.\n", adj_dot, svga->htotal, dot & eff_mask, svga->hblank_end_val & eff_mask, svga->hblank_end_val); if ((dot & eff_mask) == (svga->hblank_end_val & eff_mask)) break; @@ -812,32 +813,34 @@ svga_recalctimings(svga_t *svga) } svga->hdisp -= (svga->hblank_sub * svga->dots_per_clock); + } - if (ibm8514_active && (svga->dev8514 != NULL)) { - if (dev->on[0] || dev->on[1]) { - uint32_t dot8514 = dev->h_blankstart; - uint32_t adj_dot8514 = dev->h_blankstart; - uint32_t eff_mask8514 = 0x0000003f; - dev->hblank_sub = 0; +#ifdef TBD + if (ibm8514_active && (svga->dev8514 != NULL)) { + if (dev->on[0] || dev->on[1]) { + uint32_t dot8514 = dev->h_blankstart; + uint32_t adj_dot8514 = dev->h_blankstart; + uint32_t eff_mask8514 = 0x0000003f; + dev->hblank_sub = 0; - while (adj_dot8514 < (dev->h_total << 1)) { - if (dot8514 == dev->h_total) - dot = 0; + while (adj_dot8514 < (dev->h_total << 1)) { + if (dot8514 == dev->h_total) + dot8514 = 0; - if (adj_dot8514 >= dev->h_total) - dev->hblank_sub++; + if (adj_dot8514 >= dev->h_total) + dev->hblank_sub++; - if ((dot8514 & eff_mask8514) == (dev->h_blank_end_val & eff_mask8514)) - break; + if ((dot8514 & eff_mask8514) == (dev->h_blank_end_val & eff_mask8514)) + break; - dot8514++; - adj_dot8514++; - } - - dev->h_disp -= dev->hblank_sub; + dot8514++; + adj_dot8514++; } + + dev->h_disp -= dev->hblank_sub; } } +#endif if (svga->hdisp >= 2048) svga->monitor->mon_overscan_x = 0; diff --git a/src/video/vid_tvp3026_ramdac.c b/src/video/vid_tvp3026_ramdac.c index 625adfe41..cd3ff7e8b 100644 --- a/src/video/vid_tvp3026_ramdac.c +++ b/src/video/vid_tvp3026_ramdac.c @@ -65,7 +65,7 @@ typedef struct tvp3026_ramdac_t { static void tvp3026_set_bpp(tvp3026_ramdac_t *ramdac, svga_t *svga) { - if ((ramdac->true_color & 0x80) == 0x80) { + if (ramdac->true_color & 0x80) { if (ramdac->mcr & 0x08) svga->bpp = 8; else @@ -514,67 +514,16 @@ tvp3026_recalctimings(void *priv, svga_t *svga) { const tvp3026_ramdac_t *ramdac = (tvp3026_ramdac_t *) priv; - svga->interlace = (ramdac->ccr & 0x40); + svga->interlace = !!(ramdac->ccr & 0x40); /* TODO: Figure out gamma correction for 15/16 bpp color. */ svga->lut_map = !!(svga->bpp >= 15 && (ramdac->true_color & 0xf0) != 0x00); - switch (ramdac->mcr) { - case 0x41: - case 0x4a: - case 0x61: + pclog("MCR=0x%02x, truecolor=0x%02x, crtc1=0x%02x, MCLK=0x%02x, ClockSel=%x.\n", ramdac->mcr, ramdac->true_color, svga->crtc[1] + 1, ramdac->mclk & 0x7f, ramdac->clock_sel); + if (!(ramdac->clock_sel & 0x70)) { + if (ramdac->mcr != 0x98) { svga->hdisp <<= 1; svga->dots_per_clock <<= 1; - break; - case 0x42: - case 0x4b: - case 0x62: - svga->hdisp <<= 2; - svga->dots_per_clock <<= 2; - break; - case 0x43: - case 0x4c: - case 0x63: - svga->hdisp <<= 3; - svga->dots_per_clock <<= 3; - break; - case 0x44: - case 0x64: - svga->hdisp <<= 4; - svga->dots_per_clock <<= 4; - break; - case 0x5b: - switch (ramdac->true_color) { - case 0x16: - case 0x17: - svga->hdisp = (svga->hdisp << 2) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 2) / 3; - break; - case 0x1e: - case 0x1f: - svga->hdisp = (svga->hdisp * 5) >> 2; - svga->dots_per_clock = (svga->dots_per_clock * 5) >> 2; - break; - } - break; - case 0x5c: - switch (ramdac->true_color) { - case 0x06: - case 0x07: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 0x16: - case 0x17: - svga->hdisp = (svga->hdisp << 3) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 3) / 3; - break; - case 0x1e: - case 0x1f: - svga->hdisp = (svga->hdisp * 5) >> 1; - svga->dots_per_clock = (svga->dots_per_clock * 5) >> 1; - break; - } - break; + } } }