PCem
changeset 46:f9ec91752d3e
Implemented VGA colour plane mask, 640x200x2 (eg Windows 2.x startup screen) now displayed correctly.
| author | TomW |
|---|---|
| date | Sat Dec 07 14:02:03 2013 +0000 |
| parents | f85939140905 |
| children | 2bee94e6b42f |
| files | src/vid_svga.c src/vid_svga.h src/vid_svga_render.c |
| diffstat | 3 files changed, 24 insertions(+), 16 deletions(-) [+] |
line diff
1.1 --- a/src/vid_svga.c Sat Dec 07 13:43:06 2013 +0000 1.2 +++ b/src/vid_svga.c Sat Dec 07 14:02:03 2013 +0000 1.3 @@ -44,6 +44,12 @@ 1.4 } 1.5 if (svga->attraddr == 0x10) 1.6 svga_recalctimings(svga); 1.7 + if (svga->attraddr == 0x12) 1.8 + { 1.9 + if ((val & 0xf) != svga->plane_mask) 1.10 + svga->fullchange = changeframecount; 1.11 + svga->plane_mask = val & 0xf; 1.12 + } 1.13 } 1.14 svga->attrff ^= 1; 1.15 break;
2.1 --- a/src/vid_svga.h Sat Dec 07 13:43:06 2013 +0000 2.2 +++ b/src/vid_svga.h Sat Dec 07 14:02:03 2013 +0000 2.3 @@ -23,6 +23,8 @@ 2.4 2.5 uint8_t cgastat; 2.6 2.7 + uint8_t plane_mask; 2.8 + 2.9 int fast; 2.10 uint8_t colourcompare, colournocare; 2.11 int readmode, writemode, readplane;
3.1 --- a/src/vid_svga_render.c Sat Dec 07 13:43:06 2013 +0000 3.2 +++ b/src/vid_svga_render.c Sat Dec 07 14:02:03 2013 +0000 3.3 @@ -280,17 +280,17 @@ 3.4 svga->ma &= svga->vrammask; 3.5 3.6 dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2); 3.7 - p[0] = p[1] = svga->pallook[svga->egapal[dat >> 4]]; 3.8 - p[2] = p[3] = svga->pallook[svga->egapal[dat & 0xf]]; 3.9 + p[0] = p[1] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.10 + p[2] = p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.11 dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2); 3.12 - p[4] = p[5] = svga->pallook[svga->egapal[dat >> 4]]; 3.13 - p[6] = p[7] = svga->pallook[svga->egapal[dat & 0xf]]; 3.14 + p[4] = p[5] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.15 + p[6] = p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.16 dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2); 3.17 - p[8] = p[9] = svga->pallook[svga->egapal[dat >> 4]]; 3.18 - p[10] = p[11] = svga->pallook[svga->egapal[dat & 0xf]]; 3.19 + p[8] = p[9] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.20 + p[10] = p[11] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.21 dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2); 3.22 - p[12] = p[13] = svga->pallook[svga->egapal[dat >> 4]]; 3.23 - p[14] = p[15] = svga->pallook[svga->egapal[dat & 0xf]]; 3.24 + p[12] = p[13] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.25 + p[14] = p[15] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.26 3.27 p += 16; 3.28 } 3.29 @@ -329,17 +329,17 @@ 3.30 svga->ma &= svga->vrammask; 3.31 3.32 dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2); 3.33 - p[0] = svga->pallook[svga->egapal[dat >> 4]]; 3.34 - p[1] = svga->pallook[svga->egapal[dat & 0xf]]; 3.35 + p[0] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.36 + p[1] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.37 dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2); 3.38 - p[2] = svga->pallook[svga->egapal[dat >> 4]]; 3.39 - p[3] = svga->pallook[svga->egapal[dat & 0xf]]; 3.40 + p[2] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.41 + p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.42 dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2); 3.43 - p[4] = svga->pallook[svga->egapal[dat >> 4]]; 3.44 - p[5] = svga->pallook[svga->egapal[dat & 0xf]]; 3.45 + p[4] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.46 + p[5] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.47 dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2); 3.48 - p[6] = svga->pallook[svga->egapal[dat >> 4]]; 3.49 - p[7] = svga->pallook[svga->egapal[dat & 0xf]]; 3.50 + p[6] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; 3.51 + p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; 3.52 3.53 p += 8; 3.54 }
