PCem
changeset 101:6a3c97f280f5
S3 changes :
Altered endianness of multi-word image transfers - fixes icons on Windows NT
Current position registers now updated at the end of commands - fixes some drawing issues on Windows NT
Hack to reset indicator of which half of colour registers will be accessed - fixed intermittent 32-bit colour issues
| author | TomW |
|---|---|
| date | Sat May 03 13:39:03 2014 +0100 |
| parents | 6d9569f7c970 |
| children | 3d3d486d5fce |
| files | src/vid_s3.c |
| diffstat | 1 files changed, 30 insertions(+), 14 deletions(-) [+] |
line diff
1.1 --- a/src/vid_s3.c Mon Apr 28 21:01:38 2014 +0100 1.2 +++ b/src/vid_s3.c Sat May 03 13:39:03 2014 +0100 1.3 @@ -506,6 +506,7 @@ 1.4 s3->accel.cmd = (s3->accel.cmd & 0xff) | (val << 8); 1.5 s3_accel_start(-1, 0, 0xffffffff, 0, s3); 1.6 s3->accel.pix_trans_count = 0; 1.7 + s3->accel.multifunc[0xe] &= ~0x10; /*hack*/ 1.8 break; 1.9 1.10 case 0x9ee8: 1.11 @@ -1061,15 +1062,15 @@ 1.12 s3_accel_start(4, 1, 0xffffffff, val, s3); 1.13 else if ((s3->accel.cmd & 0x600) == 0x200) 1.14 { 1.15 + s3_accel_start(2, 1, 0xffffffff, val, s3); 1.16 s3_accel_start(2, 1, 0xffffffff, val >> 16, s3); 1.17 - s3_accel_start(2, 1, 0xffffffff, val, s3); 1.18 } 1.19 else if (!(s3->accel.cmd & 0x600)) 1.20 { 1.21 + s3_accel_start(1, 1, 0xffffffff, val, s3); 1.22 + s3_accel_start(1, 1, 0xffffffff, val >> 8, s3); 1.23 + s3_accel_start(1, 1, 0xffffffff, val >> 16, s3); 1.24 s3_accel_start(1, 1, 0xffffffff, val >> 24, s3); 1.25 - s3_accel_start(1, 1, 0xffffffff, val >> 16, s3); 1.26 - s3_accel_start(1, 1, 0xffffffff, val >> 8, s3); 1.27 - s3_accel_start(1, 1, 0xffffffff, val, s3); 1.28 } 1.29 } 1.30 } 1.31 @@ -1211,7 +1212,7 @@ 1.32 compare_mode < 2) 1.33 { 1.34 READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); 1.35 - 1.36 + 1.37 MIX 1.38 1.39 WRITE((s3->accel.cy * s3->width) + s3->accel.cx); 1.40 @@ -1221,21 +1222,25 @@ 1.41 mix_dat <<= 1; 1.42 mix_dat |= 1; 1.43 if (s3->bpp == 0) cpu_dat >>= 8; 1.44 - else cpu_dat >>= 16; 1.45 + else cpu_dat >>= 16; 1.46 + if (!s3->accel.sy) 1.47 + break; 1.48 1.49 switch (s3->accel.cmd & 0xe0) 1.50 { 1.51 - case 0x00: s3->accel.cx++; break; 1.52 + case 0x00: s3->accel.cx++; break; 1.53 case 0x20: s3->accel.cx++; s3->accel.cy--; break; 1.54 - case 0x40: s3->accel.cy--; break; 1.55 + case 0x40: s3->accel.cy--; break; 1.56 case 0x60: s3->accel.cx--; s3->accel.cy--; break; 1.57 - case 0x80: s3->accel.cx--; break; 1.58 + case 0x80: s3->accel.cx--; break; 1.59 case 0xa0: s3->accel.cx--; s3->accel.cy++; break; 1.60 - case 0xc0: s3->accel.cy++; break; 1.61 + case 0xc0: s3->accel.cy++; break; 1.62 case 0xe0: s3->accel.cx++; s3->accel.cy++; break; 1.63 } 1.64 s3->accel.sy--; 1.65 } 1.66 + s3->accel.cur_x = s3->accel.cx; 1.67 + s3->accel.cur_y = s3->accel.cy; 1.68 } 1.69 else /*Bresenham*/ 1.70 { 1.71 @@ -1263,7 +1268,7 @@ 1.72 MIX 1.73 1.74 // pclog("%02X\n", dest_dat); 1.75 - 1.76 + 1.77 WRITE((s3->accel.cy * s3->width) + s3->accel.cx); 1.78 } 1.79 } 1.80 @@ -1275,6 +1280,9 @@ 1.81 1.82 // pclog("%i, %i - %i %i %i %i\n", s3->accel.cx, s3->accel.cy, s3->accel.err_term, s3->accel.maj_axis_pcnt, s3->accel.desty_axstp, s3->accel.destx_distp); 1.83 1.84 + if (!s3->accel.sy) 1.85 + break; 1.86 + 1.87 if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) 1.88 { 1.89 s3->accel.err_term += s3->accel.destx_distp; 1.90 @@ -1308,6 +1316,8 @@ 1.91 } 1.92 s3->accel.sy--; 1.93 } 1.94 + s3->accel.cur_x = s3->accel.cx; 1.95 + s3->accel.cur_y = s3->accel.cy; 1.96 } 1.97 break; 1.98 1.99 @@ -1386,6 +1396,8 @@ 1.100 if (cpu_input/* && (s3->accel.multifunc[0xa] & 0xc0) == 0x80*/) return; 1.101 if (s3->accel.sy < 0) 1.102 { 1.103 + s3->accel.cur_x = s3->accel.cx; 1.104 + s3->accel.cur_y = s3->accel.cy; 1.105 return; 1.106 } 1.107 } 1.108 @@ -1456,7 +1468,11 @@ 1.109 s3->accel.sy--; 1.110 1.111 if (s3->accel.sy < 0) 1.112 - return; 1.113 + { 1.114 + s3->accel.cur_x = s3->accel.cx; 1.115 + s3->accel.cur_y = s3->accel.cy; 1.116 + return; 1.117 + } 1.118 } 1.119 } 1.120 } 1.121 @@ -1545,6 +1561,8 @@ 1.122 if (cpu_input/* && (s3->accel.multifunc[0xa] & 0xc0) == 0x80*/) return; 1.123 if (s3->accel.sy < 0) 1.124 { 1.125 + s3->accel.cur_x = s3->accel.cx; 1.126 + s3->accel.cur_y = s3->accel.cy; 1.127 return; 1.128 } 1.129 } 1.130 @@ -1673,9 +1691,7 @@ 1.131 1.132 if (cpu_input/* && (s3->accel.multifunc[0xa] & 0xc0) == 0x80*/) return; 1.133 if (s3->accel.sy < 0) 1.134 - { 1.135 return; 1.136 - } 1.137 } 1.138 } 1.139 break;
