mirror of
https://github.com/reactos/reactos.git
synced 2024-08-01 17:11:35 +00:00
[NTVDM]
Fix CGA emulation in shift interleave mode. CORE-8177 #comment Possibly fixed. Can you redo your tests with r63199? svn path=/trunk/; revision=63199
This commit is contained in:
parent
0ef1e2610a
commit
ef8bb583c9
|
@ -1146,6 +1146,8 @@ static VOID VgaUpdateFramebuffer(VOID)
|
||||||
/* Loop through the scanlines */
|
/* Loop through the scanlines */
|
||||||
for (i = 0; i < Resolution.Y; i++)
|
for (i = 0; i < Resolution.Y; i++)
|
||||||
{
|
{
|
||||||
|
BOOL RepeatScanline = FALSE;
|
||||||
|
|
||||||
/* Loop through the pixels */
|
/* Loop through the pixels */
|
||||||
for (j = 0; j < Resolution.X; j++)
|
for (j = 0; j < Resolution.X; j++)
|
||||||
{
|
{
|
||||||
|
@ -1199,10 +1201,23 @@ static VOID VgaUpdateFramebuffer(VOID)
|
||||||
* 2 bits shifted from plane 0 and 2 for the first 4 pixels,
|
* 2 bits shifted from plane 0 and 2 for the first 4 pixels,
|
||||||
* then 2 bits shifted from plane 1 and 3 for the next 4
|
* then 2 bits shifted from plane 1 and 3 for the next 4
|
||||||
*/
|
*/
|
||||||
BYTE LowPlaneData = VgaMemory[((j / 4) % 2) * VGA_BANK_SIZE
|
DWORD BankNumber = (j / 4) % 2;
|
||||||
+ (Address + (j / 8)) * AddressSize];
|
DWORD Offset = Address + (j / 8);
|
||||||
BYTE HighPlaneData = VgaMemory[(((j / 4) % 2) + 2) * VGA_BANK_SIZE
|
BYTE LowPlaneData, HighPlaneData;
|
||||||
+ (Address + (j / 8)) * AddressSize];
|
|
||||||
|
if (i % 2 == 0)
|
||||||
|
{
|
||||||
|
/* Odd-numbered line - add the CGA emulation offset */
|
||||||
|
Offset += VGA_CGA_ODD_LINE_OFFSET;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Even-numbered line - use the same scanline */
|
||||||
|
RepeatScanline = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LowPlaneData = VgaMemory[BankNumber * VGA_BANK_SIZE + Offset * AddressSize];
|
||||||
|
HighPlaneData = VgaMemory[(BankNumber + 2) * VGA_BANK_SIZE + Offset * AddressSize];
|
||||||
|
|
||||||
/* Extract the two bits from each plane */
|
/* Extract the two bits from each plane */
|
||||||
LowPlaneData = (LowPlaneData >> (6 - ((j % 4) * 2))) & 3;
|
LowPlaneData = (LowPlaneData >> (6 - ((j % 4) * 2))) & 3;
|
||||||
|
@ -1296,7 +1311,7 @@ static VOID VgaUpdateFramebuffer(VOID)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move to the next scanline */
|
/* Move to the next scanline */
|
||||||
Address += ScanlineSize;
|
if (!RepeatScanline) Address += ScanlineSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#define VGA_MINIMUM_HEIGHT 300
|
#define VGA_MINIMUM_HEIGHT 300
|
||||||
#define VGA_DAC_TO_COLOR(x) (((x) << 2) | ((x) >> 4))
|
#define VGA_DAC_TO_COLOR(x) (((x) << 2) | ((x) >> 4))
|
||||||
#define VGA_COLOR_TO_DAC(x) ((x) >> 2)
|
#define VGA_COLOR_TO_DAC(x) ((x) >> 2)
|
||||||
|
#define VGA_CGA_ODD_LINE_OFFSET 0x1000
|
||||||
|
|
||||||
|
|
||||||
/* Register I/O ports */
|
/* Register I/O ports */
|
||||||
|
|
Loading…
Reference in a new issue