rayzor
annotate src/mouse.c @ 7:75bc89c2abc4
fixed the mouse handling problem
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 07 Apr 2014 08:05:06 +0300 |
parents | a826bf0fb169 |
children |
rev | line source |
---|---|
nuclear@1 | 1 #include "mouse.h" |
nuclear@1 | 2 #include "inttypes.h" |
nuclear@1 | 3 |
nuclear@1 | 4 #define INTR 0x33 |
nuclear@1 | 5 |
nuclear@1 | 6 #define QUERY 0 |
nuclear@1 | 7 #define SHOW 1 |
nuclear@1 | 8 #define HIDE 2 |
nuclear@1 | 9 #define READ 3 |
nuclear@1 | 10 #define WRITE 4 |
nuclear@7 | 11 #define PIXRATE 0xf |
nuclear@1 | 12 |
nuclear@1 | 13 #define XLIM 7 |
nuclear@1 | 14 #define YLIM 8 |
nuclear@1 | 15 |
nuclear@1 | 16 int have_mouse(void) |
nuclear@1 | 17 { |
nuclear@7 | 18 uint16_t res = 0; |
nuclear@7 | 19 _asm { |
nuclear@7 | 20 mov eax, QUERY |
nuclear@7 | 21 int INTR |
nuclear@7 | 22 mov res, ax |
nuclear@7 | 23 } |
nuclear@7 | 24 return res; |
nuclear@1 | 25 } |
nuclear@1 | 26 |
nuclear@1 | 27 void show_mouse(int show) |
nuclear@1 | 28 { |
nuclear@7 | 29 uint16_t cmd = show ? SHOW : HIDE; |
nuclear@7 | 30 _asm { |
nuclear@7 | 31 mov ax, cmd |
nuclear@7 | 32 int INTR |
nuclear@7 | 33 } |
nuclear@1 | 34 } |
nuclear@1 | 35 |
nuclear@1 | 36 int read_mouse(int *xp, int *yp) |
nuclear@1 | 37 { |
nuclear@7 | 38 uint16_t x, y, state; |
nuclear@7 | 39 _asm { |
nuclear@7 | 40 mov eax, READ |
nuclear@7 | 41 int INTR |
nuclear@7 | 42 mov state, bx |
nuclear@7 | 43 mov x, cx |
nuclear@7 | 44 mov y, dx |
nuclear@7 | 45 } |
nuclear@1 | 46 |
nuclear@7 | 47 if(xp) *xp = x; |
nuclear@7 | 48 if(yp) *yp = y; |
nuclear@7 | 49 return state; |
nuclear@1 | 50 } |
nuclear@1 | 51 |
nuclear@1 | 52 void set_mouse(int x, int y) |
nuclear@1 | 53 { |
nuclear@7 | 54 _asm { |
nuclear@7 | 55 mov eax, WRITE |
nuclear@7 | 56 mov ecx, x |
nuclear@7 | 57 mov edx, y |
nuclear@7 | 58 int INTR |
nuclear@7 | 59 } |
nuclear@1 | 60 } |
nuclear@1 | 61 |
nuclear@1 | 62 void set_mouse_limits(int xmin, int ymin, int xmax, int ymax) |
nuclear@1 | 63 { |
nuclear@7 | 64 _asm { |
nuclear@7 | 65 mov eax, XLIM |
nuclear@7 | 66 mov ecx, xmin |
nuclear@7 | 67 mov edx, xmax |
nuclear@7 | 68 int INTR |
nuclear@7 | 69 mov eax, YLIM |
nuclear@7 | 70 mov ecx, ymin |
nuclear@7 | 71 mov edx, ymax |
nuclear@7 | 72 int INTR |
nuclear@7 | 73 } |
nuclear@7 | 74 } |
nuclear@1 | 75 |
nuclear@7 | 76 void set_mouse_rate(int xrate, int yrate) |
nuclear@7 | 77 { |
nuclear@7 | 78 _asm { |
nuclear@7 | 79 mov ax, PIXRATE |
nuclear@7 | 80 mov ecx, xrate |
nuclear@7 | 81 mov edx, yrate |
nuclear@7 | 82 int INTR |
nuclear@7 | 83 } |
nuclear@1 | 84 } |
nuclear@7 | 85 |
nuclear@7 | 86 void set_mouse_mode(enum mouse_mode mode) |
nuclear@7 | 87 { |
nuclear@7 | 88 if(mode == MOUSE_GFX) { |
nuclear@7 | 89 set_mouse_rate(1, 1); |
nuclear@7 | 90 } else { |
nuclear@7 | 91 set_mouse_rate(8, 16); |
nuclear@7 | 92 } |
nuclear@7 | 93 } |