mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:42:57 +00:00
[NTVDM]
Make our VGA DAC behave like the cirrus one: palette changes do not apply until all 3 color components have been set. svn path=/trunk/; revision=68602
This commit is contained in:
parent
97b7898dfe
commit
702a0556a1
1 changed files with 35 additions and 16 deletions
|
@ -275,6 +275,8 @@ static BYTE VgaAcIndex = VGA_AC_PAL_0_REG;
|
||||||
static BYTE VgaAcRegisters[VGA_AC_MAX_REG];
|
static BYTE VgaAcRegisters[VGA_AC_MAX_REG];
|
||||||
|
|
||||||
static BYTE VgaDacMask = 0xFF;
|
static BYTE VgaDacMask = 0xFF;
|
||||||
|
static BYTE VgaDacLatchCounter = 0;
|
||||||
|
static BYTE VgaDacLatch[3];
|
||||||
|
|
||||||
static BOOLEAN VgaDacReadWrite = FALSE;
|
static BOOLEAN VgaDacReadWrite = FALSE;
|
||||||
static WORD VgaDacIndex = 0;
|
static WORD VgaDacIndex = 0;
|
||||||
|
@ -1571,15 +1573,24 @@ static BYTE WINAPI VgaReadPort(USHORT Port)
|
||||||
return (VgaDacReadWrite ? 0 : 3);
|
return (VgaDacReadWrite ? 0 : 3);
|
||||||
|
|
||||||
case VGA_DAC_WRITE_INDEX:
|
case VGA_DAC_WRITE_INDEX:
|
||||||
return (VgaDacIndex / 3);
|
return VgaDacIndex;
|
||||||
|
|
||||||
case VGA_DAC_DATA:
|
case VGA_DAC_DATA:
|
||||||
{
|
{
|
||||||
/* Ignore reads in write mode */
|
/* Ignore reads in write mode */
|
||||||
if (!VgaDacReadWrite)
|
if (!VgaDacReadWrite)
|
||||||
{
|
{
|
||||||
BYTE Data = VgaDacRegisters[VgaDacIndex++];
|
BYTE Data = VgaDacRegisters[VgaDacIndex * 3 + VgaDacLatchCounter];
|
||||||
VgaDacIndex %= VGA_PALETTE_SIZE;
|
VgaDacLatchCounter++;
|
||||||
|
|
||||||
|
if (VgaDacLatchCounter == 3)
|
||||||
|
{
|
||||||
|
/* Reset the latch counter and increment the palette index */
|
||||||
|
VgaDacLatchCounter = 0;
|
||||||
|
VgaDacIndex++;
|
||||||
|
VgaDacIndex %= VGA_MAX_COLORS;
|
||||||
|
}
|
||||||
|
|
||||||
return Data;
|
return Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1697,28 +1708,34 @@ static inline VOID VgaWriteCrtc(BYTE Data)
|
||||||
|
|
||||||
static inline VOID VgaWriteDac(BYTE Data)
|
static inline VOID VgaWriteDac(BYTE Data)
|
||||||
{
|
{
|
||||||
UINT i, PaletteIndex;
|
UINT i;
|
||||||
PALETTEENTRY Entry;
|
PALETTEENTRY Entry;
|
||||||
|
|
||||||
/* Set the value */
|
/* Store the value in the latch */
|
||||||
VgaDacRegisters[VgaDacIndex] = Data;
|
VgaDacLatch[VgaDacLatchCounter++] = Data;
|
||||||
|
if (VgaDacLatchCounter < 3) return;
|
||||||
|
|
||||||
/* Find the palette index */
|
/* Reset the latch counter */
|
||||||
PaletteIndex = VgaDacIndex / 3;
|
VgaDacLatchCounter = 0;
|
||||||
|
|
||||||
|
/* Set the DAC register values */
|
||||||
|
VgaDacRegisters[VgaDacIndex * 3] = VgaDacLatch[0];
|
||||||
|
VgaDacRegisters[VgaDacIndex * 3 + 1] = VgaDacLatch[1];
|
||||||
|
VgaDacRegisters[VgaDacIndex * 3 + 2] = VgaDacLatch[2];
|
||||||
|
|
||||||
/* Fill the entry structure */
|
/* Fill the entry structure */
|
||||||
Entry.peRed = VGA_DAC_TO_COLOR(VgaDacRegisters[PaletteIndex * 3]);
|
Entry.peRed = VGA_DAC_TO_COLOR(VgaDacLatch[0]);
|
||||||
Entry.peGreen = VGA_DAC_TO_COLOR(VgaDacRegisters[PaletteIndex * 3 + 1]);
|
Entry.peGreen = VGA_DAC_TO_COLOR(VgaDacLatch[1]);
|
||||||
Entry.peBlue = VGA_DAC_TO_COLOR(VgaDacRegisters[PaletteIndex * 3 + 2]);
|
Entry.peBlue = VGA_DAC_TO_COLOR(VgaDacLatch[2]);
|
||||||
Entry.peFlags = 0;
|
Entry.peFlags = 0;
|
||||||
|
|
||||||
/* Update the palette entry */
|
/* Update the palette entry */
|
||||||
SetPaletteEntries(PaletteHandle, PaletteIndex, 1, &Entry);
|
SetPaletteEntries(PaletteHandle, VgaDacIndex, 1, &Entry);
|
||||||
|
|
||||||
/* Check which text palette entries are affected */
|
/* Check which text palette entries are affected */
|
||||||
for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
|
for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
|
||||||
{
|
{
|
||||||
if (VgaAcRegisters[i] == PaletteIndex)
|
if (VgaAcRegisters[i] == VgaDacIndex)
|
||||||
{
|
{
|
||||||
/* Update the text palette entry */
|
/* Update the text palette entry */
|
||||||
SetPaletteEntries(TextPaletteHandle, i, 1, &Entry);
|
SetPaletteEntries(TextPaletteHandle, i, 1, &Entry);
|
||||||
|
@ -1730,7 +1747,7 @@ static inline VOID VgaWriteDac(BYTE Data)
|
||||||
|
|
||||||
/* Update the index */
|
/* Update the index */
|
||||||
VgaDacIndex++;
|
VgaDacIndex++;
|
||||||
VgaDacIndex %= VGA_PALETTE_SIZE;
|
VgaDacIndex %= VGA_MAX_COLORS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline VOID VgaWriteAc(BYTE Data)
|
static inline VOID VgaWriteAc(BYTE Data)
|
||||||
|
@ -1888,14 +1905,16 @@ static VOID WINAPI VgaWritePort(USHORT Port, BYTE Data)
|
||||||
case VGA_DAC_READ_INDEX:
|
case VGA_DAC_READ_INDEX:
|
||||||
{
|
{
|
||||||
VgaDacReadWrite = FALSE;
|
VgaDacReadWrite = FALSE;
|
||||||
VgaDacIndex = Data * 3;
|
VgaDacIndex = Data;
|
||||||
|
VgaDacLatchCounter = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case VGA_DAC_WRITE_INDEX:
|
case VGA_DAC_WRITE_INDEX:
|
||||||
{
|
{
|
||||||
VgaDacReadWrite = TRUE;
|
VgaDacReadWrite = TRUE;
|
||||||
VgaDacIndex = Data * 3;
|
VgaDacIndex = Data;
|
||||||
|
VgaDacLatchCounter = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue