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*/
