2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: VDM Mouse 32-bit BIOS
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
9 /* INCLUDES *******************************************************************/
16 #include "moubios32.h"
20 #include "hardware/mouse.h"
22 /* PRIVATE VARIABLES **********************************************************/
24 static BOOLEAN DriverEnabled
= TRUE
;
25 static MOUSE_DRIVER_STATE DriverState
;
27 /* PRIVATE FUNCTIONS **********************************************************/
29 static VOID
PaintMouseCursor(VOID
)
31 if (Bda
->VideoMode
<= 3)
34 DWORD VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Bda
->VideoPage
* Bda
->VideoPageSize
);
36 EmulatorReadMemory(&EmulatorContext
,
38 + (DriverState
.Position
.Y
* Bda
->ScreenColumns
39 + DriverState
.Position
.X
) * sizeof(WORD
),
43 DriverState
.Character
= Character
;
44 Character
&= DriverState
.TextCursor
.ScreenMask
;
45 Character
^= DriverState
.TextCursor
.CursorMask
;
47 EmulatorWriteMemory(&EmulatorContext
,
49 + (DriverState
.Position
.Y
* Bda
->ScreenColumns
50 + DriverState
.Position
.X
) * sizeof(WORD
),
56 // TODO: NOT IMPLEMENTED
61 static VOID
EraseMouseCursor(VOID
)
63 if (Bda
->VideoMode
<= 3)
65 DWORD VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Bda
->VideoPage
* Bda
->VideoPageSize
);
67 EmulatorWriteMemory(&EmulatorContext
,
69 + (DriverState
.Position
.Y
* Bda
->ScreenColumns
70 + DriverState
.Position
.X
) * sizeof(WORD
),
71 (LPVOID
)&DriverState
.Character
,
76 // TODO: NOT IMPLEMENTED
81 static VOID WINAPI
BiosMouseService(LPWORD Stack
)
89 DriverState
.ShowCount
= 0;
91 /* Set the default text cursor */
92 DriverState
.TextCursor
.ScreenMask
= 0xFFFF; /* Display everything */
93 DriverState
.TextCursor
.CursorMask
= 0xFF00; /* ... but with inverted attributes */
95 /* Set the default graphics cursor */
96 DriverState
.GraphicsCursor
.HotSpot
.X
= 3;
97 DriverState
.GraphicsCursor
.HotSpot
.Y
= 1;
99 DriverState
.GraphicsCursor
.ScreenMask
[0] = 0xC3FF; // 1100001111111111
100 DriverState
.GraphicsCursor
.ScreenMask
[1] = 0xC0FF; // 1100000011111111
101 DriverState
.GraphicsCursor
.ScreenMask
[2] = 0xC07F; // 1100000001111111
102 DriverState
.GraphicsCursor
.ScreenMask
[3] = 0xC01F; // 1100000000011111
103 DriverState
.GraphicsCursor
.ScreenMask
[4] = 0xC00F; // 1100000000001111
104 DriverState
.GraphicsCursor
.ScreenMask
[5] = 0xC007; // 1100000000000111
105 DriverState
.GraphicsCursor
.ScreenMask
[6] = 0xC003; // 1100000000000011
106 DriverState
.GraphicsCursor
.ScreenMask
[7] = 0xC007; // 1100000000000111
107 DriverState
.GraphicsCursor
.ScreenMask
[8] = 0xC01F; // 1100000000011111
108 DriverState
.GraphicsCursor
.ScreenMask
[9] = 0xC01F; // 1100000000011111
109 DriverState
.GraphicsCursor
.ScreenMask
[10] = 0xC00F; // 1100000000001111
110 DriverState
.GraphicsCursor
.ScreenMask
[11] = 0xC60F; // 1100011000001111
111 DriverState
.GraphicsCursor
.ScreenMask
[12] = 0xFF07; // 1111111100000111
112 DriverState
.GraphicsCursor
.ScreenMask
[13] = 0xFF07; // 1111111100000111
113 DriverState
.GraphicsCursor
.ScreenMask
[14] = 0xFF87; // 1111111110000111
114 DriverState
.GraphicsCursor
.ScreenMask
[15] = 0xFFCF; // 1111111111001111
116 DriverState
.GraphicsCursor
.CursorMask
[0] = 0x0000; // 0000000000000000
117 DriverState
.GraphicsCursor
.CursorMask
[1] = 0x1C00; // 0001110000000000
118 DriverState
.GraphicsCursor
.CursorMask
[2] = 0x1F00; // 0001111100000000
119 DriverState
.GraphicsCursor
.CursorMask
[3] = 0x1F80; // 0001111110000000
120 DriverState
.GraphicsCursor
.CursorMask
[4] = 0x1FE0; // 0001111111100000
121 DriverState
.GraphicsCursor
.CursorMask
[5] = 0x1FF0; // 0001111111110000
122 DriverState
.GraphicsCursor
.CursorMask
[6] = 0x1FF8; // 0001111111111000
123 DriverState
.GraphicsCursor
.CursorMask
[7] = 0x1FE0; // 0001111111100000
124 DriverState
.GraphicsCursor
.CursorMask
[8] = 0x1FC0; // 0001111111000000
125 DriverState
.GraphicsCursor
.CursorMask
[9] = 0x1FC0; // 0001111111000000
126 DriverState
.GraphicsCursor
.CursorMask
[10] = 0x19E0; // 0001100111100000
127 DriverState
.GraphicsCursor
.CursorMask
[11] = 0x00E0; // 0000000011100000
128 DriverState
.GraphicsCursor
.CursorMask
[12] = 0x0070; // 0000000001110000
129 DriverState
.GraphicsCursor
.CursorMask
[13] = 0x0070; // 0000000001110000
130 DriverState
.GraphicsCursor
.CursorMask
[14] = 0x0030; // 0000000000110000
131 DriverState
.GraphicsCursor
.CursorMask
[15] = 0x0000; // 0000000000000000
133 /* Return mouse information */
134 setAX(0xFFFF); // Hardware & driver installed
135 setBX(NUM_MOUSE_BUTTONS
);
140 /* Show Mouse Cursor */
143 DriverState
.ShowCount
++;
144 if (DriverState
.ShowCount
> 0) PaintMouseCursor();
149 /* Hide Mouse Cursor */
152 DriverState
.ShowCount
--;
153 if (DriverState
.ShowCount
<= 0) EraseMouseCursor();
158 /* Return Position And Button Status */
161 setBX(DriverState
.ButtonState
);
162 setCX(DriverState
.Position
.X
);
163 setDX(DriverState
.Position
.Y
);
168 /* Position Mouse Cursor */
176 ClientToScreen(GetConsoleWindow(), &Point
);
177 SetCursorPos(Point
.x
, Point
.y
);
182 /* Return Button Press Data */
185 WORD Button
= getBX();
187 setAX(DriverState
.ButtonState
);
188 setBX(DriverState
.PressCount
[Button
]);
189 setCX(DriverState
.LastPress
[Button
].X
);
190 setDX(DriverState
.LastPress
[Button
].Y
);
192 /* Reset the counter */
193 DriverState
.PressCount
[Button
] = 0;
198 /* Return Button Release Data */
201 WORD Button
= getBX();
203 setAX(DriverState
.ButtonState
);
204 setBX(DriverState
.ReleaseCount
[Button
]);
205 setCX(DriverState
.LastRelease
[Button
].X
);
206 setDX(DriverState
.LastRelease
[Button
].Y
);
208 /* Reset the counter */
209 DriverState
.ReleaseCount
[Button
] = 0;
215 /* Define Graphics Cursor */
218 PWORD MaskBitmap
= (PWORD
)SEG_OFF_TO_PTR(getES(), getDX());
220 DriverState
.GraphicsCursor
.HotSpot
.X
= getBX();
221 DriverState
.GraphicsCursor
.HotSpot
.Y
= getCX();
223 RtlMoveMemory(DriverState
.GraphicsCursor
.ScreenMask
,
225 sizeof(DriverState
.GraphicsCursor
.ScreenMask
));
227 RtlMoveMemory(DriverState
.GraphicsCursor
.CursorMask
,
229 sizeof(DriverState
.GraphicsCursor
.CursorMask
));
234 /* Define Text Cursor */
237 DriverState
.TextCursor
.ScreenMask
= getCX();
238 DriverState
.TextCursor
.CursorMask
= getDX();
243 /* Return Driver Storage Requirements */
246 setBX(sizeof(MOUSE_DRIVER_STATE
));
250 /* Save Driver State */
253 *((PMOUSE_DRIVER_STATE
)SEG_OFF_TO_PTR(getES(), getDX())) = DriverState
;
257 /* Restore Driver State */
260 DriverState
= *((PMOUSE_DRIVER_STATE
)SEG_OFF_TO_PTR(getES(), getDX()));
264 /* Disable Mouse Driver */
270 DriverEnabled
= FALSE
;
274 /* Enable Mouse Driver */
277 DriverEnabled
= TRUE
;
283 DPRINT1("BIOS Function INT 33h, AX = 0x%04X NOT IMPLEMENTED\n", getAX());
288 /* PUBLIC FUNCTIONS ***********************************************************/
290 VOID
MouseBiosUpdatePosition(PCOORD NewPosition
)
292 if (DriverEnabled
&& (DriverState
.ShowCount
> 0))
295 DriverState
.Position
= *NewPosition
;
300 VOID
MouseBiosUpdateButtons(WORD ButtonState
)
304 if (!DriverEnabled
) return;
306 for (i
= 0; i
< NUM_MOUSE_BUTTONS
; i
++)
308 BOOLEAN OldState
= (DriverState
.ButtonState
>> i
) & 1;
309 BOOLEAN NewState
= (ButtonState
>> i
) & 1;
311 if (NewState
> OldState
)
314 DriverState
.PressCount
[i
]++;
315 DriverState
.LastPress
[i
] = DriverState
.Position
;
317 else if (NewState
< OldState
)
320 DriverState
.ReleaseCount
[i
]++;
321 DriverState
.LastRelease
[i
] = DriverState
.Position
;
325 DriverState
.ButtonState
= ButtonState
;
328 BOOLEAN
MouseBios32Initialize(VOID
)
330 /* Clear the state */
331 ZeroMemory(&DriverState
, sizeof(DriverState
));
333 /* Initialize the interrupt handler */
334 RegisterBiosInt32(BIOS_MOUSE_INTERRUPT
, BiosMouseService
);
339 VOID
MouseBios32Cleanup(VOID
)
341 if (DriverState
.ShowCount
> 0) EraseMouseCursor();