Author: aandrejevic
Date: Sat Sep 13 02:02:44 2014
New Revision: 64129
URL:
http://svn.reactos.org/svn/reactos?rev=64129&view=rev
Log:
[NTVDM]
Start implementing the NTVDM mouse BIOS driver.
Added:
trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.c (with props)
trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.h (with props)
Modified:
trunk/reactos/subsystems/ntvdm/CMakeLists.txt
trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c
trunk/reactos/subsystems/ntvdm/hardware/ps2.c
Modified: trunk/reactos/subsystems/ntvdm/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/CMakeList…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/CMakeLists.txt [iso-8859-1] Sat Sep 13 02:02:44 2014
@@ -9,6 +9,7 @@
bios/bios32/bios32.c
bios/bios32/kbdbios32.c
bios/bios32/vidbios32.c
+ bios/bios32/moubios32.c
bios/bios.c
bios/kbdbios.c
bios/rom.c
Modified: trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/bios…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c [iso-8859-1] Sat Sep 13 02:02:44
2014
@@ -20,6 +20,7 @@
#include "bios32p.h"
#include "kbdbios32.h"
#include "vidbios32.h"
+#include "moubios32.h"
#include "io.h"
#include "hardware/cmos.h"
@@ -412,7 +413,7 @@
BiosHwSetup();
/* Initialize the Keyboard and Video BIOS */
- if (!KbdBios32Initialize() || !VidBios32Initialize()) return FALSE;
+ if (!KbdBios32Initialize() || !VidBios32Initialize() || !MouseBios32Initialize())
return FALSE;
///////////// MUST BE DONE AFTER IVT INITIALIZATION !! /////////////////////
@@ -428,6 +429,7 @@
VOID Bios32Cleanup(VOID)
{
+ MouseBios32Cleanup();
VidBios32Cleanup();
KbdBios32Cleanup();
}
Added: trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/bios…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.c (added)
+++ trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.c [iso-8859-1] Sat Sep 13
02:02:44 2014
@@ -0,0 +1,250 @@
+/*
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS Virtual DOS Machine
+ * FILE: moubios32.c
+ * PURPOSE: VDM Mouse 32-bit BIOS
+ * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
+ */
+
+/* INCLUDES *******************************************************************/
+
+#define NDEBUG
+
+#include "emulator.h"
+#include "callback.h"
+
+#include "moubios32.h"
+#include "bios32p.h"
+
+#include "io.h"
+#include "hardware/mouse.h"
+
+/* PRIVATE VARIABLES **********************************************************/
+
+static BOOLEAN DriverEnabled = TRUE;
+static MOUSE_DRIVER_STATE DriverState;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+static VOID PaintMouseCursor(VOID)
+{
+ if (Bda->VideoMode <= 3)
+ {
+ WORD Character;
+ DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Bda->VideoPage *
Bda->VideoPageSize);
+
+ EmulatorReadMemory(&EmulatorContext,
+ VideoAddress
+ + (DriverState.Position.Y * Bda->ScreenColumns
+ + DriverState.Position.X) * sizeof(WORD),
+ (LPVOID)&Character,
+ sizeof(WORD));
+
+ DriverState.Character = Character;
+ Character &= DriverState.TextCursor.ScreenMask;
+ Character ^= DriverState.TextCursor.CursorMask;
+
+ EmulatorWriteMemory(&EmulatorContext,
+ VideoAddress
+ + (DriverState.Position.Y * Bda->ScreenColumns
+ + DriverState.Position.X) * sizeof(WORD),
+ (LPVOID)&Character,
+ sizeof(WORD));
+ }
+ else
+ {
+ // TODO: NOT IMPLEMENTED
+ UNIMPLEMENTED;
+ }
+}
+
+static VOID EraseMouseCursor(VOID)
+{
+ if (Bda->VideoMode <= 3)
+ {
+ DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Bda->VideoPage *
Bda->VideoPageSize);
+
+ EmulatorWriteMemory(&EmulatorContext,
+ VideoAddress
+ + (DriverState.Position.Y * Bda->ScreenColumns
+ + DriverState.Position.X) * sizeof(WORD),
+ (LPVOID)&DriverState.Character,
+ sizeof(WORD));
+ }
+ else
+ {
+ // TODO: NOT IMPLEMENTED
+ UNIMPLEMENTED;
+ }
+}
+
+static VOID WINAPI BiosMouseService(LPWORD Stack)
+{
+ switch (getAX())
+ {
+ /* Reset Driver */
+ case 0x00:
+ {
+ DriverEnabled = TRUE;
+ DriverState.ShowCount = 0;
+
+ /* Set the default text cursor */
+ DriverState.TextCursor.ScreenMask = 0xFFFF; /* Display everything */
+ DriverState.TextCursor.CursorMask = 0xFF00; /* ... but with inverted
attributes */
+
+ /* Set the default graphics cursor */
+ DriverState.GraphicsCursor.HotSpot.X = 3;
+ DriverState.GraphicsCursor.HotSpot.Y = 1;
+
+ DriverState.GraphicsCursor.ScreenMask[0] = 0xC3FF; // 1100001111111111
+ DriverState.GraphicsCursor.ScreenMask[1] = 0xC0FF; // 1100000011111111
+ DriverState.GraphicsCursor.ScreenMask[2] = 0xC07F; // 1100000001111111
+ DriverState.GraphicsCursor.ScreenMask[3] = 0xC01F; // 1100000000011111
+ DriverState.GraphicsCursor.ScreenMask[4] = 0xC00F; // 1100000000001111
+ DriverState.GraphicsCursor.ScreenMask[5] = 0xC007; // 1100000000000111
+ DriverState.GraphicsCursor.ScreenMask[6] = 0xC003; // 1100000000000011
+ DriverState.GraphicsCursor.ScreenMask[7] = 0xC007; // 1100000000000111
+ DriverState.GraphicsCursor.ScreenMask[8] = 0xC01F; // 1100000000011111
+ DriverState.GraphicsCursor.ScreenMask[9] = 0xC01F; // 1100000000011111
+ DriverState.GraphicsCursor.ScreenMask[10] = 0xC00F; // 1100000000001111
+ DriverState.GraphicsCursor.ScreenMask[11] = 0xC60F; // 1100011000001111
+ DriverState.GraphicsCursor.ScreenMask[12] = 0xFF07; // 1111111100000111
+ DriverState.GraphicsCursor.ScreenMask[13] = 0xFF07; // 1111111100000111
+ DriverState.GraphicsCursor.ScreenMask[14] = 0xFF87; // 1111111110000111
+ DriverState.GraphicsCursor.ScreenMask[15] = 0xFFCF; // 1111111111001111
+
+ DriverState.GraphicsCursor.CursorMask[0] = 0x0000; // 0000000000000000
+ DriverState.GraphicsCursor.CursorMask[1] = 0x1C00; // 0001110000000000
+ DriverState.GraphicsCursor.CursorMask[2] = 0x1F00; // 0001111100000000
+ DriverState.GraphicsCursor.CursorMask[3] = 0x1F80; // 0001111110000000
+ DriverState.GraphicsCursor.CursorMask[4] = 0x1FE0; // 0001111111100000
+ DriverState.GraphicsCursor.CursorMask[5] = 0x1FF0; // 0001111111110000
+ DriverState.GraphicsCursor.CursorMask[6] = 0x1FF8; // 0001111111111000
+ DriverState.GraphicsCursor.CursorMask[7] = 0x1FE0; // 0001111111100000
+ DriverState.GraphicsCursor.CursorMask[8] = 0x1FC0; // 0001111111000000
+ DriverState.GraphicsCursor.CursorMask[9] = 0x1FC0; // 0001111111000000
+ DriverState.GraphicsCursor.CursorMask[10] = 0x19E0; // 0001100111100000
+ DriverState.GraphicsCursor.CursorMask[11] = 0x00E0; // 0000000011100000
+ DriverState.GraphicsCursor.CursorMask[12] = 0x0070; // 0000000001110000
+ DriverState.GraphicsCursor.CursorMask[13] = 0x0070; // 0000000001110000
+ DriverState.GraphicsCursor.CursorMask[14] = 0x0030; // 0000000000110000
+ DriverState.GraphicsCursor.CursorMask[15] = 0x0000; // 0000000000000000
+
+ break;
+ }
+
+ /* Show Mouse Cursor */
+ case 0x01:
+ {
+ DriverState.ShowCount++;
+ if (DriverState.ShowCount > 0) PaintMouseCursor();
+
+ break;
+ }
+
+ /* Hide Mouse Cursor */
+ case 0x02:
+ {
+ DriverState.ShowCount--;
+ if (DriverState.ShowCount <= 0) EraseMouseCursor();
+
+ break;
+ }
+
+ /* Define Graphics Cursor */
+ case 0x09:
+ {
+ PWORD MaskBitmap = (PWORD)SEG_OFF_TO_PTR(getES(), getDX());
+
+ DriverState.GraphicsCursor.HotSpot.X = getBX();
+ DriverState.GraphicsCursor.HotSpot.Y = getCX();
+
+ RtlMoveMemory(DriverState.GraphicsCursor.ScreenMask,
+ MaskBitmap,
+ sizeof(DriverState.GraphicsCursor.ScreenMask));
+
+ RtlMoveMemory(DriverState.GraphicsCursor.CursorMask,
+ &MaskBitmap[16],
+ sizeof(DriverState.GraphicsCursor.CursorMask));
+
+ break;
+ }
+
+ /* Define Text Cursor */
+ case 0x0A:
+ {
+ DriverState.TextCursor.ScreenMask = getCX();
+ DriverState.TextCursor.CursorMask = getDX();
+
+ break;
+ }
+
+ /* Return Driver Storage Requirements */
+ case 0x15:
+ {
+ setBX(sizeof(MOUSE_DRIVER_STATE));
+ break;
+ }
+
+ /* Save Driver State */
+ case 0x16:
+ {
+ *((PMOUSE_DRIVER_STATE)SEG_OFF_TO_PTR(getES(), getDX())) = DriverState;
+ break;
+ }
+
+ /* Restore Driver State */
+ case 0x17:
+ {
+ DriverState = *((PMOUSE_DRIVER_STATE)SEG_OFF_TO_PTR(getES(), getDX()));
+ break;
+ }
+
+ /* Disable Mouse Driver */
+ case 0x1F:
+ {
+ DriverEnabled = FALSE;
+ break;
+ }
+
+ /* Enable Mouse Driver */
+ case 0x20:
+ {
+ DriverEnabled = TRUE;
+ break;
+ }
+
+ default:
+ {
+ DPRINT1("BIOS Function INT 33h, AX = 0x%04X NOT IMPLEMENTED\n",
getAX());
+ }
+ }
+}
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+VOID MouseBiosUpdatePosition(PCOORD NewPosition)
+{
+ if (DriverEnabled && (DriverState.ShowCount > 0))
+ {
+ EraseMouseCursor();
+ DriverState.Position = *NewPosition;
+ PaintMouseCursor();
+ }
+}
+
+BOOLEAN MouseBios32Initialize(VOID)
+{
+ /* Clear the state */
+ ZeroMemory(&DriverState, sizeof(DriverState));
+
+ /* Initialize the interrupt handler */
+ RegisterBiosInt32(BIOS_MOUSE_INTERRUPT, BiosMouseService);
+
+ return TRUE;
+}
+
+VOID MouseBios32Cleanup(VOID)
+{
+ if (DriverState.ShowCount > 0) EraseMouseCursor();
+}
Propchange: trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/bios…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.h (added)
+++ trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.h [iso-8859-1] Sat Sep 13
02:02:44 2014
@@ -0,0 +1,48 @@
+/*
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS Virtual DOS Machine
+ * FILE: moubios32.h
+ * PURPOSE: VDM Mouse 32-bit BIOS
+ * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
+ */
+
+#ifndef _MOUBIOS32_H_
+#define _MOUBIOS32_H_
+
+/* INCLUDES *******************************************************************/
+
+#include "ntvdm.h"
+
+/* DEFINES ********************************************************************/
+
+#define BIOS_MOUSE_INTERRUPT 0x33
+
+typedef struct _MOUSE_DRIVER_STATE
+{
+ SHORT ShowCount;
+ COORD Position;
+ WORD Character;
+
+ struct
+ {
+ WORD ScreenMask;
+ WORD CursorMask;
+ } TextCursor;
+
+ struct
+ {
+ COORD HotSpot;
+ WORD ScreenMask[16];
+ WORD CursorMask[16];
+ } GraphicsCursor;
+} MOUSE_DRIVER_STATE, *PMOUSE_DRIVER_STATE;
+
+/* FUNCTIONS ******************************************************************/
+
+VOID MouseBiosUpdatePosition(PCOORD NewPosition);
+BOOLEAN MouseBios32Initialize(VOID);
+VOID MouseBios32Cleanup(VOID);
+
+#endif // _MOUBIOS32_H_
+
+/* EOF */
Propchange: trunk/reactos/subsystems/ntvdm/bios/bios32/moubios32.h
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/subsystems/ntvdm/hardware/ps2.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/hardware/…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/hardware/ps2.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/hardware/ps2.c [iso-8859-1] Sat Sep 13 02:02:44 2014
@@ -15,6 +15,7 @@
#include "ps2.h"
#include "pic.h"
#include "mouse.h"
+#include "../bios/bios32/moubios32.h"
/* PRIVATE VARIABLES **********************************************************/
@@ -307,8 +308,11 @@
case MOUSE_EVENT:
{
- // TODO: NOT IMPLEMENTED
- UNIMPLEMENTED;
+ /* Notify the BIOS driver */
+
MouseBiosUpdatePosition(&InputRecord->Event.MouseEvent.dwMousePosition);
+
+ // TODO: PS/2, other stuff
+
break;
}
@@ -326,9 +330,7 @@
BOOLEAN PS2Initialize(HANDLE ConsoleInput)
{
-#if 0
DWORD ConInMode;
-#endif
/* Create the mutex */
QueueMutex = CreateMutex(NULL, FALSE, NULL);
@@ -337,23 +339,25 @@
RegisterIoPort(PS2_CONTROL_PORT, PS2ReadPort, PS2WritePort);
RegisterIoPort(PS2_DATA_PORT , PS2ReadPort, PS2WritePort);
+ if (GetConsoleMode(ConsoleInput, &ConInMode))
+ {
#if 0
- if (GetConsoleMode(ConsoleInput, &ConInMode))
- {
if (MousePresent)
{
+#endif
/* Support mouse input events if there is a mouse on the system */
ConInMode |= ENABLE_MOUSE_INPUT;
+#if 0
}
else
{
/* Do not support mouse input events if there is no mouse on the system */
ConInMode &= ~ENABLE_MOUSE_INPUT;
}
+#endif
SetConsoleMode(ConsoleInput, ConInMode);
}
-#endif
return TRUE;
}