mirror of
https://github.com/reactos/reactos.git
synced 2025-01-04 05:20:54 +00:00
- Only set up the registers that are needed for fading in the palette.
Fixes compatibility problems. svn path=/trunk/; revision=5850
This commit is contained in:
parent
0fb5176276
commit
c702fb192b
1 changed files with 46 additions and 93 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: bootvid.c,v 1.1 2003/08/24 12:11:13 dwelch Exp $
|
/* $Id: bootvid.c,v 1.2 2003/08/25 12:27:45 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#include "../../../ntoskrnl/include/internal/v86m.h"
|
#include "../../../ntoskrnl/include/internal/v86m.h"
|
||||||
|
|
||||||
#define NDEBUG
|
/*#define NDEBUG*/
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
#define RT_BITMAP 2
|
#define RT_BITMAP 2
|
||||||
|
@ -81,16 +81,6 @@ typedef struct {
|
||||||
#define ATTRIB 0x3c0
|
#define ATTRIB 0x3c0
|
||||||
#define STATUS 0x3da
|
#define STATUS 0x3da
|
||||||
|
|
||||||
typedef struct _VideoMode {
|
|
||||||
unsigned short VidSeg;
|
|
||||||
unsigned char Misc;
|
|
||||||
unsigned char Feature;
|
|
||||||
unsigned short Seq[6];
|
|
||||||
unsigned short Crtc[25];
|
|
||||||
unsigned short Gfx[9];
|
|
||||||
unsigned char Attrib[21];
|
|
||||||
} VideoMode;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ULONG r;
|
ULONG r;
|
||||||
ULONG g;
|
ULONG g;
|
||||||
|
@ -112,27 +102,11 @@ long y80[480];
|
||||||
static HANDLE BitmapThreadHandle;
|
static HANDLE BitmapThreadHandle;
|
||||||
static CLIENT_ID BitmapThreadId;
|
static CLIENT_ID BitmapThreadId;
|
||||||
static BOOLEAN BitmapIsDrawn;
|
static BOOLEAN BitmapIsDrawn;
|
||||||
static BOOLEAN BitmapThreadShouldTerminate;
|
|
||||||
static PUCHAR BootimageBitmap;
|
static PUCHAR BootimageBitmap;
|
||||||
static BOOLEAN InGraphicsMode = FALSE;
|
static BOOLEAN InGraphicsMode = FALSE;
|
||||||
|
|
||||||
/* DATA **********************************************************************/
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
static VideoMode Mode12 = {
|
|
||||||
0xa000, 0xe3, 0x00,
|
|
||||||
|
|
||||||
{0x03, 0x01, 0x0f, 0x00, 0x06 },
|
|
||||||
|
|
||||||
{0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e, 0x00, 0x40, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x59, 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
|
|
||||||
0xff},
|
|
||||||
|
|
||||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff},
|
|
||||||
|
|
||||||
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
|
|
||||||
0x0c, 0x0d, 0x0e, 0x0f, 0x81, 0x00, 0x0f, 0x00, 0x00}
|
|
||||||
};
|
|
||||||
|
|
||||||
static BOOLEAN VideoAddressSpaceInitialized = FALSE;
|
static BOOLEAN VideoAddressSpaceInitialized = FALSE;
|
||||||
static PVOID NonBiosBaseAddress;
|
static PVOID NonBiosBaseAddress;
|
||||||
static PDRIVER_OBJECT BootVidDriverObject = NULL;
|
static PDRIVER_OBJECT BootVidDriverObject = NULL;
|
||||||
|
@ -336,60 +310,13 @@ vgaPreCalc()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline__ VOID
|
|
||||||
InbvOutxay(PUSHORT ad, UCHAR x, UCHAR y)
|
|
||||||
{
|
|
||||||
USHORT xy = (x << 8) + y;
|
|
||||||
WRITE_PORT_USHORT(ad, xy);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
|
||||||
InbvSetMode(VideoMode mode)
|
|
||||||
{
|
|
||||||
unsigned char x;
|
|
||||||
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)MISC, mode.Misc);
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)STATUS, 0);
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)FEATURE, mode.Feature);
|
|
||||||
|
|
||||||
for(x=0; x<5; x++)
|
|
||||||
{
|
|
||||||
InbvOutxay((PUSHORT)SEQ, mode.Seq[x], x);
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE_PORT_USHORT((PUSHORT)CRTC, 0x11);
|
|
||||||
WRITE_PORT_USHORT((PUSHORT)CRTC, (mode.Crtc[0x11] & 0x7f));
|
|
||||||
|
|
||||||
for(x=0; x<25; x++)
|
|
||||||
{
|
|
||||||
InbvOutxay((PUSHORT)CRTC, mode.Crtc[x], x);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(x=0; x<9; x++)
|
|
||||||
{
|
|
||||||
InbvOutxay((PUSHORT)GRAPHICS, mode.Gfx[x], x);
|
|
||||||
}
|
|
||||||
|
|
||||||
x=READ_PORT_UCHAR((PUCHAR)FEATURE);
|
|
||||||
|
|
||||||
for(x=0; x<21; x++)
|
|
||||||
{
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, x);
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, mode.Attrib[x]);
|
|
||||||
}
|
|
||||||
|
|
||||||
x=READ_PORT_UCHAR((PUCHAR)STATUS);
|
|
||||||
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x20);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
InbvInitVGAMode(VOID)
|
InbvInitVGAMode(VOID)
|
||||||
{
|
{
|
||||||
KV86M_REGISTERS Regs;
|
KV86M_REGISTERS Regs;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
vidmem = (char *)(0xd0000000 + 0xa0000);
|
vidmem = (char *)(0xd0000000 + 0xa0000);
|
||||||
memset(&Regs, 0, sizeof(Regs));
|
memset(&Regs, 0, sizeof(Regs));
|
||||||
|
@ -397,8 +324,21 @@ InbvInitVGAMode(VOID)
|
||||||
Status = Ke386CallBios(0x10, &Regs);
|
Status = Ke386CallBios(0x10, &Regs);
|
||||||
assert(NT_SUCCESS(Status));
|
assert(NT_SUCCESS(Status));
|
||||||
|
|
||||||
/* Get VGA registers into the correct state (mainly for setting up the palette registers correctly) */
|
/* Get VGA registers into the correct state */
|
||||||
InbvSetMode(Mode12);
|
/* Reset the internal flip-flop. */
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
/* Write the 16 palette registers. */
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, i);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, i);
|
||||||
|
}
|
||||||
|
/* Write the mode control register - graphics mode; 16 color DAC. */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x10);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x81);
|
||||||
|
/* Write the color select register - select first 16 DAC registers. */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x14);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x00);
|
||||||
|
|
||||||
/* Get the VGA into the mode we want to work with */
|
/* Get the VGA into the mode we want to work with */
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08); /* Set */
|
WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08); /* Set */
|
||||||
|
@ -409,6 +349,9 @@ InbvInitVGAMode(VOID)
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08);
|
WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08);
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3cf,0xff);
|
WRITE_PORT_UCHAR((PUCHAR)0x3cf,0xff);
|
||||||
|
|
||||||
|
/* Set the PEL mask. */
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)0x3c6, 0xff);
|
||||||
|
|
||||||
/* Zero out video memory (clear a possibly trashed screen) */
|
/* Zero out video memory (clear a possibly trashed screen) */
|
||||||
RtlZeroMemory(vidmem, 64000);
|
RtlZeroMemory(vidmem, 64000);
|
||||||
|
|
||||||
|
@ -439,22 +382,28 @@ VidCleanUp(VOID)
|
||||||
reset to cleanup the hardware state.
|
reset to cleanup the hardware state.
|
||||||
*/
|
*/
|
||||||
InGraphicsMode = FALSE;
|
InGraphicsMode = FALSE;
|
||||||
|
|
||||||
BitmapThreadShouldTerminate = TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static __inline__ VOID
|
static __inline__ VOID
|
||||||
InbvSetColor(int cindex, unsigned char red, unsigned char green, unsigned char blue)
|
InbvSetColor(int cindex, unsigned char red, unsigned char green, unsigned char blue)
|
||||||
{
|
{
|
||||||
red = red / (256 / 64);
|
red = (red * 63) / 255;
|
||||||
green = green / (256 / 64);
|
green = (green * 63) / 255;
|
||||||
blue = blue / (256 / 64);
|
blue = (blue * 63) / 255;
|
||||||
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x03c8, cindex);
|
WRITE_PORT_UCHAR((PUCHAR)0x03c8, cindex);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x03c9, red);
|
WRITE_PORT_UCHAR((PUCHAR)0x03c9, red);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x03c9, green);
|
WRITE_PORT_UCHAR((PUCHAR)0x03c9, green);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x03c9, blue);
|
WRITE_PORT_UCHAR((PUCHAR)0x03c9, blue);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -463,10 +412,16 @@ InbvSetBlackPalette()
|
||||||
{
|
{
|
||||||
register ULONG r = 0;
|
register ULONG r = 0;
|
||||||
|
|
||||||
|
/* Disable screen and enable palette access. */
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x00);
|
||||||
for (r = 0; r < 16; r++)
|
for (r = 0; r < 16; r++)
|
||||||
{
|
{
|
||||||
InbvSetColor(r, 0, 0, 0);
|
InbvSetColor(r, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
/* Enable screen and enable palette access. */
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -686,6 +641,9 @@ InbvFadeUpPalette()
|
||||||
|
|
||||||
for (i = 0; i < PALETTE_FADE_STEPS; i++)
|
for (i = 0; i < PALETTE_FADE_STEPS; i++)
|
||||||
{
|
{
|
||||||
|
/* Disable screen and enable palette access. */
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x00);
|
||||||
for (c = 0; c < bminfo->bV5ClrUsed; c++)
|
for (c = 0; c < bminfo->bV5ClrUsed; c++)
|
||||||
{
|
{
|
||||||
/* Add the delta */
|
/* Add the delta */
|
||||||
|
@ -709,6 +667,10 @@ InbvFadeUpPalette()
|
||||||
/* Update the hardware */
|
/* Update the hardware */
|
||||||
InbvSetColor(c, r, g, b);
|
InbvSetColor(c, r, g, b);
|
||||||
}
|
}
|
||||||
|
/* Enable screen and disable palette access. */
|
||||||
|
(VOID)READ_PORT_UCHAR((PUCHAR)FEATURE);
|
||||||
|
WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x20);
|
||||||
|
/* Wait for a bit. */
|
||||||
Interval.QuadPart = -PALETTE_FADE_TIME;
|
Interval.QuadPart = -PALETTE_FADE_TIME;
|
||||||
KeDelayExecutionThread(KernelMode, FALSE, &Interval);
|
KeDelayExecutionThread(KernelMode, FALSE, &Interval);
|
||||||
}
|
}
|
||||||
|
@ -728,15 +690,6 @@ InbvBitmapThreadMain(PVOID Ignored)
|
||||||
}
|
}
|
||||||
|
|
||||||
BitmapIsDrawn = TRUE;
|
BitmapIsDrawn = TRUE;
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
if (BitmapThreadShouldTerminate)
|
|
||||||
{
|
|
||||||
DPRINT("Terminating\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ZwYieldExecution();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -764,7 +717,6 @@ VidInitialize(VOID)
|
||||||
InGraphicsMode = TRUE;
|
InGraphicsMode = TRUE;
|
||||||
|
|
||||||
BitmapIsDrawn = FALSE;
|
BitmapIsDrawn = FALSE;
|
||||||
BitmapThreadShouldTerminate = FALSE;
|
|
||||||
|
|
||||||
Status = PsCreateSystemThread(&BitmapThreadHandle,
|
Status = PsCreateSystemThread(&BitmapThreadHandle,
|
||||||
THREAD_ALL_ACCESS,
|
THREAD_ALL_ACCESS,
|
||||||
|
@ -777,6 +729,7 @@ VidInitialize(VOID)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
NtClose(BitmapThreadHandle);
|
||||||
|
|
||||||
InbvDeinitializeVideoAddressSpace();
|
InbvDeinitializeVideoAddressSpace();
|
||||||
VideoAddressSpaceInitialized = FALSE;
|
VideoAddressSpaceInitialized = FALSE;
|
||||||
|
|
Loading…
Reference in a new issue