Peter Dons Tychsen : winedos: Implement mode control register, and the 160x200x4 display mode that it opens.
Alexandre Julliard
julliard at winehq.org
Thu Nov 13 08:51:28 CST 2008
Module: wine
Branch: master
Commit: b627dd2afc1816c79ab4d9cfe9aecd4dd52ad5ab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b627dd2afc1816c79ab4d9cfe9aecd4dd52ad5ab
Author: Peter Dons Tychsen <donpedro at 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 */
More information about the wine-cvs
mailing list