S3 changes again:
1. Moved the wraparound fix to the respective recalctimings, makes Commander Keen still playable without flickering and, at the same time, making Solaris work right in 640x480x8bpp+ mode (including 1024x768x8bpp). 2. The multifunction index 0x0e bit that can be toggled in 32bpp mode is now initialized properly, should fix the pinkness on Solaris' 32bpp mode.
This commit is contained in:
@@ -911,7 +911,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val)
|
||||
s3->accel.ssv_state = 0;
|
||||
s3->accel_start(-1, 0, 0xffffffff, 0, s3);
|
||||
if (s3->bpp == 3) {
|
||||
if (!(s3->accel.multifunc[0xe] & 0x200))
|
||||
if (!(s3->accel.multifunc[0xe] & 0x200) && !(svga->crtc[0x32] & 0x40))
|
||||
s3->accel.multifunc[0xe] &= ~0x10;
|
||||
}
|
||||
break;
|
||||
@@ -2717,11 +2717,6 @@ s3_out(uint16_t addr, uint8_t val, void *priv)
|
||||
s3->ma_ext = (s3->ma_ext & 0x1c) | ((val & 0x30) >> 4);
|
||||
svga->force_dword_mode = !!(val & 0x08);
|
||||
break;
|
||||
case 0x32:
|
||||
svga->vram_display_mask = (val & 0x40) ? 0x3ffff : s3->vram_mask;
|
||||
if (s3->color_16bit)
|
||||
svga->vram_display_mask = s3->vram_mask;
|
||||
break;
|
||||
|
||||
case 0x40:
|
||||
s3->enable_8514 = (val & 0x01);
|
||||
@@ -3101,15 +3096,6 @@ s3_recalctimings(svga_t *svga)
|
||||
int clk_sel = (svga->miscout >> 2) & 3;
|
||||
uint8_t mask = 0xc0;
|
||||
|
||||
if (!svga->scrblank && svga->attr_palette_enable) {
|
||||
if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) {
|
||||
if (svga->crtc[0x3a] & 0x10) { /*256+ color register*/
|
||||
svga->gdcreg[5] |= 0x40;
|
||||
svga->attrregs[0x10] |= 0x40;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
svga->ma_latch |= (s3->ma_ext << 16);
|
||||
if (s3->chip >= S3_86C928) {
|
||||
svga->hdisp = svga->hdisp_old;
|
||||
@@ -3173,7 +3159,7 @@ s3_recalctimings(svga_t *svga)
|
||||
break;
|
||||
}
|
||||
|
||||
svga->lowres = !((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10));
|
||||
svga->lowres = (!!(svga->attrregs[0x10] & 0x40) && !(svga->crtc[0x3a] & 0x10));
|
||||
|
||||
if (s3->chip != S3_86C801)
|
||||
mask |= 0x01;
|
||||
@@ -3232,7 +3218,8 @@ s3_recalctimings(svga_t *svga)
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10)) {
|
||||
if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) {
|
||||
svga->vram_display_mask = s3->vram_mask;
|
||||
pclog("BPP=%d, pitch=%d, width=%02x, double?=%x, 16bit?=%d, highres?=%d, attr=%02x.\n", svga->bpp, s3->width, svga->crtc[0x50], svga->crtc[0x31] & 0x02, s3->color_16bit, s3->accel.advfunc_cntl & 4, svga->attrregs[0x10] & 0x40);
|
||||
switch (svga->bpp) {
|
||||
case 8:
|
||||
@@ -3920,9 +3907,11 @@ s3_recalctimings(svga_t *svga)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask;
|
||||
if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) {
|
||||
if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) {
|
||||
if ((svga->crtc[0x31] & 0x08) && (svga->attrregs[0x10] & 0x40) == 0x00) {
|
||||
if (svga->crtc[0x31] & 0x08) {
|
||||
svga->vram_display_mask = s3->vram_mask;
|
||||
if (svga->bpp == 8) {
|
||||
svga->render = svga_render_8bpp_highres; /*Enhanced 4bpp mode, just like the 8bpp mode per spec.*/
|
||||
svga->rowoffset <<= 1;
|
||||
@@ -3939,14 +3928,6 @@ s3_trio64v_recalctimings(svga_t *svga)
|
||||
s3_t *s3 = (s3_t *) svga->priv;
|
||||
int clk_sel = (svga->miscout >> 2) & 3;
|
||||
|
||||
if (!svga->scrblank && svga->attr_palette_enable) {
|
||||
if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) {
|
||||
if (svga->crtc[0x3a] & 0x10) { /*256+ color register*/
|
||||
svga->gdcreg[5] |= 0x40;
|
||||
svga->attrregs[0x10] |= 0x40;
|
||||
}
|
||||
}
|
||||
}
|
||||
svga->hdisp = svga->hdisp_old;
|
||||
if (svga->crtc[0x5d] & 0x01)
|
||||
svga->htotal |= 0x100;
|
||||
@@ -4002,9 +3983,10 @@ s3_trio64v_recalctimings(svga_t *svga)
|
||||
if (!svga->rowoffset)
|
||||
svga->rowoffset = 256;
|
||||
|
||||
svga->lowres = !((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10));
|
||||
svga->lowres = (!!(svga->attrregs[0x10] & 0x40) && !(svga->crtc[0x3a] & 0x10));
|
||||
|
||||
if ((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10)) {
|
||||
if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) {
|
||||
svga->vram_display_mask = s3->vram_mask;
|
||||
switch (svga->bpp) {
|
||||
case 8:
|
||||
svga->render = svga_render_8bpp_highres;
|
||||
@@ -4028,7 +4010,9 @@ s3_trio64v_recalctimings(svga_t *svga)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else
|
||||
svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask;
|
||||
|
||||
} else /*Streams mode*/
|
||||
{
|
||||
if (s3->streams.buffer_ctrl & 1)
|
||||
@@ -4053,6 +4037,7 @@ s3_trio64v_recalctimings(svga_t *svga)
|
||||
svga->overlay.v_acc = s3->streams.dda_vert_accumulator;
|
||||
svga->rowoffset = s3->streams.pri_stride >> 3;
|
||||
|
||||
svga->vram_display_mask = s3->vram_mask;
|
||||
switch ((s3->streams.pri_ctrl >> 24) & 0x7) {
|
||||
case 0: /*RGB-8 (CLUT)*/
|
||||
svga->render = svga_render_8bpp_highres;
|
||||
|
Reference in New Issue
Block a user