PCem

changeset 91:6579fed92118

Added 32-bit command registers for S3 864/Trio64.
author TomW
date Wed Mar 26 22:14:13 2014 +0000
parents e1e6f70a0f68
children c49302f432e2
files src/vid_s3.c
diffstat 1 files changed, 112 insertions(+), 49 deletions(-) [+]
line diff
     1.1 --- a/src/vid_s3.c	Wed Mar 26 21:52:53 2014 +0000
     1.2 +++ b/src/vid_s3.c	Wed Mar 26 22:14:13 2014 +0000
     1.3 @@ -516,75 +516,118 @@
     1.4                  break;
     1.5  
     1.6                  case 0xa2e8:
     1.7 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
     1.8 -                   s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16);
     1.9 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
    1.10 +                        s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16);
    1.11                  else
    1.12 -                   s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val;
    1.13 +                        s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val;
    1.14                  break;
    1.15                  case 0xa2e9:
    1.16 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
    1.17 -                   s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24);
    1.18 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
    1.19 +                        s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24);
    1.20                  else
    1.21 -                   s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8);
    1.22 -                s3->accel.multifunc[0xe] ^= 0x10;
    1.23 +                        s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8);
    1.24 +                if (!(s3->accel.multifunc[0xe] & 0x200))
    1.25 +                        s3->accel.multifunc[0xe] ^= 0x10;
    1.26 +                break;
    1.27 +                case 0xa2ea:
    1.28 +                if (s3->accel.multifunc[0xe] & 0x200)
    1.29 +                        s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16);
    1.30 +                break;
    1.31 +                case 0xa2eb:
    1.32 +                if (s3->accel.multifunc[0xe] & 0x200)
    1.33 +                        s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24);
    1.34                  break;
    1.35  
    1.36                  case 0xa6e8:
    1.37 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
    1.38 -                   s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16);
    1.39 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
    1.40 +                        s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16);
    1.41                  else
    1.42 -                   s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val;
    1.43 -//                pclog("Foreground colour now %08X %i\n", s3->accel.frgd_color, s3->bpp);
    1.44 +                        s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val;
    1.45                  break;
    1.46                  case 0xa6e9:
    1.47 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
    1.48 -                   s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24);
    1.49 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
    1.50 +                        s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24);
    1.51                  else
    1.52 -                   s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8);
    1.53 -                s3->accel.multifunc[0xe] ^= 0x10;
    1.54 -//                pclog("Foreground colour now %08X\n", s3->accel.frgd_color);
    1.55 +                        s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8);
    1.56 +                if (!(s3->accel.multifunc[0xe] & 0x200))
    1.57 +                        s3->accel.multifunc[0xe] ^= 0x10;
    1.58 +                break;
    1.59 +                case 0xa6ea:
    1.60 +                if (s3->accel.multifunc[0xe] & 0x200)
    1.61 +                        s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16);
    1.62 +                break;
    1.63 +                case 0xa6eb:
    1.64 +                if (s3->accel.multifunc[0xe] & 0x200)
    1.65 +                        s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24);
    1.66                  break;
    1.67  
    1.68                  case 0xaae8:
    1.69 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
    1.70 -                   s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16);
    1.71 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
    1.72 +                        s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16);
    1.73                  else
    1.74 -                   s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val;
    1.75 +                        s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val;
    1.76                  break;
    1.77                  case 0xaae9:
    1.78 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
    1.79 -                   s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24);
    1.80 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
    1.81 +                        s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24);
    1.82                  else
    1.83 -                   s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8);
    1.84 -                s3->accel.multifunc[0xe] ^= 0x10;
    1.85 +                        s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8);
    1.86 +                if (!(s3->accel.multifunc[0xe] & 0x200))
    1.87 +                        s3->accel.multifunc[0xe] ^= 0x10;
    1.88 +                break;
    1.89 +                case 0xaaea:
    1.90 +                if (s3->accel.multifunc[0xe] & 0x200)
    1.91 +                        s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16);
    1.92 +                break;
    1.93 +                case 0xaaeb:
    1.94 +                if (s3->accel.multifunc[0xe] & 0x200)
    1.95 +                        s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24);
    1.96                  break;
    1.97  
    1.98                  case 0xaee8:
    1.99 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
   1.100 -                   s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16);
   1.101 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
   1.102 +                        s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16);
   1.103                  else
   1.104 -                   s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val;
   1.105 +                        s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val;
   1.106                  break;
   1.107                  case 0xaee9:
   1.108 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
   1.109 -                   s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24);
   1.110 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
   1.111 +                        s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24);
   1.112                  else
   1.113 -                   s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8);
   1.114 -                s3->accel.multifunc[0xe] ^= 0x10;
   1.115 +                        s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8);
   1.116 +                if (!(s3->accel.multifunc[0xe] & 0x200))
   1.117 +                        s3->accel.multifunc[0xe] ^= 0x10;
   1.118 +                break;
   1.119 +                case 0xaeea:
   1.120 +                if (s3->accel.multifunc[0xe] & 0x200)
   1.121 +                        s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16);
   1.122 +                break;
   1.123 +                case 0xaeeb:
   1.124 +                if (s3->accel.multifunc[0xe] & 0x200)
   1.125 +                        s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24);
   1.126                  break;
   1.127  
   1.128                  case 0xb2e8:
   1.129 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
   1.130 -                   s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16);
   1.131 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
   1.132 +                        s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16);
   1.133                  else
   1.134 -                   s3->accel.color_cmp = (s3->accel.color_cmp & ~0x000000ff) | val;
   1.135 +                        s3->accel.color_cmp = (s3->accel.color_cmp & ~0x000000ff) | val;
   1.136                  break;
   1.137                  case 0xb2e9:
   1.138 -                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10)
   1.139 -                   s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24);
   1.140 +                if (s3->bpp == 3 && s3->accel.multifunc[0xe] & 0x10 && !(s3->accel.multifunc[0xe] & 0x200))
   1.141 +                        s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24);
   1.142                  else
   1.143 -                   s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8);
   1.144 -                s3->accel.multifunc[0xe] ^= 0x10;
   1.145 +                        s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8);
   1.146 +                if (!(s3->accel.multifunc[0xe] & 0x200))
   1.147 +                        s3->accel.multifunc[0xe] ^= 0x10;
   1.148 +                break;
   1.149 +                case 0xb2ea:
   1.150 +                if (s3->accel.multifunc[0xe] & 0x200)
   1.151 +                        s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16);
   1.152 +                break;
   1.153 +                case 0xb2eb:
   1.154 +                if (s3->accel.multifunc[0xe] & 0x200)
   1.155 +                        s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24);
   1.156                  break;
   1.157  
   1.158                  case 0xb6e8:
   1.159 @@ -749,26 +792,46 @@
   1.160                  return s3->accel.bkgd_color & 0xff;
   1.161                  case 0xa2e9:
   1.162                  return s3->accel.bkgd_color >> 8;
   1.163 +                case 0xa2ea:
   1.164 +                return s3->accel.bkgd_color >> 16;
   1.165 +                case 0xa2eb:
   1.166 +                return s3->accel.bkgd_color >> 24;
   1.167  
   1.168                  case 0xa6e8:
   1.169                  return s3->accel.frgd_color & 0xff;
   1.170                  case 0xa6e9:
   1.171                  return s3->accel.frgd_color >> 8;
   1.172 +                case 0xa6ea:
   1.173 +                return s3->accel.frgd_color >> 16;
   1.174 +                case 0xa6eb:
   1.175 +                return s3->accel.frgd_color >> 24;
   1.176  
   1.177                  case 0xaae8:
   1.178                  return s3->accel.wrt_mask & 0xff;
   1.179                  case 0xaae9:
   1.180                  return s3->accel.wrt_mask >> 8;
   1.181 +                case 0xaaea:
   1.182 +                return s3->accel.wrt_mask >> 16;
   1.183 +                case 0xaaeb:
   1.184 +                return s3->accel.wrt_mask >> 24;
   1.185  
   1.186                  case 0xaee8:
   1.187                  return s3->accel.rd_mask & 0xff;
   1.188                  case 0xaee9:
   1.189                  return s3->accel.rd_mask >> 8;
   1.190 +                case 0xaeea:
   1.191 +                return s3->accel.rd_mask >> 16;
   1.192 +                case 0xaeeb:
   1.193 +                return s3->accel.rd_mask >> 24;
   1.194  
   1.195                  case 0xb2e8:
   1.196                  return s3->accel.color_cmp & 0xff;
   1.197                  case 0xb2e9:
   1.198                  return s3->accel.color_cmp >> 8;
   1.199 +                case 0xb2ea:
   1.200 +                return s3->accel.color_cmp >> 16;
   1.201 +                case 0xb2eb:
   1.202 +                return s3->accel.color_cmp >> 24;
   1.203  
   1.204                  case 0xb6e8:
   1.205                  return s3->accel.bkgd_mix;
   1.206 @@ -1666,11 +1729,11 @@
   1.207          io_removehandler(0x96e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.208          io_removehandler(0x9ae8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.209          io_removehandler(0x9ee8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.210 -        io_removehandler(0xa2e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.211 -        io_removehandler(0xa6e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.212 -        io_removehandler(0xaae8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.213 -        io_removehandler(0xaee8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.214 -        io_removehandler(0xb2e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.215 +        io_removehandler(0xa2e8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.216 +        io_removehandler(0xa6e8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.217 +        io_removehandler(0xaae8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.218 +        io_removehandler(0xaee8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.219 +        io_removehandler(0xb2e8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.220          io_removehandler(0xb6e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.221          io_removehandler(0xbae8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.222          io_removehandler(0xbee8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.223 @@ -1694,11 +1757,11 @@
   1.224          io_sethandler(0x96e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.225          io_sethandler(0x9ae8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.226          io_sethandler(0x9ee8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.227 -        io_sethandler(0xa2e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.228 -        io_sethandler(0xa6e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.229 -        io_sethandler(0xaae8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.230 -        io_sethandler(0xaee8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.231 -        io_sethandler(0xb2e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.232 +        io_sethandler(0xa2e8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.233 +        io_sethandler(0xa6e8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.234 +        io_sethandler(0xaae8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.235 +        io_sethandler(0xaee8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.236 +        io_sethandler(0xb2e8, 0x0004, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.237          io_sethandler(0xb6e8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.238          io_sethandler(0xbae8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.239          io_sethandler(0xbee8, 0x0002, s3_accel_in, NULL, NULL, s3_accel_out, NULL, NULL,  s3);
   1.240 @@ -1795,8 +1858,8 @@
   1.241          if (PCI)
   1.242                  mem_mapping_disable(&s3->bios_rom.mapping);
   1.243  
   1.244 -        mem_mapping_add(&s3->linear_mapping, 0,       0,       svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, 0, &s3->svga);
   1.245 -        mem_mapping_add(&s3->mmio_mapping,   0xa0000, 0x10000, s3_accel_read, NULL, NULL, s3_accel_write, s3_accel_write_w, s3_accel_write_l, NULL, 0, s3);
   1.246 +        mem_mapping_add(&s3->linear_mapping, 0,       0,       svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, MEM_MAPPING_EXTERNAL, &s3->svga);
   1.247 +        mem_mapping_add(&s3->mmio_mapping,   0xa0000, 0x10000, s3_accel_read, NULL, NULL, s3_accel_write, s3_accel_write_w, s3_accel_write_l, NULL, MEM_MAPPING_EXTERNAL, s3);
   1.248          mem_mapping_disable(&s3->mmio_mapping);
   1.249  
   1.250          svga_init(&s3->svga, s3, 1 << 22, /*4mb - 864 supports 8mb but buggy VESA driver reports 0mb*/