}
}
-static VOID NTAPI EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
+static VOID FASTCALL EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
{
ULONG i;
ULONG RelativeAddress = Address - TO_LINEAR(EMS_SEGMENT, 0);
}
}
-static BOOLEAN NTAPI EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
+static BOOLEAN FASTCALL EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
{
ULONG i;
ULONG RelativeAddress = Address - TO_LINEAR(EMS_SEGMENT, 0);
/* PRIVATE VARIABLES **********************************************************/
-static CONST DWORD MemoryBase[] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
-static CONST DWORD MemoryLimit[] = { 0xBFFFF, 0xAFFFF, 0xB7FFF, 0xBFFFF };
+static CONST DWORD MemoryBase[] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
+static CONST DWORD MemorySize[] = { 0x20000, 0x10000, 0x8000, 0x8000 };
/*
* Activate this line if you want to use the real
return MemoryBase[(VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03];
}
-static inline DWORD VgaGetVideoLimitAddress(VOID)
-{
- return MemoryLimit[(VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03];
-}
-
static VOID VgaUpdateCursorPosition(VOID)
{
/*
{
case VGA_GC_MISC_REG:
{
+ /* Remove any existing VGA memory hook */
+ MemRemoveFastMemoryHook((PVOID)0xA0000, 0x20000);
+
+ if (VgaMiscRegister & VGA_MISC_RAM_ENABLED)
+ {
+ UCHAR MemoryMap = (VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03;
+
+ /* Register a memory hook */
+ MemInstallFastMemoryHook((PVOID)MemoryBase[MemoryMap],
+ MemorySize[MemoryMap],
+ VgaReadMemory,
+ VgaWriteMemory);
+ }
+
/* The GC misc register decides if it's text or graphics mode */
ModeChanged = TRUE;
break;
UnregisterIoPort(0x3DA); // VGA_INSTAT1_READ_COLOR, VGA_FEATURE_WRITE_COLOR
}
- // if (VgaMiscRegister & 0x02) { /* Enable RAM access */ } else { /* Disable RAM access */ }
+ /* Remove any existing VGA memory hook */
+ MemRemoveFastMemoryHook((PVOID)0xA0000, 0x20000);
+
+ if (VgaMiscRegister & VGA_MISC_RAM_ENABLED)
+ {
+ UCHAR MemoryMap = (VgaGcRegisters[VGA_GC_MISC_REG] >> 2) & 0x03;
+
+ /* Register a memory hook */
+ MemInstallFastMemoryHook((PVOID)MemoryBase[MemoryMap],
+ MemorySize[MemoryMap],
+ VgaReadMemory,
+ VgaWriteMemory);
+ }
+
break;
}
VgaVerticalRetrace(0);
}
-VOID NTAPI VgaReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
+VOID FASTCALL VgaReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
{
DWORD i, j;
DWORD VideoAddress;
VgaLatchRegisters[3] = VgaMemory[(3 * VGA_BANK_SIZE) + LOWORD(VideoAddress)];
}
-BOOLEAN NTAPI VgaWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
+BOOLEAN FASTCALL VgaWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
{
DWORD i, j;
DWORD VideoAddress;
/* Clear the VGA memory */
VgaClearMemory();
-
- /* Register the memory hook */
- MemInstallFastMemoryHook((PVOID)0xA0000, 0x20000, VgaReadMemory, VgaWriteMemory);
/* Register the I/O Ports */
RegisterIoPort(0x3CC, VgaReadPort, NULL); // VGA_MISC_READ