Module: wine Branch: master Commit: b627dd2afc1816c79ab4d9cfe9aecd4dd52ad5ab URL: http://source.winehq.org/git/wine.git/?a=commit;h=b627dd2afc1816c79ab4d9cfe9...
Author: Peter Dons Tychsen donpedro@tdcadsl.dk Date: Thu Nov 13 04:02:42 2008 +0100
winedos: Implement mode control register, and the 160x200x4 display mode that it opens.
---
dlls/winedos/vga.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 90 insertions(+), 4 deletions(-)
diff --git a/dlls/winedos/vga.c b/dlls/winedos/vga.c index 772038c..5d4dcca 100644 --- a/dlls/winedos/vga.c +++ b/dlls/winedos/vga.c @@ -101,7 +101,9 @@ static int vga_fb_window_size; static char *vga_fb_window_data; static PALETTEENTRY *vga_fb_palette; static unsigned vga_fb_palette_index; +static unsigned vga_fb_palette_size; static BOOL vga_fb_bright; +static BOOL vga_fb_enabled;
/* * VGA text mode data. @@ -768,7 +770,7 @@ static void WINAPI VGA_DoSetMode(ULONG_PTR arg) return; }
- res=IDirectDrawPalette_SetEntries(lpddpal,0,0,4,vga_fb_palette); + res=IDirectDrawPalette_SetEntries(lpddpal,0,0,vga_fb_palette_size,vga_fb_palette); if (res != S_OK) { ERR("Could not set default palette entries (res = 0x%x)\n", res); } @@ -828,12 +830,25 @@ int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth) vga_fb_window_data = VGA_WINDOW_START; vga_fb_window_size = VGA_WINDOW_SIZE; vga_fb_palette = vga_def_palette; + vga_fb_palette_size = 256; } else { vga_fb_window_data = CGA_WINDOW_START; vga_fb_window_size = CGA_WINDOW_SIZE; - vga_fb_palette = cga_palette1; + if(Depth == 2) + { + /* Select default 2 bit CGA palette */ + vga_fb_palette = cga_palette1; + vga_fb_palette_size = 4; + } + else + { + /* Top of VGA palette is same as 4 bit CGA palette */ + vga_fb_palette = vga_def_palette; + vga_fb_palette_size = 16; + } + vga_fb_palette_index = 0; vga_fb_bright = 0; } @@ -1070,6 +1085,27 @@ void VGA_SetBright(BOOL bright) }
/********************************************************************** + * VGA_SetEnabled + * + * Select if output is enabled or disabled + * This is a property of the CGA controller + */ +void VGA_SetEnabled(BOOL enabled) +{ + TRACE("%i\n", enabled); + + /* Check if going from enabled to disabled */ + if(vga_fb_enabled == TRUE && enabled == FALSE) + { + /* Clear frame buffer */ + memset(vga_fb_window_data, 0x00, vga_fb_window_size); + } + + /* Remember the "enabled" value */ + vga_fb_enabled = enabled; +} + +/********************************************************************** * VGA_SetPaletteIndex * * Select the index of the palette which is currently in use @@ -1425,9 +1461,44 @@ static void VGA_Poll_Graphics(void) VGA_SyncWindow( TRUE );
/* - * CGA framebuffer + * CGA framebuffer (160x200) + * This buffer is encoded as following: + * - 4 bit pr. pixel, 2 pixels per byte + * - 80 bytes per row + * - Every second line has an offset of 8096 */ - if(vga_fb_depth == 2 && vga_fb_width == 320 && vga_fb_height == 200){ + if(vga_fb_depth == 4 && vga_fb_width == 160 && vga_fb_height == 200){ + WORD off = 0; + BYTE bits = 4; + BYTE value; + for(Y=0; Y<vga_fb_height; Y++, surf+=(Pitch*2)){ + for(X=0; X<vga_fb_width; X++){ + off = Y & 1 ? (8 * 1024) : 0; + off += (80 * (Y/2)); + off += X/2; + value = (dat[off] >> bits) & 0xF; + surf[(X*4)+0] = value; + surf[(X*4)+1] = value; + surf[(X*4)+2] = value; + surf[(X*4)+3] = value; + surf[(X*4)+Pitch+0] = value; + surf[(X*4)+Pitch+1] = value; + surf[(X*4)+Pitch+2] = value; + surf[(X*4)+Pitch+3] = value; + bits -= 4; + bits &= 7; + } + } + } + + /* + * CGA framebuffer (320x200) + * This buffer is encoded as following: + * - 2 bits per color, 4 pixels per byte + * - 80 bytes per row + * - Every second line has an offset of 8096 + */ + else if(vga_fb_depth == 2 && vga_fb_width == 320 && vga_fb_height == 200){ WORD off = 0; BYTE bits = 6; BYTE value; @@ -1605,6 +1676,21 @@ void VGA_ioport_out( WORD port, BYTE val ) FIXME("Unsupported index, VGA crt controller register 0x3b4/0x3d4: 0x%02x (value 0x%02x)\n", vga_index_3d4, val); break; + + /* Mode control register (CGA) */ + case 0x3d8: + + /* Detect 160x200, 16 color mode (composite) */ + if((val & 0x02) && (val & 0x10)) + { + /* Switch to 160x200x4 composite mode */ + VGA_SetMode(160, 200, 4); + } + + /* Set the enabled bit */ + VGA_SetEnabled((val & 0x08) && 1); + break; + /* Colour control register (CGA) */ case 0x3d9: /* Set bright */