#define NDEBUG
+#include "ntvdm.h"
#include "emulator.h"
#include "vga.h"
#include <bios/vidbios.h>
/* 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
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;
}
#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
}
#ifdef USE_REAL_REGISTERCONSOLEVDM
- if (CharBuff) HeapFree(GetProcessHeap(), 0, CharBuff);
+ if (CharBuff) RtlFreeHeap(RtlGetProcessHeap(), 0, CharBuff);
#endif
VgaUpdateCursorPosition();
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 */
{
/* 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
{
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;
}
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 */
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)
{
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 = max(min(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 */
PUCHAR BufPtr = (PUCHAR)Buffer;
DPRINT("VgaWriteMemory: Address 0x%08X, Size %lu\n", Address, Size);
- Address = max(min(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;