Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 1 | /* |
| 2 | * DOS interrupt 33h handler |
| 3 | */ |
| 4 | |
| 5 | #include <stdlib.h> |
James Juran | f4d5fef | 2001-01-26 20:43:40 +0000 | [diff] [blame] | 6 | #include <string.h> |
François Gouget | 44a1822 | 2000-12-19 04:53:20 +0000 | [diff] [blame] | 7 | |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 8 | #include "windef.h" |
François Gouget | 44a1822 | 2000-12-19 04:53:20 +0000 | [diff] [blame] | 9 | #include "winbase.h" |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 10 | #include "wingdi.h" |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 11 | #include "winuser.h" |
| 12 | #include "miscemu.h" |
Ove Kaaven | e5557b3 | 2000-12-26 00:22:45 +0000 | [diff] [blame] | 13 | #include "callback.h" |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 14 | #include "dosexe.h" |
Ove Kaaven | ce23e9b | 2000-05-23 21:13:52 +0000 | [diff] [blame] | 15 | #include "vga.h" |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 16 | #include "debugtools.h" |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 17 | |
Dimitrie O. Paun | 529da54 | 2000-11-27 23:54:25 +0000 | [diff] [blame] | 18 | DEFAULT_DEBUG_CHANNEL(int); |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 19 | |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 20 | static struct |
| 21 | { |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 22 | DWORD x, y, but; |
| 23 | FARPROC16 callback; |
| 24 | WORD callmask; |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 25 | } mouse_info; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 26 | |
| 27 | /********************************************************************** |
| 28 | * INT_Int33Handler |
| 29 | * |
| 30 | * Handler for int 33h (MS MOUSE). |
| 31 | */ |
Alexandre Julliard | 617955d | 1999-06-26 18:40:24 +0000 | [diff] [blame] | 32 | void WINAPI INT_Int33Handler( CONTEXT86 *context ) |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 33 | { |
Alexandre Julliard | d8fab2e | 2000-09-25 23:53:07 +0000 | [diff] [blame] | 34 | switch (LOWORD(context->Eax)) { |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 35 | case 0x00: |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 36 | TRACE("Reset mouse driver and request status\n"); |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 37 | AX_reg(context) = 0xFFFF; /* installed */ |
| 38 | BX_reg(context) = 3; /* # of buttons */ |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 39 | memset( &mouse_info, 0, sizeof(mouse_info) ); |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 40 | break; |
Ove Kaaven | eba5752 | 2000-07-29 11:30:02 +0000 | [diff] [blame] | 41 | case 0x01: |
| 42 | FIXME("Show mouse cursor\n"); |
| 43 | break; |
| 44 | case 0x02: |
| 45 | FIXME("Hide mouse cursor\n"); |
| 46 | break; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 47 | case 0x03: |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 48 | TRACE("Return mouse position and button status\n"); |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 49 | BX_reg(context) = mouse_info.but; |
| 50 | CX_reg(context) = mouse_info.x; |
| 51 | DX_reg(context) = mouse_info.y; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 52 | break; |
Ove Kaaven | ce23e9b | 2000-05-23 21:13:52 +0000 | [diff] [blame] | 53 | case 0x04: |
| 54 | FIXME("Position mouse cursor\n"); |
| 55 | break; |
Ove Kaaven | eba5752 | 2000-07-29 11:30:02 +0000 | [diff] [blame] | 56 | case 0x07: |
| 57 | FIXME("Define horizontal mouse cursor range\n"); |
| 58 | break; |
| 59 | case 0x08: |
| 60 | FIXME("Define vertical mouse cursor range\n"); |
| 61 | break; |
| 62 | case 0x09: |
| 63 | FIXME("Define graphics mouse cursor\n"); |
| 64 | break; |
| 65 | case 0x0A: |
| 66 | FIXME("Define text mouse cursor\n"); |
| 67 | break; |
Ove Kaaven | ce23e9b | 2000-05-23 21:13:52 +0000 | [diff] [blame] | 68 | case 0x0C: |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 69 | TRACE("Define mouse interrupt subroutine\n"); |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 70 | mouse_info.callmask = CX_reg(context); |
Alexandre Julliard | 982a223 | 2000-12-13 20:20:09 +0000 | [diff] [blame] | 71 | mouse_info.callback = (FARPROC16)MAKESEGPTR(context->SegEs, LOWORD(context->Edx)); |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 72 | break; |
Ove Kaaven | eba5752 | 2000-07-29 11:30:02 +0000 | [diff] [blame] | 73 | case 0x10: |
| 74 | FIXME("Define screen region for update\n"); |
| 75 | break; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 76 | default: |
| 77 | INT_BARF(context,0x33); |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | typedef struct { |
| 82 | FARPROC16 proc; |
| 83 | WORD mask,but,x,y,mx,my; |
| 84 | } MCALLDATA; |
| 85 | |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 86 | static void MouseRelay(CONTEXT86 *context,void *mdata) |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 87 | { |
| 88 | MCALLDATA *data = (MCALLDATA *)mdata; |
Alexandre Julliard | 617955d | 1999-06-26 18:40:24 +0000 | [diff] [blame] | 89 | CONTEXT86 ctx = *context; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 90 | |
Alexandre Julliard | d8fab2e | 2000-09-25 23:53:07 +0000 | [diff] [blame] | 91 | ctx.Eax = data->mask; |
| 92 | ctx.Ebx = data->but; |
| 93 | ctx.Ecx = data->x; |
| 94 | ctx.Edx = data->y; |
| 95 | ctx.Esi = data->mx; |
| 96 | ctx.Edi = data->my; |
| 97 | ctx.SegCs = SELECTOROF(data->proc); |
| 98 | ctx.Eip = OFFSETOF(data->proc); |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 99 | free(data); |
| 100 | DPMI_CallRMProc(&ctx, NULL, 0, 0); |
| 101 | } |
| 102 | |
| 103 | void WINAPI INT_Int33Message(UINT message,WPARAM wParam,LPARAM lParam) |
| 104 | { |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 105 | WORD mask = 0; |
Ove Kaaven | ce23e9b | 2000-05-23 21:13:52 +0000 | [diff] [blame] | 106 | unsigned Height, Width, SX=1, SY=1; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 107 | |
Ove Kaaven | ce23e9b | 2000-05-23 21:13:52 +0000 | [diff] [blame] | 108 | if (!VGA_GetMode(&Height,&Width,NULL)) { |
| 109 | /* may need to do some coordinate scaling */ |
| 110 | SX = 640/Width; |
| 111 | if (!SX) SX=1; |
| 112 | } |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 113 | mouse_info.x = LOWORD(lParam) * SX; |
| 114 | mouse_info.y = HIWORD(lParam) * SY; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 115 | switch (message) { |
| 116 | case WM_MOUSEMOVE: |
| 117 | mask |= 0x01; |
| 118 | break; |
| 119 | case WM_LBUTTONDOWN: |
| 120 | case WM_LBUTTONDBLCLK: |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 121 | mouse_info.but |= 0x01; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 122 | mask |= 0x02; |
| 123 | break; |
| 124 | case WM_LBUTTONUP: |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 125 | mouse_info.but &= ~0x01; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 126 | mask |= 0x04; |
| 127 | break; |
| 128 | case WM_RBUTTONDOWN: |
| 129 | case WM_RBUTTONDBLCLK: |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 130 | mouse_info.but |= 0x02; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 131 | mask |= 0x08; |
| 132 | break; |
| 133 | case WM_RBUTTONUP: |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 134 | mouse_info.but &= ~0x02; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 135 | mask |= 0x10; |
| 136 | break; |
| 137 | case WM_MBUTTONDOWN: |
| 138 | case WM_MBUTTONDBLCLK: |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 139 | mouse_info.but |= 0x04; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 140 | mask |= 0x20; |
| 141 | break; |
| 142 | case WM_MBUTTONUP: |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 143 | mouse_info.but &= ~0x04; |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 144 | mask |= 0x40; |
| 145 | break; |
| 146 | } |
| 147 | |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 148 | if ((mask & mouse_info.callmask) && mouse_info.callback) { |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 149 | MCALLDATA *data = calloc(1,sizeof(MCALLDATA)); |
Alexandre Julliard | 770eb51 | 2000-09-24 20:47:50 +0000 | [diff] [blame] | 150 | data->proc = mouse_info.callback; |
| 151 | data->mask = mask & mouse_info.callmask; |
| 152 | data->but = mouse_info.but; |
| 153 | data->x = mouse_info.x; |
| 154 | data->y = mouse_info.y; |
Ove Kaaven | e5557b3 | 2000-12-26 00:22:45 +0000 | [diff] [blame] | 155 | Dosvm.QueueEvent(-1, DOS_PRIORITY_MOUSE, MouseRelay, data); |
Ove Kaaven | baed48e | 1999-03-25 10:50:49 +0000 | [diff] [blame] | 156 | } |
| 157 | } |