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                  }