Module: wine Branch: master Commit: db0a4b9c9b6fcfc5b7a5aef36ad970fcb011d39b URL: http://source.winehq.org/git/wine.git/?a=commit;h=db0a4b9c9b6fcfc5b7a5aef36a...
Author: Peter Dons Tychsen donpedro@tdcadsl.dk Date: Mon Nov 10 01:55:59 2008 +0100
winedos: Implement int10 CGA palette control.
---
dlls/winedos/int10.c | 22 +++++++++- dlls/winedos/vga.c | 105 +++++++++++++++++++++++++++++++++++++------------ dlls/winedos/vga.h | 3 + 3 files changed, 101 insertions(+), 29 deletions(-)
diff --git a/dlls/winedos/int10.c b/dlls/winedos/int10.c index c1ec98b..4132f58 100644 --- a/dlls/winedos/int10.c +++ b/dlls/winedos/int10.c @@ -1242,11 +1242,27 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context ) apparently, the foreground or attribute of the background with this call, so we should check first to see what the foreground already is... FIXME */ - FIXME("Set Background/Border Color: %d/%d\n", - BH_reg(context), BL_reg(context)); + + /* For CGA modes, background color change is the same as writing + to I/O address 0x3d9 bit 4 */ + if(data->VideoMode >= 4 && data->VideoMode <= 6) + { + VGA_SetBright((BL_reg(context) & 0x10) && 1); + VGA_UpdatePalette(); + } + else FIXME("Set Background/Border Color: %d/%d\n", + BH_reg(context), BL_reg(context)); break; case 0x01: /* SET PALETTE */ - FIXME("Set Palette - Not Supported\n"); + + /* For CGA modes, palette color change is the same as writing + to I/O address 0x3d9 bit 5 */ + if(data->VideoMode >= 4 && data->VideoMode <= 6) + { + VGA_SetPaletteIndex(BL_reg(context) & 1); + VGA_UpdatePalette(); + } + else FIXME("Set Palette - Not Supported: %02X\n", BL_reg(context)); break; default: FIXME("INT 10 AH = 0x0b BH = 0x%x - Unknown\n", diff --git a/dlls/winedos/vga.c b/dlls/winedos/vga.c index bc8bc85..f255994 100644 --- a/dlls/winedos/vga.c +++ b/dlls/winedos/vga.c @@ -100,6 +100,8 @@ static int vga_fb_window = 0; static int vga_fb_window_size; static char *vga_fb_window_data; static PALETTEENTRY *vga_fb_palette; +static unsigned vga_fb_palette_index; +static BOOL vga_fb_bright;
/* * VGA text mode data. @@ -196,7 +198,7 @@ static PALETTEENTRY cga_palette2[] = { {0x00, 0x00, 0x00}, /* 0 - Black */ {0x00, 0xAA, 0x00}, /* 1 - Green */ {0xAA, 0x00, 0x00}, /* 2 - Red */ - {0xAA, 0x55, 0xFF} /* 3 - Brown */ + {0xAA, 0x55, 0x00} /* 3 - Brown */ };
/* @@ -832,6 +834,8 @@ int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth) vga_fb_window_data = CGA_WINDOW_START; vga_fb_window_size = CGA_WINDOW_SIZE; vga_fb_palette = cga_palette1; + vga_fb_palette_index = 0; + vga_fb_bright = 0; }
/* Clean the HW buffer */ @@ -1012,6 +1016,73 @@ void VGA_ShowMouse( BOOL show ) MZ_RunInThread( VGA_DoShowMouse, (ULONG_PTR)show ); }
+ +/********************************************************************** + * VGA_UpdatePalette + * + * Update the current palette + * + * Note: When updating the current CGA palette, palette index 0 + * refers to palette2, and index 1 is palette1 (default palette) + */ +void VGA_UpdatePalette(void) +{ + /* Figure out which palette is used now */ + if(vga_fb_bright == TRUE) + { + if(vga_fb_palette_index == 0) + { + vga_fb_palette = cga_palette2_bright; + } + else if(vga_fb_palette_index == 1) + { + vga_fb_palette = cga_palette1_bright; + } + } + else + { + if(vga_fb_palette_index == 0) + { + vga_fb_palette = cga_palette2; + } + else if(vga_fb_palette_index == 1) + { + vga_fb_palette = cga_palette1; + } + } + + /* Now update the palette */ + VGA_SetPalette(vga_fb_palette,0,4); +} + +/********************************************************************** + * VGA_SetBright + * + * Select if using a "bright" palette or not. + * This is a property of the CGA controller + */ +void VGA_SetBright(BOOL bright) +{ + TRACE("%i\n", bright); + + /* Remember the "bright" value used by the CGA controller */ + vga_fb_bright = bright; +} + +/********************************************************************** + * VGA_SetPaletteIndex + * + * Select the index of the palette which is currently in use + * This is a property of the CGA controller + */ +void VGA_SetPaletteIndex(unsigned index) +{ + TRACE("%i\n", index); + + /* Remember the palette index, which is only used by CGA for now */ + vga_fb_palette_index = index; +} + /*** TEXT MODE ***/
/* prepare the text mode video memory copy that is used to only @@ -1505,32 +1576,14 @@ void VGA_ioport_out( WORD port, BYTE 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; - } - } + /* Set bright */ + VGA_SetBright((val & 0x10) && 1);
- /* Check for "deselect palette1" */ - if(val & 0x20) - { - if(vga_fb_palette == cga_palette1) - { - VGA_SetPalette(cga_palette2,0,4); - vga_fb_palette = cga_palette2; - } - } + /* Set palette index */ + VGA_SetPaletteIndex((val & 0x20) && 1); + + /* Now update the palette */ + VGA_UpdatePalette(); break; default: FIXME("Unsupported VGA register: 0x%04x (value 0x%02x)\n", port, val); diff --git a/dlls/winedos/vga.h b/dlls/winedos/vga.h index e417388..60444a9 100644 --- a/dlls/winedos/vga.h +++ b/dlls/winedos/vga.h @@ -39,6 +39,9 @@ void VGA_SetQuadPalette(RGBQUAD*color,int start,int len); void VGA_SetWindowStart(int start); int VGA_GetWindowStart(void); void VGA_ShowMouse(BOOL show); +void VGA_UpdatePalette(void); +void VGA_SetPaletteIndex(unsigned index); +void VGA_SetBright(BOOL bright);
/* text mode */ void VGA_InitAlphaMode(unsigned*Xres,unsigned*Yres);