winedos: Implement int10 CGA palette control.
This commit is contained in:
parent
49ad04c1f7
commit
db0a4b9c9b
|
@ -1242,11 +1242,27 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
|
||||||
apparently, the foreground or attribute of the background
|
apparently, the foreground or attribute of the background
|
||||||
with this call, so we should check first to see what the
|
with this call, so we should check first to see what the
|
||||||
foreground already is... FIXME */
|
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;
|
break;
|
||||||
case 0x01: /* SET PALETTE */
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("INT 10 AH = 0x0b BH = 0x%x - Unknown\n",
|
FIXME("INT 10 AH = 0x0b BH = 0x%x - Unknown\n",
|
||||||
|
|
|
@ -100,6 +100,8 @@ static int vga_fb_window = 0;
|
||||||
static int vga_fb_window_size;
|
static int vga_fb_window_size;
|
||||||
static char *vga_fb_window_data;
|
static char *vga_fb_window_data;
|
||||||
static PALETTEENTRY *vga_fb_palette;
|
static PALETTEENTRY *vga_fb_palette;
|
||||||
|
static unsigned vga_fb_palette_index;
|
||||||
|
static BOOL vga_fb_bright;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VGA text mode data.
|
* VGA text mode data.
|
||||||
|
@ -196,7 +198,7 @@ static PALETTEENTRY cga_palette2[] = {
|
||||||
{0x00, 0x00, 0x00}, /* 0 - Black */
|
{0x00, 0x00, 0x00}, /* 0 - Black */
|
||||||
{0x00, 0xAA, 0x00}, /* 1 - Green */
|
{0x00, 0xAA, 0x00}, /* 1 - Green */
|
||||||
{0xAA, 0x00, 0x00}, /* 2 - Red */
|
{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_data = CGA_WINDOW_START;
|
||||||
vga_fb_window_size = CGA_WINDOW_SIZE;
|
vga_fb_window_size = CGA_WINDOW_SIZE;
|
||||||
vga_fb_palette = cga_palette1;
|
vga_fb_palette = cga_palette1;
|
||||||
|
vga_fb_palette_index = 0;
|
||||||
|
vga_fb_bright = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clean the HW buffer */
|
/* Clean the HW buffer */
|
||||||
|
@ -1012,6 +1016,73 @@ void VGA_ShowMouse( BOOL show )
|
||||||
MZ_RunInThread( VGA_DoShowMouse, (ULONG_PTR)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 ***/
|
/*** TEXT MODE ***/
|
||||||
|
|
||||||
/* prepare the text mode video memory copy that is used to only
|
/* 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;
|
break;
|
||||||
/* Colour control register (CGA) */
|
/* Colour control register (CGA) */
|
||||||
case 0x3d9:
|
case 0x3d9:
|
||||||
/* Check for "switch to bright" */
|
/* Set bright */
|
||||||
if(val & 0x10)
|
VGA_SetBright((val & 0x10) && 1);
|
||||||
{
|
|
||||||
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" */
|
/* Set palette index */
|
||||||
if(val & 0x20)
|
VGA_SetPaletteIndex((val & 0x20) && 1);
|
||||||
{
|
|
||||||
if(vga_fb_palette == cga_palette1)
|
/* Now update the palette */
|
||||||
{
|
VGA_UpdatePalette();
|
||||||
VGA_SetPalette(cga_palette2,0,4);
|
|
||||||
vga_fb_palette = cga_palette2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("Unsupported VGA register: 0x%04x (value 0x%02x)\n", port, val);
|
FIXME("Unsupported VGA register: 0x%04x (value 0x%02x)\n", port, val);
|
||||||
|
|
|
@ -39,6 +39,9 @@ void VGA_SetQuadPalette(RGBQUAD*color,int start,int len);
|
||||||
void VGA_SetWindowStart(int start);
|
void VGA_SetWindowStart(int start);
|
||||||
int VGA_GetWindowStart(void);
|
int VGA_GetWindowStart(void);
|
||||||
void VGA_ShowMouse(BOOL show);
|
void VGA_ShowMouse(BOOL show);
|
||||||
|
void VGA_UpdatePalette(void);
|
||||||
|
void VGA_SetPaletteIndex(unsigned index);
|
||||||
|
void VGA_SetBright(BOOL bright);
|
||||||
|
|
||||||
/* text mode */
|
/* text mode */
|
||||||
void VGA_InitAlphaMode(unsigned*Xres,unsigned*Yres);
|
void VGA_InitAlphaMode(unsigned*Xres,unsigned*Yres);
|
||||||
|
|
Loading…
Reference in New Issue