From e7339745af58e1b21da2fc20e9551cac4857a7b5 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Thu, 25 Aug 2016 03:01:18 +0000 Subject: [PATCH] [NTVDM:BIOS] Implement VBE function AH = 0x05, "CPU Video Memory Control". svn path=/trunk/; revision=72451 --- .../subsystems/mvdm/ntvdm/bios/bios32/vbe.c | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c b/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c index 574c8e6775d..a006850b47e 100644 --- a/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c +++ b/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c @@ -525,6 +525,53 @@ VOID WINAPI VbeService(LPWORD Stack) break; } + /* CPU Video Memory Control */ + case 0x05: + { + BYTE Window = getBL(); + BYTE OldGcIndex = IOReadB(VGA_GC_INDEX); + + switch (getBH()) + { + /* Select Memory Window */ + case 0: + { + setAL(0x4F); + + if (getDH() != 0) + { + /* Offset too high */ + setAH(1); + break; + } + + IOWriteB(VGA_GC_INDEX, (Window == 0) ? SVGA_GC_OFFSET_0_REG : SVGA_GC_OFFSET_1_REG); + IOWriteB(VGA_GC_DATA, getDL()); + + setAH(0); + break; + } + + /* Return Memory Window */ + case 1: + { + IOWriteB(VGA_GC_INDEX, (Window == 0) ? SVGA_GC_OFFSET_0_REG : SVGA_GC_OFFSET_1_REG); + setDX(IOReadB(VGA_GC_DATA)); + + setAX(0x004F); + break; + } + + default: + { + DPRINT("VESA INT 0x10, AH = 0x05, Unknown subfunction: %02X", getBH()); + } + } + + IOWriteB(VGA_GC_INDEX, OldGcIndex); + break; + } + default: { DPRINT1("VESA BIOS Extensions function %02Xh NOT IMPLEMENTED!\n", getAL());