From 273639bd795633fd5e4bb8cef142c90079d1efc0 Mon Sep 17 00:00:00 2001 From: TomW Date: Sat, 7 Dec 2013 14:02:03 +0000 Subject: [PATCH] Implemented VGA colour plane mask, 640x200x2 (eg Windows 2.x startup screen) now displayed correctly. --- src/vid_svga.c | 6 ++++++ src/vid_svga.h | 2 ++ src/vid_svga_render.c | 32 ++++++++++++++++---------------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/vid_svga.c b/src/vid_svga.c index 741cc9d..d27d635 100644 --- a/src/vid_svga.c +++ b/src/vid_svga.c @@ -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; diff --git a/src/vid_svga.h b/src/vid_svga.h index 630dfa9..f969abd 100644 --- a/src/vid_svga.h +++ b/src/vid_svga.h @@ -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; diff --git a/src/vid_svga_render.c b/src/vid_svga_render.c index d0b76d0..19850f3 100644 --- a/src/vid_svga_render.c +++ b/src/vid_svga_render.c @@ -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; }