nuclear@0: /* TODO: try NOT using the v8086 interrupts to avoid the overhead */ nuclear@0: #include "mouse.h" nuclear@0: #include "inttypes.h" nuclear@0: #include "dpmi.h" nuclear@0: nuclear@0: #define INTR 0x33 nuclear@0: nuclear@0: #define QUERY 0 nuclear@0: #define SHOW 1 nuclear@0: #define HIDE 2 nuclear@0: #define READ 3 nuclear@0: #define WRITE 4 nuclear@0: nuclear@0: #define XLIM 7 nuclear@0: #define YLIM 8 nuclear@0: nuclear@0: int have_mouse(void) nuclear@0: { nuclear@0: struct dpmi_real_regs regs; nuclear@0: memset(®s, 0, sizeof regs); nuclear@0: regs.eax = QUERY; nuclear@0: dpmi_real_int(INTR, ®s); nuclear@0: return regs.eax & 0xffff; nuclear@0: } nuclear@0: nuclear@0: void show_mouse(int show) nuclear@0: { nuclear@0: struct dpmi_real_regs regs; nuclear@0: memset(®s, 0, sizeof regs); nuclear@0: regs.eax = show ? SHOW : HIDE; nuclear@0: dpmi_real_int(INTR, ®s); nuclear@0: } nuclear@0: nuclear@0: int read_mouse(int *xp, int *yp) nuclear@0: { nuclear@0: struct dpmi_real_regs regs; nuclear@0: memset(®s, 0, sizeof regs); nuclear@0: nuclear@0: regs.eax = READ; nuclear@0: dpmi_real_int(INTR, ®s); nuclear@0: nuclear@0: if(xp) *xp = regs.ecx & 0xffff; nuclear@0: if(yp) *yp = regs.edx & 0xffff; nuclear@0: return regs.ebx & 0xffff; nuclear@0: } nuclear@0: nuclear@0: void set_mouse(int x, int y) nuclear@0: { nuclear@0: struct dpmi_real_regs regs; nuclear@0: memset(®s, 0, sizeof regs); nuclear@0: nuclear@0: regs.eax = WRITE; nuclear@0: regs.ecx = x; nuclear@0: regs.edx = y; nuclear@0: dpmi_real_int(INTR, ®s); nuclear@0: } nuclear@0: nuclear@0: void set_mouse_limits(int xmin, int ymin, int xmax, int ymax) nuclear@0: { nuclear@0: struct dpmi_real_regs regs; nuclear@0: memset(®s, 0, sizeof regs); nuclear@0: regs.eax = XLIM; nuclear@0: regs.ecx = xmin; nuclear@0: regs.edx = xmax; nuclear@0: dpmi_real_int(INTR, ®s); nuclear@0: nuclear@0: memset(®s, 0, sizeof regs); nuclear@0: regs.eax = YLIM; nuclear@0: regs.ecx = ymin; nuclear@0: regs.edx = ymax; nuclear@0: dpmi_real_int(INTR, ®s); nuclear@0: }