From ca53dd028075fcdbb46936cd8f04ff4e51f2e9e4 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 19 Jun 2017 22:32:16 +0200 Subject: [PATCH] S3 Trio/Vision changes (again x2): Trio32/64 with on-chip ramdac instead of SDAC. FIFO Empty/Full status from 9ae8/9ae9 no longer slowing down OS/2 when native drivers are installed. --- src/VIDEO/vid_s3.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/VIDEO/vid_s3.c b/src/VIDEO/vid_s3.c index 6cc18d7e9..3401ecd03 100644 --- a/src/VIDEO/vid_s3.c +++ b/src/VIDEO/vid_s3.c @@ -86,6 +86,7 @@ typedef struct s3_t int card; uint32_t vram_mask; + uint8_t status_9ae8; float (*getclock)(int clock, void *p); void *getclock_p; @@ -792,7 +793,12 @@ void s3_out(uint16_t addr, uint8_t val, void *p) break; case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9: - sdac_ramdac_out(addr, val, &s3->ramdac, svga); + if (s3->chip < S3_TRIO32) + { + sdac_ramdac_out(addr, val, &s3->ramdac, svga); + return; + } + svga_out(addr, val, svga); return; case 0x3D4: @@ -930,7 +936,10 @@ uint8_t s3_in(uint16_t addr, void *p) break; case 0x3c6: case 0x3c7: case 0x3c8: case 0x3c9: - return sdac_ramdac_in(addr, &s3->ramdac, svga); + if (s3->chip < S3_TRIO32) + return sdac_ramdac_in(addr, &s3->ramdac, svga); + + return svga_in(addr, svga); case 0x3d4: return svga->crtcreg; @@ -1214,7 +1223,7 @@ uint8_t s3_accel_in(uint16_t port, void *p) if (!FIFO_EMPTY) temp |= 0x02; /*Hardware busy*/ else - temp |= 0x04; /*FIFO empty*/ + temp |= s3->status_9ae8; /*FIFO empty*/ if (FIFO_FULL) temp |= 0xf8; /*FIFO full*/ return temp; @@ -1604,6 +1613,14 @@ void s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat frgd_mix = (s3->accel.frgd_mix >> 5) & 3; bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; + s3->status_9ae8 = 4; /*To avoid the spam from OS/2's drivers*/ + + if ((s3->accel.cmd & 0x100) && !cpu_input) + { + s3->status_9ae8 = 2; /*To avoid the spam from OS/2's drivers*/ + return; /*Wait for data from CPU*/ + } + while (count-- && s3->accel.sy >= 0) { if (s3->accel.cx >= clip_l && s3->accel.cx <= clip_r && @@ -1688,7 +1705,8 @@ void s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; if (!cpu_input && frgd_mix == 3 && !vram_mask && !compare_mode && - (s3->accel.cmd & 0xa0) == 0xa0 && (s3->accel.frgd_mix & 0xf) == 7) + (s3->accel.cmd & 0xa0) == 0xa0 && (s3->accel.frgd_mix & 0xf) == 7 && + (s3->accel.bkgd_mix & 0xf) == 7) { while (1) {