Skip to content

Commit 8ba3521

Browse files
committed
Millennium II: Fix squished image on MGA modes
1 parent 277581d commit 8ba3521

File tree

1 file changed

+56
-30
lines changed

1 file changed

+56
-30
lines changed

src/video/vid_mga.c

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -736,17 +736,22 @@ mystique_out(uint16_t addr, uint8_t val, void *priv)
736736
case 0x3df:
737737
if (mystique->crtcext_idx == 1)
738738
svga->dpms = !!(val & 0x30);
739+
old = mystique->crtcext_regs[mystique->crtcext_idx];
739740
if (mystique->crtcext_idx < 6)
740741
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);
741745

742746
if ((mystique->type >= MGA_1064SG) && (mystique->crtcext_idx == 0) &&
743747
(mystique->crtcext_regs[3] & CRTCX_R3_MGAMODE)) {
744748
svga->rowoffset = svga->crtc[0x13] |
745749
((mystique->crtcext_regs[0] & CRTCX_R0_OFFSET_MASK) << 4);
746-
svga->rowoffset <<= 1;
750+
if (!(mystique->type >= MGA_2164W))
751+
svga->rowoffset <<= 1;
747752
svga->ma_latch = ((mystique->crtcext_regs[0] & CRTCX_R0_STARTADD_MASK) << 16) |
748753
(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)) {
750755
svga->rowoffset <<= 1;
751756
svga->ma_latch <<= 1;
752757
}
@@ -935,7 +940,7 @@ mystique_recalctimings(svga_t *svga)
935940
if (mystique->type >= MGA_1064SG)
936941
svga->ma_latch = ((mystique->crtcext_regs[0] & CRTCX_R0_STARTADD_MASK) << 16) | (svga->crtc[0xc] << 8) | svga->crtc[0xd];
937942

938-
if (mystique->pci_regs[0x41] & (OPTION_INTERLEAVE >> 8)) {
943+
if ((mystique->pci_regs[0x41] & (OPTION_INTERLEAVE >> 8)) && !(mystique->type >= MGA_2164W)) {
939944
svga->rowoffset <<= 1;
940945
if (mystique->type >= MGA_1064SG)
941946
svga->ma_latch <<= 1;
@@ -957,34 +962,55 @@ mystique_recalctimings(svga_t *svga)
957962
mystique->ma_latch_old = svga->ma_latch;
958963
}
959964

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;
985992

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+
}
9881014
}
9891015
} else {
9901016
switch (svga->bpp) {

0 commit comments

Comments
 (0)