2 * DOS interrupt 33h handler
17 /**********************************************************************
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
)) {
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
);
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
;
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
));
46 INT_BARF(context
,0x33);
52 WORD mask
,but
,x
,y
,mx
,my
;
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
);
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);
78 sys
->x
= LOWORD(lParam
);
79 sys
->y
= HIWORD(lParam
);
85 case WM_LBUTTONDBLCLK
:
94 case WM_RBUTTONDBLCLK
:
103 case WM_MBUTTONDBLCLK
:
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
;
120 DOSVM_QueueEvent(-1, DOS_PRIORITY_MOUSE
, MouseRelay
, data
);