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;