#include #include #include #include "mouse_io.h" struct MouseStatus *_status; int limitMouseArea(int sx, int sy, int ex, int ey) { union REGS regs; // set horiz and vert range regs.w.ax = 0x07; regs.w.cx = sx; regs.w.dx = ex; int386(MOUSE_DRIVER_INTERRUPT, ®s, ®s); regs.w.ax = 0x08; regs.w.cx = sy; regs.w.dx = ey; int386(MOUSE_DRIVER_INTERRUPT, ®s, ®s); } /** * Ensure this is called after setting the desired video mode. */ 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; limitMouseArea(0, 0, VGA_DISPLAY_WIDTH - 1, VGA_DISPLAY_HEIGHT - 1); } _status = status; return mouseActivated; } void readMouse() { union REGS regs; int buttonStatus; regs.w.ax = MOUSE_DRIVER_READ_STATE; int386(MOUSE_DRIVER_INTERRUPT, ®s, ®s); buttonStatus = regs.w.bx; _status->xPosition = regs.w.cx; _status->yPosition = regs.w.dx; _status->leftButtonDown = buttonStatus & 1; _status->rightButtonDown = (buttonStatus >> 1) & 1; }