From 5d9b14ac4ab5fffab5ba16636f764a2070a334fa Mon Sep 17 00:00:00 2001 From: SarahW Date: Fri, 26 Apr 2019 17:28:01 +0100 Subject: [PATCH] Fix pixel clocks on ATI-28800, ET4000 and Trident graphics cards. --- src/vid_ati28800.c | 28 ++++++++++++++-------------- src/vid_et4000.c | 6 +++--- src/vid_et4000w32.c | 2 +- src/vid_tgui9440.c | 30 +++++++++++++++--------------- src/vid_tvga.c | 12 ++++++------ 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/vid_ati28800.c b/src/vid_ati28800.c index 50fe3c7..005d1f0 100644 --- a/src/vid_ati28800.c +++ b/src/vid_ati28800.c @@ -272,20 +272,20 @@ void ati28800_recalctimings(svga_t *svga) switch (((ati28800->regs[0xbe] & 0x10) >> 1) | ((ati28800->regs[0xb9] & 2) << 1) | ((svga->miscout & 0x0C) >> 2)) { - case 0x00: svga->clock = cpuclock / 42954000.0; break; - case 0x01: svga->clock = cpuclock / 48771000.0; break; - case 0x03: svga->clock = cpuclock / 36000000.0; break; - case 0x04: svga->clock = cpuclock / 50350000.0; break; - case 0x05: svga->clock = cpuclock / 56640000.0; break; - case 0x07: svga->clock = cpuclock / 44900000.0; break; - case 0x08: svga->clock = cpuclock / 30240000.0; break; - case 0x09: svga->clock = cpuclock / 32000000.0; break; - case 0x0A: svga->clock = cpuclock / 37500000.0; break; - case 0x0B: svga->clock = cpuclock / 39000000.0; break; - case 0x0C: svga->clock = cpuclock / 40000000.0; break; - case 0x0D: svga->clock = cpuclock / 56644000.0; break; - case 0x0E: svga->clock = cpuclock / 75000000.0; break; - case 0x0F: svga->clock = cpuclock / 65000000.0; break; + case 0x00: svga->clock = (cpuclock * (double)(1ull << 32)) / 42954000.0; break; + case 0x01: svga->clock = (cpuclock * (double)(1ull << 32)) / 48771000.0; break; + case 0x03: svga->clock = (cpuclock * (double)(1ull << 32)) / 36000000.0; break; + case 0x04: svga->clock = (cpuclock * (double)(1ull << 32)) / 50350000.0; break; + case 0x05: svga->clock = (cpuclock * (double)(1ull << 32)) / 56640000.0; break; + case 0x07: svga->clock = (cpuclock * (double)(1ull << 32)) / 44900000.0; break; + case 0x08: svga->clock = (cpuclock * (double)(1ull << 32)) / 30240000.0; break; + case 0x09: svga->clock = (cpuclock * (double)(1ull << 32)) / 32000000.0; break; + case 0x0A: svga->clock = (cpuclock * (double)(1ull << 32)) / 37500000.0; break; + case 0x0B: svga->clock = (cpuclock * (double)(1ull << 32)) / 39000000.0; break; + case 0x0C: svga->clock = (cpuclock * (double)(1ull << 32)) / 40000000.0; break; + case 0x0D: svga->clock = (cpuclock * (double)(1ull << 32)) / 56644000.0; break; + case 0x0E: svga->clock = (cpuclock * (double)(1ull << 32)) / 75000000.0; break; + case 0x0F: svga->clock = (cpuclock * (double)(1ull << 32)) / 65000000.0; break; default: break; } if (ati28800->regs[0xb8] & 0x40) diff --git a/src/vid_et4000.c b/src/vid_et4000.c index 174fbdd..c56db96 100644 --- a/src/vid_et4000.c +++ b/src/vid_et4000.c @@ -240,9 +240,9 @@ void et4000_recalctimings(svga_t *svga) switch (((svga->miscout >> 2) & 3) | ((svga->crtc[0x34] << 1) & 4)) { case 0: case 1: break; - case 3: svga->clock = cpuclock / 40000000.0; break; - case 5: svga->clock = cpuclock / 65000000.0; break; - default: svga->clock = cpuclock / 36000000.0; break; + case 3: svga->clock = (cpuclock * (double)(1ull << 32)) / 40000000.0; break; + case 5: svga->clock = (cpuclock * (double)(1ull << 32)) / 65000000.0; break; + default: svga->clock = (cpuclock * (double)(1ull << 32)) / 36000000.0; break; } switch (svga->bpp) diff --git a/src/vid_et4000w32.c b/src/vid_et4000w32.c index 1775977..e8a8e8f 100644 --- a/src/vid_et4000w32.c +++ b/src/vid_et4000w32.c @@ -293,7 +293,7 @@ void et4000w32p_recalctimings(svga_t *svga) switch ((svga->miscout >> 2) & 3) { case 0: case 1: break; - case 2: case 3: svga->clock = cpuclock / icd2061_getfreq(&et4000->icd2061, 2); break; + case 2: case 3: svga->clock = (cpuclock * (double)(1ull << 32)) / icd2061_getfreq(&et4000->icd2061, 2); break; } switch (svga->bpp) diff --git a/src/vid_tgui9440.c b/src/vid_tgui9440.c index 22b14de..a2e13bd 100644 --- a/src/vid_tgui9440.c +++ b/src/vid_tgui9440.c @@ -482,7 +482,7 @@ void tgui_recalctimings(svga_t *svga) if (tgui->type >= TGUI_9440) { if (svga->miscout & 8) - svga->clock = cpuclock / (((tgui->clock_n + 8) * 14318180.0) / ((tgui->clock_m + 2) * (1 << tgui->clock_k))); + svga->clock = (cpuclock * (double)(1ull << 32)) / (((tgui->clock_n + 8) * 14318180.0) / ((tgui->clock_m + 2) * (1 << tgui->clock_k))); if (svga->gdcreg[0xf] & 0x08) svga->clock *= 2; @@ -493,20 +493,20 @@ void tgui_recalctimings(svga_t *svga) { switch (((svga->miscout >> 2) & 3) | ((tgui->newctrl2 << 2) & 4) | ((tgui->newctrl2 >> 3) & 8)) { - case 0x02: svga->clock = cpuclock/ 44900000.0; break; - case 0x03: svga->clock = cpuclock/ 36000000.0; break; - case 0x04: svga->clock = cpuclock/ 57272000.0; break; - case 0x05: svga->clock = cpuclock/ 65000000.0; break; - case 0x06: svga->clock = cpuclock/ 50350000.0; break; - case 0x07: svga->clock = cpuclock/ 40000000.0; break; - case 0x08: svga->clock = cpuclock/ 88000000.0; break; - case 0x09: svga->clock = cpuclock/ 98000000.0; break; - case 0x0a: svga->clock = cpuclock/118800000.0; break; - case 0x0b: svga->clock = cpuclock/108000000.0; break; - case 0x0c: svga->clock = cpuclock/ 72000000.0; break; - case 0x0d: svga->clock = cpuclock/ 77000000.0; break; - case 0x0e: svga->clock = cpuclock/ 80000000.0; break; - case 0x0f: svga->clock = cpuclock/ 75000000.0; break; + case 0x02: svga->clock = (cpuclock * (double)(1ull << 32)) / 44900000.0; break; + case 0x03: svga->clock = (cpuclock * (double)(1ull << 32)) / 36000000.0; break; + case 0x04: svga->clock = (cpuclock * (double)(1ull << 32)) / 57272000.0; break; + case 0x05: svga->clock = (cpuclock * (double)(1ull << 32)) / 65000000.0; break; + case 0x06: svga->clock = (cpuclock * (double)(1ull << 32)) / 50350000.0; break; + case 0x07: svga->clock = (cpuclock * (double)(1ull << 32)) / 40000000.0; break; + case 0x08: svga->clock = (cpuclock * (double)(1ull << 32)) / 88000000.0; break; + case 0x09: svga->clock = (cpuclock * (double)(1ull << 32)) / 98000000.0; break; + case 0x0a: svga->clock = (cpuclock * (double)(1ull << 32)) /118800000.0; break; + case 0x0b: svga->clock = (cpuclock * (double)(1ull << 32)) /108000000.0; break; + case 0x0c: svga->clock = (cpuclock * (double)(1ull << 32)) / 72000000.0; break; + case 0x0d: svga->clock = (cpuclock * (double)(1ull << 32)) / 77000000.0; break; + case 0x0e: svga->clock = (cpuclock * (double)(1ull << 32)) / 80000000.0; break; + case 0x0f: svga->clock = (cpuclock * (double)(1ull << 32)) / 75000000.0; break; } if (svga->gdcreg[0xf] & 0x08) { diff --git a/src/vid_tvga.c b/src/vid_tvga.c index 9d24c8b..623534b 100644 --- a/src/vid_tvga.c +++ b/src/vid_tvga.c @@ -248,12 +248,12 @@ void tvga_recalctimings(svga_t *svga) switch (((svga->miscout >> 2) & 3) | ((tvga->newctrl2 << 2) & 4)) { - case 2: svga->clock = cpuclock/44900000.0; break; - case 3: svga->clock = cpuclock/36000000.0; break; - case 4: svga->clock = cpuclock/57272000.0; break; - case 5: svga->clock = cpuclock/65000000.0; break; - case 6: svga->clock = cpuclock/50350000.0; break; - case 7: svga->clock = cpuclock/40000000.0; break; + case 2: svga->clock = (cpuclock * (double)(1ull << 32)) / 44900000.0; break; + case 3: svga->clock = (cpuclock * (double)(1ull << 32)) / 36000000.0; break; + case 4: svga->clock = (cpuclock * (double)(1ull << 32)) / 57272000.0; break; + case 5: svga->clock = (cpuclock * (double)(1ull << 32)) / 65000000.0; break; + case 6: svga->clock = (cpuclock * (double)(1ull << 32)) / 50350000.0; break; + case 7: svga->clock = (cpuclock * (double)(1ull << 32)) / 40000000.0; break; } if (tvga->oldctrl2 & 0x10)