Fixed bdftopcf command.
[wine/hacks.git] / msdos / int33.c
blobabbc6418d07ebd85389edf31f28b7e238d92e7f7
1 /*
2 * DOS interrupt 33h handler
3 */
5 #include <stdlib.h>
6 #include "windef.h"
7 #include "wingdi.h"
8 #include "winuser.h"
9 #include "miscemu.h"
10 #include "dosexe.h"
11 #include "vga.h"
12 #include "debugtools.h"
14 DEFAULT_DEBUG_CHANNEL(int)
16 typedef struct {
17 DWORD x, y, but;
18 FARPROC16 callback;
19 WORD callmask;
20 } MOUSESYSTEM;
22 /**********************************************************************
23 * INT_Int33Handler
25 * Handler for int 33h (MS MOUSE).
27 void WINAPI INT_Int33Handler( CONTEXT86 *context )
29 MOUSESYSTEM *sys = (MOUSESYSTEM *)DOSVM_GetSystemData(0x33);
31 switch (AX_reg(context)) {
32 case 0x00:
33 TRACE("Reset mouse driver and request status\n");
34 AX_reg(context) = 0xFFFF; /* installed */
35 BX_reg(context) = 3; /* # of buttons */
36 sys = calloc(1,sizeof(MOUSESYSTEM));
37 DOSVM_SetSystemData(0x33, sys);
38 break;
39 case 0x01:
40 FIXME("Show mouse cursor\n");
41 break;
42 case 0x02:
43 FIXME("Hide mouse cursor\n");
44 break;
45 case 0x03:
46 TRACE("Return mouse position and button status\n");
47 BX_reg(context) = sys->but;
48 CX_reg(context) = sys->x;
49 DX_reg(context) = sys->y;
50 break;
51 case 0x04:
52 FIXME("Position mouse cursor\n");
53 break;
54 case 0x07:
55 FIXME("Define horizontal mouse cursor range\n");
56 break;
57 case 0x08:
58 FIXME("Define vertical mouse cursor range\n");
59 break;
60 case 0x09:
61 FIXME("Define graphics mouse cursor\n");
62 break;
63 case 0x0A:
64 FIXME("Define text mouse cursor\n");
65 break;
66 case 0x0C:
67 TRACE("Define mouse interrupt subroutine\n");
68 sys->callmask = CX_reg(context);
69 sys->callback = (FARPROC16)PTR_SEG_OFF_TO_SEGPTR(ES_reg(context), DX_reg(context));
70 break;
71 case 0x10:
72 FIXME("Define screen region for update\n");
73 break;
74 default:
75 INT_BARF(context,0x33);
79 typedef struct {
80 FARPROC16 proc;
81 WORD mask,but,x,y,mx,my;
82 } MCALLDATA;
84 static void MouseRelay(LPDOSTASK lpDosTask,CONTEXT86 *context,void *mdata)
86 MCALLDATA *data = (MCALLDATA *)mdata;
87 CONTEXT86 ctx = *context;
89 EAX_reg(&ctx) = data->mask;
90 EBX_reg(&ctx) = data->but;
91 ECX_reg(&ctx) = data->x;
92 EDX_reg(&ctx) = data->y;
93 ESI_reg(&ctx) = data->mx;
94 EDI_reg(&ctx) = data->my;
95 CS_reg(&ctx) = SELECTOROF(data->proc);
96 EIP_reg(&ctx) = OFFSETOF(data->proc);
97 free(data);
98 DPMI_CallRMProc(&ctx, NULL, 0, 0);
101 void WINAPI INT_Int33Message(UINT message,WPARAM wParam,LPARAM lParam)
103 MOUSESYSTEM *sys = (MOUSESYSTEM *)DOSVM_GetSystemData(0x33);
104 WORD mask = 0;
105 unsigned Height, Width, SX=1, SY=1;
107 if (!sys) return;
108 if (!VGA_GetMode(&Height,&Width,NULL)) {
109 /* may need to do some coordinate scaling */
110 SX = 640/Width;
111 if (!SX) SX=1;
113 sys->x = LOWORD(lParam) * SX;
114 sys->y = HIWORD(lParam) * SY;
115 switch (message) {
116 case WM_MOUSEMOVE:
117 mask |= 0x01;
118 break;
119 case WM_LBUTTONDOWN:
120 case WM_LBUTTONDBLCLK:
121 sys->but |= 0x01;
122 mask |= 0x02;
123 break;
124 case WM_LBUTTONUP:
125 sys->but &= ~0x01;
126 mask |= 0x04;
127 break;
128 case WM_RBUTTONDOWN:
129 case WM_RBUTTONDBLCLK:
130 sys->but |= 0x02;
131 mask |= 0x08;
132 break;
133 case WM_RBUTTONUP:
134 sys->but &= ~0x02;
135 mask |= 0x10;
136 break;
137 case WM_MBUTTONDOWN:
138 case WM_MBUTTONDBLCLK:
139 sys->but |= 0x04;
140 mask |= 0x20;
141 break;
142 case WM_MBUTTONUP:
143 sys->but &= ~0x04;
144 mask |= 0x40;
145 break;
148 if ((mask & sys->callmask) && sys->callback) {
149 MCALLDATA *data = calloc(1,sizeof(MCALLDATA));
150 data->proc = sys->callback;
151 data->mask = mask & sys->callmask;
152 data->but = sys->but;
153 data->x = sys->x;
154 data->y = sys->y;
155 DOSVM_QueueEvent(-1, DOS_PRIORITY_MOUSE, MouseRelay, data);