Peter Dons Tychsen : winedos: Add support for the Color Control Register ( CGA).

Alexandre Julliard julliard at winehq.org
Mon Nov 10 07:44:01 CST 2008


Module: wine
Branch: master
Commit: 49ad04c1f79bc987711bc23e1589eed7dfbddbb0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=49ad04c1f79bc987711bc23e1589eed7dfbddbb0

Author: Peter Dons Tychsen <donpedro at tdcadsl.dk>
Date:   Sun Nov  9 18:29:41 2008 +0100

winedos: Add support for the Color Control Register (CGA).

---

 dlls/winedos/vga.c |   80 +++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 70 insertions(+), 10 deletions(-)

diff --git a/dlls/winedos/vga.c b/dlls/winedos/vga.c
index 6a94d32..bc8bc85 100644
--- a/dlls/winedos/vga.c
+++ b/dlls/winedos/vga.c
@@ -99,6 +99,7 @@ static char *vga_fb_data = 0;
 static int   vga_fb_window = 0;
 static int   vga_fb_window_size;
 static char *vga_fb_window_data;
+static PALETTEENTRY *vga_fb_palette;
 
 /*
  * VGA text mode data.
@@ -171,9 +172,43 @@ static HWND vga_hwnd = NULL;
  */
 static PALETTEENTRY cga_palette1[] = {
   {0x00, 0x00, 0x00}, /* 0 - Black */
-  {0x00, 0x80, 0x80}, /* 1 - Cyan */
-  {0x80, 0x00, 0x80}, /* 2 - Magenta */
-  {0xFF, 0xFF, 0xFF}  /* 3 - White */
+  {0x00, 0xAA, 0xAA}, /* 1 - Cyan */
+  {0xAA, 0x00, 0xAA}, /* 2 - Magenta */
+  {0xAA, 0xAA, 0xAA}  /* 3 - White */
+};
+
+/*
+ * CGA palette 1 in the bright variant
+ * intensities, when signalled to do so
+ * in register 0x3d9
+ */
+static PALETTEENTRY cga_palette1_bright[] = {
+  {0x00, 0x00, 0x00}, /* 0 - Black */
+  {0x55, 0xFF, 0xFF}, /* 1 - Light cyan */
+  {0xFF, 0x55, 0xFF}, /* 2 - Light magenta */
+  {0xFF, 0xFF, 0xFF}, /* 3 - Bright White */
+};
+
+/*
+ * CGA palette 2
+ */
+static PALETTEENTRY cga_palette2[] = {
+  {0x00, 0x00, 0x00}, /* 0 - Black */
+  {0x00, 0xAA, 0x00}, /* 1 - Green */
+  {0xAA, 0x00, 0x00}, /* 2 - Red */
+  {0xAA, 0x55, 0xFF}  /* 3 - Brown */
+};
+
+/*
+ * CGA palette 2 in the bright variant
+ * intensities, when signalled to do so
+ * in register 0x3d9
+ */
+static PALETTEENTRY cga_palette2_bright[] = {
+  {0x00, 0x00, 0x00}, /* 0 - Black */
+  {0x55, 0xFF, 0x55}, /* 1 - Light green */
+  {0xFF, 0x55, 0x55}, /* 2 - Light red */
+  {0xFF, 0xFF, 0x55}, /* 3 - Yellow */
 };
 
 /*
@@ -731,12 +766,7 @@ static void WINAPI VGA_DoSetMode(ULONG_PTR arg)
             return;
         }
 
-        if(vga_fb_depth == 2){
-          res=IDirectDrawPalette_SetEntries(lpddpal,0,0,4,cga_palette1);
-        }
-        else{
-          res=IDirectDrawPalette_SetEntries(lpddpal,0,0,256,vga_def_palette);
-        }
+        res=IDirectDrawPalette_SetEntries(lpddpal,0,0,4,vga_fb_palette);
         if (res != S_OK) {
            ERR("Could not set default palette entries (res = 0x%x)\n", res);
         }
@@ -795,11 +825,13 @@ 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;
     }
     else
     {
       vga_fb_window_data = CGA_WINDOW_START;
       vga_fb_window_size = CGA_WINDOW_SIZE;
+      vga_fb_palette = cga_palette1;
     }
 
     /* Clean the HW buffer */
@@ -980,7 +1012,6 @@ void VGA_ShowMouse( BOOL show )
         MZ_RunInThread( VGA_DoShowMouse, (ULONG_PTR)show );
 }
 
-
 /*** TEXT MODE ***/
 
 /* prepare the text mode video memory copy that is used to only
@@ -1472,6 +1503,35 @@ 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;
+        /* Colour control register (CGA) */
+        case 0x3d9:
+           /* Check for "switch to bright" */
+           if(val & 0x10)
+	   {
+             if(vga_fb_palette == cga_palette1)
+             {
+               /* Switch to palette 1 bright version */
+               VGA_SetPalette(cga_palette1_bright,0,4);
+               vga_fb_palette = cga_palette1_bright;
+             }
+             else if(vga_fb_palette == cga_palette2)
+	     {
+               /* Switch to palette 2 bright version */
+               VGA_SetPalette(cga_palette2_bright,0,4);
+               vga_fb_palette = cga_palette2_bright;
+             }
+           }
+
+           /* Check for "deselect palette1" */
+           if(val & 0x20)
+	   {
+             if(vga_fb_palette == cga_palette1)
+             {
+               VGA_SetPalette(cga_palette2,0,4);
+               vga_fb_palette = cga_palette2;
+             }
+           }
+           break;
         default:
             FIXME("Unsupported VGA register: 0x%04x (value 0x%02x)\n", port, val);
     }




More information about the wine-cvs mailing list