@@ -736,17 +736,22 @@ mystique_out(uint16_t addr, uint8_t val, void *priv)
736
736
case 0x3df :
737
737
if (mystique -> crtcext_idx == 1 )
738
738
svga -> dpms = !!(val & 0x30 );
739
+ old = mystique -> crtcext_regs [mystique -> crtcext_idx ];
739
740
if (mystique -> crtcext_idx < 6 )
740
741
mystique -> crtcext_regs [mystique -> crtcext_idx ] = val ;
742
+
743
+ if (mystique -> crtcext_idx == 6 && (old ^ val ) == CRTCX_R3_MGAMODE && mystique -> type >= MGA_2164W )
744
+ svga_recalctimings (svga );
741
745
742
746
if ((mystique -> type >= MGA_1064SG ) && (mystique -> crtcext_idx == 0 ) &&
743
747
(mystique -> crtcext_regs [3 ] & CRTCX_R3_MGAMODE )) {
744
748
svga -> rowoffset = svga -> crtc [0x13 ] |
745
749
((mystique -> crtcext_regs [0 ] & CRTCX_R0_OFFSET_MASK ) << 4 );
746
- svga -> rowoffset <<= 1 ;
750
+ if (!(mystique -> type >= MGA_2164W ))
751
+ svga -> rowoffset <<= 1 ;
747
752
svga -> ma_latch = ((mystique -> crtcext_regs [0 ] & CRTCX_R0_STARTADD_MASK ) << 16 ) |
748
753
(svga -> crtc [0xc ] << 8 ) | svga -> crtc [0xd ];
749
- if (mystique -> pci_regs [0x41 ] & (OPTION_INTERLEAVE >> 8 )) {
754
+ if (( mystique -> pci_regs [0x41 ] & (OPTION_INTERLEAVE >> 8 )) && !( mystique -> type >= MGA_2164W )) {
750
755
svga -> rowoffset <<= 1 ;
751
756
svga -> ma_latch <<= 1 ;
752
757
}
@@ -935,7 +940,7 @@ mystique_recalctimings(svga_t *svga)
935
940
if (mystique -> type >= MGA_1064SG )
936
941
svga -> ma_latch = ((mystique -> crtcext_regs [0 ] & CRTCX_R0_STARTADD_MASK ) << 16 ) | (svga -> crtc [0xc ] << 8 ) | svga -> crtc [0xd ];
937
942
938
- if (mystique -> pci_regs [0x41 ] & (OPTION_INTERLEAVE >> 8 )) {
943
+ if (( mystique -> pci_regs [0x41 ] & (OPTION_INTERLEAVE >> 8 )) && !( mystique -> type >= MGA_2164W )) {
939
944
svga -> rowoffset <<= 1 ;
940
945
if (mystique -> type >= MGA_1064SG )
941
946
svga -> ma_latch <<= 1 ;
@@ -957,34 +962,55 @@ mystique_recalctimings(svga_t *svga)
957
962
mystique -> ma_latch_old = svga -> ma_latch ;
958
963
}
959
964
960
- svga -> rowoffset <<= 1 ;
961
- switch (mystique -> xmulctrl & XMULCTRL_DEPTH_MASK ) {
962
- case XMULCTRL_DEPTH_8 :
963
- case XMULCTRL_DEPTH_2G8V16 :
964
- svga -> render = svga_render_8bpp_highres ;
965
- svga -> bpp = 8 ;
966
- break ;
967
- case XMULCTRL_DEPTH_15 :
968
- case XMULCTRL_DEPTH_G16V16 :
969
- svga -> render = svga_render_15bpp_highres ;
970
- svga -> bpp = 15 ;
971
- break ;
972
- case XMULCTRL_DEPTH_16 :
973
- svga -> render = svga_render_16bpp_highres ;
974
- svga -> bpp = 16 ;
975
- break ;
976
- case XMULCTRL_DEPTH_24 :
977
- svga -> render = svga_render_24bpp_highres ;
978
- svga -> bpp = 24 ;
979
- break ;
980
- case XMULCTRL_DEPTH_32 :
981
- case XMULCTRL_DEPTH_32_OVERLAYED :
982
- svga -> render = svga_render_32bpp_highres ;
983
- svga -> bpp = 32 ;
984
- break ;
965
+ if (!(mystique -> type >= MGA_2164W ))
966
+ svga -> rowoffset <<= 1 ;
967
+ if (mystique -> type != MGA_2164W ) {
968
+ switch (mystique -> xmulctrl & XMULCTRL_DEPTH_MASK ) {
969
+ case XMULCTRL_DEPTH_8 :
970
+ case XMULCTRL_DEPTH_2G8V16 :
971
+ svga -> render = svga_render_8bpp_highres ;
972
+ svga -> bpp = 8 ;
973
+ break ;
974
+ case XMULCTRL_DEPTH_15 :
975
+ case XMULCTRL_DEPTH_G16V16 :
976
+ svga -> render = svga_render_15bpp_highres ;
977
+ svga -> bpp = 15 ;
978
+ break ;
979
+ case XMULCTRL_DEPTH_16 :
980
+ svga -> render = svga_render_16bpp_highres ;
981
+ svga -> bpp = 16 ;
982
+ break ;
983
+ case XMULCTRL_DEPTH_24 :
984
+ svga -> render = svga_render_24bpp_highres ;
985
+ svga -> bpp = 24 ;
986
+ break ;
987
+ case XMULCTRL_DEPTH_32 :
988
+ case XMULCTRL_DEPTH_32_OVERLAYED :
989
+ svga -> render = svga_render_32bpp_highres ;
990
+ svga -> bpp = 32 ;
991
+ break ;
985
992
986
- default :
987
- break ;
993
+ default :
994
+ break ;
995
+ }
996
+ } else {
997
+ switch (svga -> bpp ) {
998
+ case 8 :
999
+ svga -> render = svga_render_8bpp_highres ;
1000
+ break ;
1001
+ case 15 :
1002
+ svga -> render = svga_render_15bpp_highres ;
1003
+ break ;
1004
+ case 16 :
1005
+ svga -> render = svga_render_16bpp_highres ;
1006
+ break ;
1007
+ case 24 :
1008
+ svga -> render = svga_render_24bpp_highres ;
1009
+ break ;
1010
+ case 32 :
1011
+ svga -> render = svga_render_32bpp_highres ;
1012
+ break ;
1013
+ }
988
1014
}
989
1015
} else {
990
1016
switch (svga -> bpp ) {
0 commit comments