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