From 6b1d0b9e88c9ca5bfd9e2274352441a2b72b2490 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Fri, 5 Jan 2024 21:11:49 +0100 Subject: [PATCH] S3 mode fixes 2 and one small accel cleanup: 1. Fixed 16bpp modes (including 15-bit) of the Trio32/64 that were doubling their horizontal resolution. 2. Made Bresenham Line easier to work with. --- src/video/vid_s3.c | 198 +++++++++++++++++---------------------------- 1 file changed, 74 insertions(+), 124 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index ff28ffbfa..4a7a76ed2 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -3469,6 +3469,7 @@ s3_recalctimings(svga_t *svga) if (svga->hdisp == 832) svga->hdisp -= 32; break; + case S3_ELSAWIN2KPROX: switch (s3->width) { case 1280: @@ -3483,6 +3484,12 @@ s3_recalctimings(svga_t *svga) break; } break; + + case S3_TRIO64: + case S3_TRIO32: + svga->hdisp >>= 1; + break; + default: break; } @@ -3636,6 +3643,7 @@ s3_recalctimings(svga_t *svga) if (svga->hdisp == 832) svga->hdisp -= 32; break; + case S3_ELSAWIN2KPROX: switch (s3->width) { case 1280: @@ -3650,6 +3658,12 @@ s3_recalctimings(svga_t *svga) break; } break; + + case S3_TRIO64: + case S3_TRIO32: + svga->hdisp >>= 1; + break; + default: break; } @@ -3756,6 +3770,11 @@ s3_recalctimings(svga_t *svga) } break; + case S3_TRIO64: + case S3_TRIO32: + svga->hdisp /= 3; + break; + default: break; } @@ -3834,6 +3853,7 @@ s3_recalctimings(svga_t *svga) if (svga->hdisp == 832) svga->hdisp -= 32; break; + case S3_ELSAWIN2KPROX: switch (s3->width) { case 1280: @@ -7222,71 +7242,36 @@ s3_911_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, if (!s3->accel.sy) break; - if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { - s3->accel.err_term += s3->accel.destx_distp; - /*Step minor axis*/ - switch (s3->accel.cmd & 0xe0) { - case 0x00: - s3->accel.cy--; - break; - case 0x20: - s3->accel.cy--; - break; - case 0x40: - s3->accel.cx--; - break; - case 0x60: - s3->accel.cx++; - break; - case 0x80: - s3->accel.cy++; - break; - case 0xa0: - s3->accel.cy++; - break; - case 0xc0: - s3->accel.cx--; - break; - case 0xe0: - s3->accel.cx++; - break; - - default: - break; - } - } else - s3->accel.err_term += s3->accel.desty_axstp; - - /*Step major axis*/ - switch (s3->accel.cmd & 0xe0) { - case 0x00: - s3->accel.cx--; - break; - case 0x20: - s3->accel.cx++; - break; - case 0x40: - s3->accel.cy--; - break; - case 0x60: - s3->accel.cy--; - break; - case 0x80: - s3->accel.cx--; - break; - case 0xa0: - s3->accel.cx++; - break; - case 0xc0: + if (s3->accel.cmd & 0x40) { + if (s3->accel.cmd & 0x80) s3->accel.cy++; - break; - case 0xe0: - s3->accel.cy++; - break; + else + s3->accel.cy--; - default: - break; + if (s3->accel.err_term >= 0) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x20) + s3->accel.cx++; + else + s3->accel.cx--; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } else { + if (s3->accel.cmd & 0x20) + s3->accel.cx++; + else + s3->accel.cx--; + + if (s3->accel.err_term >= 0) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x80) + s3->accel.cy++; + else + s3->accel.cy--; + } else + s3->accel.err_term += s3->accel.desty_axstp; } + s3->accel.sy--; s3->accel.cx &= 0xfff; s3->accel.cy &= 0xfff; @@ -8028,71 +8013,36 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (!s3->accel.sy) break; - if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { - s3->accel.err_term += s3->accel.destx_distp; - /*Step minor axis*/ - switch (s3->accel.cmd & 0xe0) { - case 0x00: - s3->accel.cy--; - break; - case 0x20: - s3->accel.cy--; - break; - case 0x40: - s3->accel.cx--; - break; - case 0x60: - s3->accel.cx++; - break; - case 0x80: - s3->accel.cy++; - break; - case 0xa0: - s3->accel.cy++; - break; - case 0xc0: - s3->accel.cx--; - break; - case 0xe0: - s3->accel.cx++; - break; - - default: - break; - } - } else - s3->accel.err_term += s3->accel.desty_axstp; - - /*Step major axis*/ - switch (s3->accel.cmd & 0xe0) { - case 0x00: - s3->accel.cx--; - break; - case 0x20: - s3->accel.cx++; - break; - case 0x40: - s3->accel.cy--; - break; - case 0x60: - s3->accel.cy--; - break; - case 0x80: - s3->accel.cx--; - break; - case 0xa0: - s3->accel.cx++; - break; - case 0xc0: + if (s3->accel.cmd & 0x40) { + if (s3->accel.cmd & 0x80) s3->accel.cy++; - break; - case 0xe0: - s3->accel.cy++; - break; + else + s3->accel.cy--; - default: - break; + if (s3->accel.err_term >= 0) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x20) + s3->accel.cx++; + else + s3->accel.cx--; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } else { + if (s3->accel.cmd & 0x20) + s3->accel.cx++; + else + s3->accel.cx--; + + if (s3->accel.err_term >= 0) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x80) + s3->accel.cy++; + else + s3->accel.cy--; + } else + s3->accel.err_term += s3->accel.desty_axstp; } + s3->accel.sy--; s3->accel.cx &= 0xfff; s3->accel.cy &= 0xfff;