Implemented VGA colour plane mask, 640x200x2 (eg Windows 2.x startup screen) now displayed correctly.

This commit is contained in:
TomW 2013-12-07 14:02:03 +00:00
commit 273639bd79
3 changed files with 24 additions and 16 deletions

View file

@ -44,6 +44,12 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
}
if (svga->attraddr == 0x10)
svga_recalctimings(svga);
if (svga->attraddr == 0x12)
{
if ((val & 0xf) != svga->plane_mask)
svga->fullchange = changeframecount;
svga->plane_mask = val & 0xf;
}
}
svga->attrff ^= 1;
break;

View file

@ -23,6 +23,8 @@ typedef struct svga_t
uint8_t cgastat;
uint8_t plane_mask;
int fast;
uint8_t colourcompare, colournocare;
int readmode, writemode, readplane;

View file

@ -280,17 +280,17 @@ void svga_render_4bpp_lowres(svga_t *svga)
svga->ma &= svga->vrammask;
dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
p[0] = p[1] = svga->pallook[svga->egapal[dat >> 4]];
p[2] = p[3] = svga->pallook[svga->egapal[dat & 0xf]];
p[0] = p[1] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[2] = p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
p[4] = p[5] = svga->pallook[svga->egapal[dat >> 4]];
p[6] = p[7] = svga->pallook[svga->egapal[dat & 0xf]];
p[4] = p[5] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[6] = p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
p[8] = p[9] = svga->pallook[svga->egapal[dat >> 4]];
p[10] = p[11] = svga->pallook[svga->egapal[dat & 0xf]];
p[8] = p[9] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[10] = p[11] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
p[12] = p[13] = svga->pallook[svga->egapal[dat >> 4]];
p[14] = p[15] = svga->pallook[svga->egapal[dat & 0xf]];
p[12] = p[13] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[14] = p[15] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
p += 16;
}
@ -329,17 +329,17 @@ void svga_render_4bpp_highres(svga_t *svga)
svga->ma &= svga->vrammask;
dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
p[0] = svga->pallook[svga->egapal[dat >> 4]];
p[1] = svga->pallook[svga->egapal[dat & 0xf]];
p[0] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[1] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
p[2] = svga->pallook[svga->egapal[dat >> 4]];
p[3] = svga->pallook[svga->egapal[dat & 0xf]];
p[2] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
p[4] = svga->pallook[svga->egapal[dat >> 4]];
p[5] = svga->pallook[svga->egapal[dat & 0xf]];
p[4] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[5] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
p[6] = svga->pallook[svga->egapal[dat >> 4]];
p[7] = svga->pallook[svga->egapal[dat & 0xf]];
p[6] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
p += 8;
}