diff --git a/src/video/vid_bt485_ramdac.c b/src/video/vid_bt485_ramdac.c index 32eaa9c6e..fefba5a42 100644 --- a/src/video/vid_bt485_ramdac.c +++ b/src/video/vid_bt485_ramdac.c @@ -9,7 +9,7 @@ * Brooktree BT485 true colour RAMDAC emulation. * * - * Version: @(#)vid_bt485_ramdac.c 1.0.5 2018/01/10 + * Version: @(#)vid_bt485_ramdac.c 1.0.6 2018/10/02 * * Authors: Miran Grca, * TheCollector1995, @@ -28,6 +28,32 @@ #include "vid_bt485_ramdac.h" +static void +bt485_set_bpp(bt485_ramdac_t *ramdac, svga_t *svga) +{ + if (!(ramdac->cr2 & 0x20)) + svga->bpp = 8; + else switch ((ramdac->cr1 >> 5) & 0x03) { + case 0: + svga->bpp = 32; + break; + case 1: + if (ramdac->cr1 & 0x08) + svga->bpp = 16; + else + svga->bpp = 15; + break; + case 2: + svga->bpp = 8; + break; + case 3: + svga->bpp = 4; + break; + } + svga_recalctimings(svga); +} + + void bt485_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, bt485_ramdac_t *ramdac, svga_t *svga) { @@ -85,38 +111,12 @@ bt485_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, bt485_ramdac_t *r break; case 0x08: /* Command Register 1 (RS value = 1000) */ ramdac->cr1 = val; - switch ((val >> 5) & 0x03) { - case 0: - if (val & 0x10) - svga->bpp = 32; - else - svga->bpp = 8; - break; - - case 1: - if (val & 0x10) { - if (val & 0x08) - svga->bpp = 16; - else - svga->bpp = 15; - } else - svga->bpp = 8; - break; - - case 2: - svga->bpp = 8; - break; - - case 3: - svga->bpp = 4; - break; - } - svga_recalctimings(svga); + bt485_set_bpp(ramdac, svga); break; case 0x09: /* Command Register 2 (RS value = 1001) */ ramdac->cr2 = val; svga->hwcursor.ena = !!(val & 0x03); - svga_recalctimings(svga); + bt485_set_bpp(ramdac, svga); break; case 0x0a: switch (ramdac->set_reg0a) { diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 8fbd5d96f..7bbeb69a4 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -8,7 +8,7 @@ * * S3 emulation. * - * Version: @(#)vid_s3.c 1.0.19 2018/10/01 + * Version: @(#)vid_s3.c 1.0.20 2018/10/02 * * Authors: Sarah Walker, * Miran Grca, @@ -1042,11 +1042,17 @@ void s3_out(uint16_t addr, uint8_t val, void *p) break; case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9: - rs2 = (svga->crtc[0x55] & 0x01) || !!(svga->crtc[0x43] & 2); + if ((svga->crtc[0x55] & 0x03) == 0x00) + rs2 = !!(svga->crtc[0x43] & 2); + else + rs2 = (svga->crtc[0x55] & 0x01); if (s3->chip == S3_TRIO32 || s3->chip == S3_TRIO64) svga_out(addr, val, svga); else if (s3->chip == S3_VISION964) { - rs3 = !!(svga->crtc[0x55] & 0x02); + if (!(svga->crtc[0x45] & 0x02)) + rs3 = !!(svga->crtc[0x55] & 0x02); + else + rs3 = 0; bt485_ramdac_out(addr, rs2, rs3, val, &s3->bt485_ramdac, svga); } else sdac_ramdac_out(addr, rs2, val, &s3->ramdac, svga);