2024-02-15 01:15:55 +00:00
|
|
|
#include <dos.h>
|
|
|
|
#include <conio.h>
|
2024-02-16 02:18:15 +00:00
|
|
|
#include <i86.h>
|
2024-02-15 01:15:55 +00:00
|
|
|
|
|
|
|
#include "mouse_io.h"
|
|
|
|
|
2024-02-16 02:18:15 +00:00
|
|
|
struct MouseStatus *_status;
|
|
|
|
|
2024-02-20 11:48:12 +00:00
|
|
|
/**
|
|
|
|
* Ensure this is called after setting the desired video mode.
|
|
|
|
*/
|
2024-02-15 01:15:55 +00:00
|
|
|
int activateMouse(struct MouseStatus *status) {
|
|
|
|
union REGS regs;
|
|
|
|
int mouseActivated;
|
|
|
|
|
|
|
|
regs.w.ax = MOUSE_DRIVER_RESET;
|
|
|
|
int386(MOUSE_DRIVER_INTERRUPT, ®s, ®s);
|
|
|
|
|
|
|
|
mouseActivated = regs.w.ax;
|
|
|
|
|
|
|
|
if (mouseActivated) {
|
|
|
|
status->isActive = regs.w.ax;
|
|
|
|
status->buttonCount = regs.w.bx;
|
|
|
|
|
|
|
|
// set horiz and vert range
|
|
|
|
regs.w.ax = 0x07;
|
|
|
|
regs.w.cx = 0;
|
|
|
|
regs.w.dx = VGA_DISPLAY_WIDTH - 1;
|
|
|
|
int386(MOUSE_DRIVER_INTERRUPT, ®s, ®s);
|
|
|
|
|
|
|
|
regs.w.ax = 0x08;
|
|
|
|
regs.w.cx = 0;
|
|
|
|
regs.w.dx = VGA_DISPLAY_HEIGHT - 1;
|
|
|
|
int386(MOUSE_DRIVER_INTERRUPT, ®s, ®s);
|
|
|
|
}
|
|
|
|
|
2024-02-16 02:18:15 +00:00
|
|
|
_status = status;
|
|
|
|
|
2024-02-15 01:15:55 +00:00
|
|
|
return mouseActivated;
|
|
|
|
}
|
|
|
|
|
2024-02-16 02:18:15 +00:00
|
|
|
void readMouse() {
|
2024-02-15 01:15:55 +00:00
|
|
|
union REGS regs;
|
|
|
|
int buttonStatus;
|
|
|
|
|
|
|
|
regs.w.ax = MOUSE_DRIVER_READ_STATE;
|
|
|
|
int386(MOUSE_DRIVER_INTERRUPT, ®s, ®s);
|
|
|
|
|
|
|
|
buttonStatus = regs.w.bx;
|
2024-02-16 02:18:15 +00:00
|
|
|
_status->xPosition = regs.w.cx;
|
|
|
|
_status->yPosition = regs.w.dx;
|
2024-02-15 01:15:55 +00:00
|
|
|
|
2024-02-16 02:18:15 +00:00
|
|
|
_status->leftButtonDown = buttonStatus & 1;
|
|
|
|
_status->rightButtonDown = (buttonStatus >> 1) & 1;
|
2024-02-15 01:15:55 +00:00
|
|
|
}
|
|
|
|
|