Added cmd line in new_process request.
[wine.git] / msdos / int33.c
blob3401928613f9c8c110e8cace22d0980373656439
1 /*
2 * DOS interrupt 33h handler
3 */
5 #include <stdlib.h>
6 #include "winuser.h"
7 #include "miscemu.h"
8 #include "dosexe.h"
9 #include "debug.h"
11 typedef struct {
12 DWORD x, y, but;
13 FARPROC16 callback;
14 WORD callmask;
15 } MOUSESYSTEM;
17 /**********************************************************************
18 * INT_Int33Handler
20 * Handler for int 33h (MS MOUSE).
22 void WINAPI INT_Int33Handler( CONTEXT *context )
24 MOUSESYSTEM *sys = (MOUSESYSTEM *)DOSVM_GetSystemData(0x33);
26 switch (AX_reg(context)) {
27 case 0x00:
28 TRACE(int,"Reset mouse driver and request status\n");
29 AX_reg(context) = 0xFFFF; /* installed */
30 BX_reg(context) = 3; /* # of buttons */
31 sys = calloc(1,sizeof(MOUSESYSTEM));
32 DOSVM_SetSystemData(0x33, sys);
33 break;
34 case 0x03:
35 TRACE(int,"Return mouse position and button status\n");
36 BX_reg(context) = sys->but;
37 CX_reg(context) = sys->x;
38 DX_reg(context) = sys->y;
39 break;
40 case 0x0C: /* Define interrupt subroutine */
41 TRACE(int,"Define mouse interrupt subroutine\n");
42 sys->callmask = CX_reg(context);
43 sys->callback = (FARPROC16)PTR_SEG_OFF_TO_SEGPTR(ES_reg(context), DX_reg(context));
44 break;
45 default:
46 INT_BARF(context,0x33);
50 typedef struct {
51 FARPROC16 proc;
52 WORD mask,but,x,y,mx,my;
53 } MCALLDATA;
55 static void MouseRelay(LPDOSTASK lpDosTask,PCONTEXT context,void *mdata)
57 MCALLDATA *data = (MCALLDATA *)mdata;
58 CONTEXT ctx = *context;
60 AX_reg(&ctx) = data->mask;
61 BX_reg(&ctx) = data->but;
62 CX_reg(&ctx) = data->x;
63 DX_reg(&ctx) = data->y;
64 SI_reg(&ctx) = data->mx;
65 DI_reg(&ctx) = data->my;
66 CS_reg(&ctx) = SELECTOROF(data->proc);
67 IP_reg(&ctx) = OFFSETOF(data->proc);
68 free(data);
69 DPMI_CallRMProc(&ctx, NULL, 0, 0);
72 void WINAPI INT_Int33Message(UINT message,WPARAM wParam,LPARAM lParam)
74 MOUSESYSTEM *sys = (MOUSESYSTEM *)DOSVM_GetSystemData(0x33);
75 WORD mask = 0;
77 if (!sys) return;
78 sys->x = LOWORD(lParam);
79 sys->y = HIWORD(lParam);
80 switch (message) {
81 case WM_MOUSEMOVE:
82 mask |= 0x01;
83 break;
84 case WM_LBUTTONDOWN:
85 case WM_LBUTTONDBLCLK:
86 sys->but |= 0x01;
87 mask |= 0x02;
88 break;
89 case WM_LBUTTONUP:
90 sys->but &= ~0x01;
91 mask |= 0x04;
92 break;
93 case WM_RBUTTONDOWN:
94 case WM_RBUTTONDBLCLK:
95 sys->but |= 0x02;
96 mask |= 0x08;
97 break;
98 case WM_RBUTTONUP:
99 sys->but &= ~0x02;
100 mask |= 0x10;
101 break;
102 case WM_MBUTTONDOWN:
103 case WM_MBUTTONDBLCLK:
104 sys->but |= 0x04;
105 mask |= 0x20;
106 break;
107 case WM_MBUTTONUP:
108 sys->but &= ~0x04;
109 mask |= 0x40;
110 break;
113 if ((mask & sys->callmask) && sys->callback) {
114 MCALLDATA *data = calloc(1,sizeof(MCALLDATA));
115 data->proc = sys->callback;
116 data->mask = mask & sys->callmask;
117 data->but = sys->but;
118 data->x = sys->x;
119 data->y = sys->y;
120 DOSVM_QueueEvent(-1, DOS_PRIORITY_MOUSE, MouseRelay, data);