X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fsubsystems%2Fmvdm%2Fntvdm%2Fhardware%2Fvideo%2Fvga.c;h=c3e0c1943fcdf15593023d5f6d38fd05a96d2367;hp=079499c33b52e5501d4477e535ce4f1164e0fdab;hb=866f04e3776d4f1e2ec342b0abde7ea6494675aa;hpb=6381155e6c2c4596076509536fbdc124dfb93694 diff --git a/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c b/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c index 079499c33b5..c3e0c1943fc 100644 --- a/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c +++ b/reactos/subsystems/mvdm/ntvdm/hardware/video/vga.c @@ -10,6 +10,7 @@ #define NDEBUG +#include "ntvdm.h" #include "emulator.h" #include "vga.h" #include @@ -21,7 +22,7 @@ /* PRIVATE VARIABLES **********************************************************/ static CONST DWORD MemoryBase[] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 }; -static CONST DWORD MemoryLimit[] = { 0xAFFFF, 0xAFFFF, 0xB7FFF, 0xBFFFF }; +static CONST DWORD MemoryLimit[] = { 0xBFFFF, 0xAFFFF, 0xB7FFF, 0xBFFFF }; /* * Activate this line if you want to use the real @@ -356,26 +357,26 @@ __RegisterConsoleVDM(IN DWORD dwRegisterFlags, VDMBufferSize = dwVDMBufferSize; /* HACK: Cache -- to be removed in the real implementation */ - CharBuff = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - VDMBufferSize.X * VDMBufferSize.Y - * sizeof(CHAR_INFO)); + CharBuff = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + VDMBufferSize.X * VDMBufferSize.Y + * sizeof(*CharBuff)); ASSERT(CharBuff); - VDMBuffer = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - VDMBufferSize.X * VDMBufferSize.Y - * sizeof(CHAR_CELL)); + VDMBuffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + VDMBufferSize.X * VDMBufferSize.Y + * sizeof(*VDMBuffer)); *lpVDMBuffer = VDMBuffer; return (VDMBuffer != NULL); } else { /* HACK: Cache -- to be removed in the real implementation */ - if (CharBuff) HeapFree(GetProcessHeap(), 0, CharBuff); + if (CharBuff) RtlFreeHeap(RtlGetProcessHeap(), 0, CharBuff); CharBuff = NULL; - if (VDMBuffer) HeapFree(GetProcessHeap(), 0, VDMBuffer); + if (VDMBuffer) RtlFreeHeap(RtlGetProcessHeap(), 0, VDMBuffer); VDMBuffer = NULL; VDMBufferSize.X = VDMBufferSize.Y = 0; @@ -500,10 +501,10 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution) } #ifdef USE_REAL_REGISTERCONSOLEVDM - CharBuff = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - TextResolution.X * TextResolution.Y - * sizeof(CHAR_INFO)); + CharBuff = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + TextResolution.X * TextResolution.Y + * sizeof(*CharBuff)); ASSERT(CharBuff); #endif @@ -568,7 +569,7 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution) } #ifdef USE_REAL_REGISTERCONSOLEVDM - if (CharBuff) HeapFree(GetProcessHeap(), 0, CharBuff); + if (CharBuff) RtlFreeHeap(RtlGetProcessHeap(), 0, CharBuff); #endif VgaUpdateCursorPosition(); @@ -621,7 +622,7 @@ static inline DWORD VgaGetAddressSize(VOID) static inline DWORD VgaTranslateReadAddress(DWORD Address) { - DWORD Offset = Address - VgaGetVideoBaseAddress(); + DWORD Offset = LOWORD(Address - VgaGetVideoBaseAddress()); BYTE Plane; /* Check for chain-4 and odd-even mode */ @@ -629,13 +630,13 @@ static inline DWORD VgaTranslateReadAddress(DWORD Address) { /* The lowest two bits are the plane number */ Plane = Offset & 0x03; - Offset >>= 2; + Offset &= ~3; } else if (VgaGcRegisters[VGA_GC_MODE_REG] & VGA_GC_MODE_OE) { /* The LSB is the plane number */ Plane = Offset & 0x01; - Offset >>= 1; + Offset &= ~1; } else { @@ -643,31 +644,27 @@ static inline DWORD VgaTranslateReadAddress(DWORD Address) Plane = VgaGcRegisters[VGA_GC_READ_MAP_SEL_REG] & 0x03; } - /* Multiply the offset by the address size */ - Offset *= VgaGetAddressSize(); - - return Offset + Plane * VGA_BANK_SIZE; + /* Return the offset on plane 0 for read mode 1 */ + if (VgaGcRegisters[VGA_GC_MODE_REG] & VGA_GC_MODE_READ) return Offset; + else return Offset + Plane * VGA_BANK_SIZE; } static inline DWORD VgaTranslateWriteAddress(DWORD Address) { - DWORD Offset = Address - VgaGetVideoBaseAddress(); + DWORD Offset = LOWORD(Address - VgaGetVideoBaseAddress()); /* Check for chain-4 and odd-even mode */ if (VgaSeqRegisters[VGA_SEQ_MEM_REG] & VGA_SEQ_MEM_C4) { - /* Shift the offset to the right by 2 */ - Offset >>= 2; + /* Clear the lowest two bits since they're used to select the bank */ + Offset &= ~3; } else if (VgaGcRegisters[VGA_GC_MODE_REG] & VGA_GC_MODE_OE) { - /* Shift the offset to the right by 1 */ - Offset >>= 1; + /* Clear the lowest bit since it's used to select odd/even */ + Offset &= ~1; } - /* Multiply the offset by the address size */ - Offset *= VgaGetAddressSize(); - /* Return the offset on plane 0 */ return Offset; } @@ -779,14 +776,14 @@ static BOOLEAN VgaInitializePalette(VOID) LPLOGPALETTE Palette, TextPalette; /* Allocate storage space for the palettes */ - Palette = (LPLOGPALETTE)HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(LOGPALETTE) + - VGA_MAX_COLORS * sizeof(PALETTEENTRY)); - TextPalette = (LPLOGPALETTE)HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(LOGPALETTE) + - (VGA_AC_PAL_F_REG + 1) * sizeof(PALETTEENTRY)); + Palette = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(LOGPALETTE) + + VGA_MAX_COLORS * sizeof(PALETTEENTRY)); + TextPalette = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(LOGPALETTE) + + (VGA_AC_PAL_F_REG + 1) * sizeof(PALETTEENTRY)); if ((Palette == NULL) || (TextPalette == NULL)) goto Cleanup; /* Initialize the palettes */ @@ -819,8 +816,8 @@ static BOOLEAN VgaInitializePalette(VOID) Cleanup: /* Free the palettes */ - if (Palette) HeapFree(GetProcessHeap(), 0, Palette); - if (TextPalette) HeapFree(GetProcessHeap(), 0, TextPalette); + if (Palette) RtlFreeHeap(RtlGetProcessHeap(), 0, Palette); + if (TextPalette) RtlFreeHeap(RtlGetProcessHeap(), 0, TextPalette); if (!Result) { @@ -1905,24 +1902,56 @@ VOID VgaRefreshDisplay(VOID) VOID NTAPI VgaReadMemory(ULONG Address, PVOID Buffer, ULONG Size) { - DWORD i; + DWORD i, j; DWORD VideoAddress; PUCHAR BufPtr = (PUCHAR)Buffer; DPRINT("VgaReadMemory: Address 0x%08X, Size %lu\n", Address, Size); - Address = min(max(Address, VgaGetVideoLimitAddress() - 1), VgaGetVideoBaseAddress()); - Size = min(Size, VgaGetVideoLimitAddress() - Address + 1); /* Ignore if video RAM access is disabled */ if ((VgaMiscRegister & VGA_MISC_RAM_ENABLED) == 0) return; - /* Loop through each byte */ - for (i = 0; i < Size; i++) + if (!(VgaGcRegisters[VGA_GC_MODE_REG] & VGA_GC_MODE_READ)) + { + /* Loop through each byte */ + for (i = 0; i < Size; i++) + { + VideoAddress = VgaTranslateReadAddress(Address + i); + + /* Copy the value to the buffer */ + BufPtr[i] = VgaMemory[VideoAddress]; + } + } + else { - VideoAddress = VgaTranslateReadAddress(Address + i); + /* Loop through each byte */ + for (i = 0; i < Size; i++) + { + BYTE Result = 0xFF; - /* Copy the value to the buffer */ - BufPtr[i] = VgaMemory[VideoAddress]; + /* This should always return a plane 0 address for read mode 1 */ + VideoAddress = VgaTranslateReadAddress(Address + i); + + for (j = 0; j < VGA_NUM_BANKS; j++) + { + /* Don't consider ignored banks */ + if (!(VgaGcRegisters[VGA_GC_COLOR_IGNORE_REG] & (1 << j))) continue; + + if (VgaGcRegisters[VGA_GC_COLOR_COMPARE_REG] & (1 << j)) + { + /* Comparing with 11111111 */ + Result &= VgaMemory[j * VGA_BANK_SIZE + LOWORD(VideoAddress)]; + } + else + { + /* Comparing with 00000000 */ + Result &= ~(VgaMemory[j * VGA_BANK_SIZE + LOWORD(VideoAddress)]); + } + } + + /* Copy the value to the buffer */ + BufPtr[i] = Result; + } } /* Load the latch registers */ @@ -1939,8 +1968,6 @@ BOOLEAN NTAPI VgaWriteMemory(ULONG Address, PVOID Buffer, ULONG Size) PUCHAR BufPtr = (PUCHAR)Buffer; DPRINT("VgaWriteMemory: Address 0x%08X, Size %lu\n", Address, Size); - Address = min(max(Address, VgaGetVideoLimitAddress() - 1), VgaGetVideoBaseAddress()); - Size = min(Size, VgaGetVideoLimitAddress() - Address + 1); /* Ignore if video RAM access is disabled */ if ((VgaMiscRegister & VGA_MISC_RAM_ENABLED) == 0) return TRUE;