#include "mouse.h"
#include "ps2.h"
+// HACK: For the PS/2 bypass and MOUSE.COM driver direct call
+#include "dos/mouse32.h"
+
/* PRIVATE VARIABLES **********************************************************/
static MOUSE_MODE Mode, PreviousMode;
static SHORT VertCounter;
static CHAR ScrollCounter;
+static BYTE PS2Port = 1;
+
/* PRIVATE FUNCTIONS **********************************************************/
static VOID MouseResetConfig(VOID)
MouseId = 0;
/* Send the Basic Assurance Test success code and the device ID */
- KeyboardQueuePush(MOUSE_BAT_SUCCESS);
- KeyboardQueuePush(MouseId);
+ PS2QueuePush(PS2Port, MOUSE_BAT_SUCCESS);
+ PS2QueuePush(PS2Port, MouseId);
}
#if 0
}
#endif
-/* PUBLIC FUNCTIONS ***********************************************************/
-
-VOID MouseUpdatePosition(PCOORD NewPosition)
+/*static*/ VOID MouseUpdatePosition(PCOORD NewPosition)
{
/* Update the counters */
- HorzCounter += ((NewPosition->X - Position.X) * WidthMm * Resolution) / WidthPixels;
+ HorzCounter += ((NewPosition->X - Position.X) * WidthMm * Resolution) / WidthPixels;
VertCounter += ((NewPosition->Y - Position.Y) * HeightMm * Resolution) / HeightPixels;
/* Update the position */
Position = *NewPosition;
}
-VOID MouseUpdateButtons(ULONG NewButtonState)
+/*static*/ VOID MouseUpdateButtons(ULONG NewButtonState)
{
ButtonState = NewButtonState;
}
-VOID MouseScroll(LONG Direction)
+/*static*/ VOID MouseScroll(LONG Direction)
{
ScrollCounter += Direction;
}
-COORD MouseGetPosition(VOID)
+/*static*/ COORD MouseGetPosition(VOID)
{
return Position;
}
-VOID MouseCommand(BYTE Command)
+static VOID WINAPI MouseCommand(LPVOID Param, BYTE Command)
{
switch (Command)
{
case 0xE6:
{
Scaling = FALSE;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
break;
}
case 0xE7:
{
Scaling = TRUE;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
break;
}
MouseResetCounters();
Mode = MOUSE_STREAMING_MODE;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
break;
}
/* Restore the previous mode */
MouseResetCounters();
Mode = PreviousMode;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
}
- else KeyboardQueuePush(MOUSE_ERROR);
+ else PS2QueuePush(PS2Port, MOUSE_ERROR);
break;
}
MouseResetCounters();
Mode = MOUSE_WRAP_MODE;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
break;
}
MouseResetCounters();
Mode = MOUSE_REMOTE_MODE;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
break;
}
/* Get Mouse ID */
case 0xF2:
{
- KeyboardQueuePush(MOUSE_ACK);
- KeyboardQueuePush(MouseId);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
+ PS2QueuePush(PS2Port, MouseId);
break;
}
case 0xF4:
{
Reporting = TRUE;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
break;
}
case 0xF5:
{
Reporting = FALSE;
- KeyboardQueuePush(MOUSE_ACK);
+ PS2QueuePush(PS2Port, MOUSE_ACK);
break;
}
/* Unknown command */
default:
{
- KeyboardQueuePush(MOUSE_ERROR);
+ PS2QueuePush(PS2Port, MOUSE_ERROR);
}
}
}
-BOOLEAN MouseInit(VOID)
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+VOID MouseEventHandler(PMOUSE_EVENT_RECORD MouseEvent)
+{
+ // FIXME: Sync our private data
+
+ // HACK: Bypass PS/2 and instead, notify the MOUSE.COM driver directly
+ MouseBiosUpdatePosition(&MouseEvent->dwMousePosition);
+ MouseBiosUpdateButtons(LOWORD(MouseEvent->dwButtonState));
+
+ // PS2QueuePush(PS2Port, Data);
+ // PicInterruptRequest(12);
+}
+
+BOOLEAN MouseInit(BYTE PS2Connector)
{
HWND hWnd;
HDC hDC;
/* Release the device context */
ReleaseDC(hWnd, hDC);
+ /* Finish to plug the mouse to the specified PS/2 port */
+ PS2Port = PS2Connector;
+ PS2SetDeviceCmdProc(PS2Port, NULL, MouseCommand);
+
MouseReset();
return TRUE;
}