From 81b5e2b655e44ce2ea06ebcc5c402c8f42d01dd9 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Tue, 30 Aug 2016 22:52:49 +0000 Subject: [PATCH] [NTVDM:BIOS] Implement VESA function AH = 07h. svn path=/trunk/; revision=72516 --- .../subsystems/mvdm/ntvdm/bios/bios32/vbe.c | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c b/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c index 5c63d5b9f9c..91956a5ad4e 100644 --- a/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c +++ b/reactos/subsystems/mvdm/ntvdm/bios/bios32/vbe.c @@ -653,6 +653,104 @@ VOID WINAPI VbeService(LPWORD Stack) break; } + /* Get/Set Display Start */ + case 0x07: + { + DWORD StartAddress; + BYTE Value; + PCVBE_MODE Mode = VbeGetModeByNumber(Bda->VideoMode); + BYTE OldCrtcIndex = IOReadB(VGA_CRTC_INDEX_COLOR); + + if (getBL() & 0x80) + { + /* Wait for a vertical retrace */ + if (!(IOReadB(VGA_INSTAT1_READ_COLOR) & VGA_STAT_VRETRACE)) + { + setCF(1); + break; + } + + setCF(0); + } + + switch (getBL() & 0x7F) + { + /* Set Display Start */ + case 0x00: + { + setAL(0x4F); + + if (Mode == NULL || Mode->Info == NULL) + { + /* This is not a VBE mode */ + // TODO: Support anyway, perhaps? It can be done. + setAH(0x01); + break; + } + + StartAddress = getCX() + getDX() * Mode->Info->BytesPerScanline; + + IOWriteB(VGA_CRTC_INDEX_COLOR, SVGA_CRTC_OVERLAY_REG); + Value = IOReadB(VGA_CRTC_DATA_COLOR); + Value &= ~SVGA_CRTC_EXT_ADDR_BIT19; + Value |= (StartAddress >> 12) & SVGA_CRTC_EXT_ADDR_BIT19; + IOWriteB(VGA_CRTC_DATA_COLOR, Value); + + IOWriteB(VGA_CRTC_INDEX_COLOR, SVGA_CRTC_EXT_DISPLAY_REG); + Value = IOReadB(VGA_CRTC_DATA_COLOR); + Value &= ~(SVGA_CRTC_EXT_ADDR_BIT16 | SVGA_CRTC_EXT_ADDR_BITS1718); + Value |= (StartAddress >> 16) & SVGA_CRTC_EXT_ADDR_BIT16; + Value |= (StartAddress >> 15) & SVGA_CRTC_EXT_ADDR_BITS1718; + IOWriteB(VGA_CRTC_DATA_COLOR, Value); + + IOWriteB(VGA_CRTC_INDEX_COLOR, VGA_CRTC_START_ADDR_HIGH_REG); + IOWriteB(VGA_CRTC_DATA_COLOR, (StartAddress >> 8) & 0xFF); + IOWriteB(VGA_CRTC_INDEX_COLOR, VGA_CRTC_START_ADDR_LOW_REG); + IOWriteB(VGA_CRTC_DATA_COLOR, StartAddress & 0xFF); + + setAH(0); + break; + } + + /* Get Display Start */ + case 0x01: + { + setAL(0x4F); + StartAddress = 0; + + if (Mode == NULL || Mode->Info == NULL) + { + /* This is not a VBE mode */ + // TODO: Support anyway, perhaps? It can be done. + setAH(0x01); + break; + } + + IOWriteB(VGA_CRTC_INDEX_COLOR, SVGA_CRTC_OVERLAY_REG); + StartAddress = (IOReadB(VGA_CRTC_DATA_COLOR) & SVGA_CRTC_EXT_ADDR_BIT19) << 12; + + IOWriteB(VGA_CRTC_INDEX_COLOR, SVGA_CRTC_EXT_DISPLAY_REG); + Value = IOReadB(VGA_CRTC_DATA_COLOR); + StartAddress |= (Value & SVGA_CRTC_EXT_ADDR_BIT16) << 16; + StartAddress |= (Value & SVGA_CRTC_EXT_ADDR_BITS1718) << 15; + + IOWriteB(VGA_CRTC_INDEX_COLOR, VGA_CRTC_START_ADDR_HIGH_REG); + StartAddress |= IOReadB(VGA_CRTC_DATA_COLOR) << 8; + IOWriteB(VGA_CRTC_INDEX_COLOR, VGA_CRTC_START_ADDR_LOW_REG); + StartAddress |= IOReadB(VGA_CRTC_DATA_COLOR); + + setCX(StartAddress % Mode->Info->BytesPerScanline); + setDX(StartAddress / Mode->Info->BytesPerScanline); + + setAH(0); + break; + } + } + + IOWriteB(VGA_CRTC_INDEX_COLOR, OldCrtcIndex); + break; + } + default: { DPRINT1("VESA BIOS Extensions function %02Xh NOT IMPLEMENTED!\n", getAL());