From 7a52bcd33aef740ea75794c72ec7a81c86e76c01 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 3 Mar 2014 00:09:22 +0000 Subject: [PATCH] [NTVDM]: Add a common helper to sync the BIOS cursor for the active display page, with VGA. svn path=/branches/ntvdm/; revision=62409 --- subsystems/ntvdm/bios/vidbios.c | 47 +++++++++++++++++---------------- subsystems/ntvdm/bios/vidbios.h | 2 ++ 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/subsystems/ntvdm/bios/vidbios.c b/subsystems/ntvdm/bios/vidbios.c index 8d0eb2679af..cec5a7060e2 100644 --- a/subsystems/ntvdm/bios/vidbios.c +++ b/subsystems/ntvdm/bios/vidbios.c @@ -880,24 +880,6 @@ static VOID VgaChangePalette(BYTE ModeNumber) VgaSetPalette(Palette, Size); } -static VOID VgaGetCursorPosition(PBYTE Row, PBYTE Column) -{ - SHORT ScreenColumns = VgaGetDisplayResolution().X; - BYTE OffsetLow, OffsetHigh; - WORD Offset; - - /* Get the cursor location */ - IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG); - OffsetLow = IOReadB(VGA_CRTC_DATA); - IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG); - OffsetHigh = IOReadB(VGA_CRTC_DATA); - - Offset = MAKEWORD(OffsetLow, OffsetHigh); - - *Row = (BYTE)(Offset / ScreenColumns); - *Column = (BYTE)(Offset % ScreenColumns); -} - static VOID VidBiosGetCursorPosition(PBYTE Row, PBYTE Column, BYTE Page) { /* Make sure the selected video page is valid */ @@ -929,6 +911,28 @@ static VOID VidBiosSetCursorPosition(BYTE Row, BYTE Column, BYTE Page) } } +VOID VidBiosSyncCursorPosition(VOID) +{ + BYTE Row, Column; + BYTE Low, High; + SHORT ScreenColumns = VgaGetDisplayResolution().X; + WORD Offset; + + /* Get the cursor location */ + IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG); + Low = IOReadB(VGA_CRTC_DATA); + IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG); + High = IOReadB(VGA_CRTC_DATA); + + Offset = MAKEWORD(Low, High); + + Row = (BYTE)(Offset / ScreenColumns); + Column = (BYTE)(Offset % ScreenColumns); + + /* Synchronize our cursor position with VGA */ + VidBiosSetCursorPosition(Row, Column, Bda->VideoPage); +} + BYTE VidBiosGetVideoMode(VOID) { return Bda->VideoMode; @@ -1530,8 +1534,6 @@ VOID WINAPI VidBiosVideoService(LPWORD Stack) BOOLEAN VidBiosInitialize(VOID) { - BYTE Row, Column; - /* Some interrupts are in fact addresses to tables */ ((PULONG)BaseAddress)[0x1D] = (ULONG)NULL; ((PULONG)BaseAddress)[0x1F] = (ULONG)NULL; @@ -1542,9 +1544,8 @@ BOOLEAN VidBiosInitialize(VOID) /* Set the default video mode */ VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE); - /* Update cursor position */ - VgaGetCursorPosition(&Row, &Column); - VidBiosSetCursorPosition(Row, Column, Bda->VideoPage); + /* Synchronize our cursor position with VGA */ + VidBiosSyncCursorPosition(); /* Register the BIOS support BOPs */ RegisterBop(BOP_VIDEO_INT, VidBiosVideoService); diff --git a/subsystems/ntvdm/bios/vidbios.h b/subsystems/ntvdm/bios/vidbios.h index 787e7c5282b..70b3e54606e 100644 --- a/subsystems/ntvdm/bios/vidbios.h +++ b/subsystems/ntvdm/bios/vidbios.h @@ -39,6 +39,8 @@ enum VOID WINAPI VidBiosVideoService(LPWORD Stack); +VOID VidBiosSyncCursorPosition(VOID); + BOOLEAN VidBiosInitialize(VOID); VOID VidBiosCleanup(VOID); -- 2.17.1