Initial import from FreeBSD RELENG_4:
[dragonfly.git] / usr.bin / doscmd / mouse.c
1 /*
2  * Copyright (c) 1992, 1993, 1996
3  *      Berkeley Software Design, Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by Berkeley Software
16  *      Design, Inc.
17  *
18  * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  *      BSDI int33.c,v 2.2 1996/04/08 19:32:54 bostic Exp
31  */
32
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD: src/usr.bin/doscmd/mouse.c,v 1.3.2.1 2002/04/25 11:04:51 tg Exp $");
35
36 #include "doscmd.h"
37 #include "mouse.h"
38
39 mouse_t         mouse_status;
40 u_char          *mouse_area = 0;
41 int             nmice = 1;
42
43 static void 
44 mouse_probe(void) 
45
46 }
47
48 void
49 int33(regcontext_t *REGS)
50 {
51     u_long vec;
52     u_short mask;
53     int i;
54
55     if (!nmice) {
56         R_FLAGS |= PSL_C;       /* We don't support a mouse */
57         return;
58     }
59
60     printf("Mouse: %02x\n", R_AX);
61     switch (R_AX) {
62     case 0x00:                          /* Reset Mouse */
63         printf("Installing mouse driver\n");
64         R_AX = 0xffff;                  /* Mouse installed */
65         R_BX = 2;                       /* Number of mouse buttons */
66         memset(&mouse_status, 0, sizeof(mouse_status));
67         mouse_status.installed = 1;
68         mouse_status.hardcursor = 1;
69         mouse_status.end = 16;
70         mouse_status.hmickey = 8;
71         mouse_status.vmickey = 16;
72         mouse_status.doubling = 100;
73         mouse_status.init = -1;
74         mouse_status.range.w = 8 * 80;
75         mouse_status.range.h = 16 * 25;
76         break;
77
78     case 0x01:  /* Display Mouse Cursor */
79         if ((mouse_status.init += 1) == 0) {
80             mouse_status.show = 1;
81         }
82         break;
83
84     case 0x02:  /* Hide Mouse Cursor */
85         if (mouse_status.init == 0)
86             mouse_status.show = 0;
87         mouse_status.init -= 1;
88         break;
89
90     case 0x03:  /* Get cursor position/button status */
91         mouse_probe();
92         R_CX = mouse_status.x;
93         R_DX = mouse_status.y;
94         R_BX = mouse_status.buttons;
95         break;
96
97     case 0x04:  /* Move mouse cursor */
98         /* mouse_move(GET16(sc->sc_ecx), GET16(sc->sc_edx)); */
99         break;
100
101     case 0x05:  /* Determine number of times mouse button was active */
102         i = R_BX & 3;
103         if (i == 3)
104             i = 1;
105         
106         R_BX = mouse_status.downs[i];
107         mouse_status.downs[i] = 0;
108         R_AX = mouse_status.buttons;
109         R_CX = mouse_status.x;          /* Not quite right */
110         R_DX = mouse_status.y;          /* Not quite right */
111         break;
112
113     case 0x06:  /* Determine number of times mouse button was relsd */
114         i = R_DX & 3;
115         if (i == 3)
116             i = 1;
117         
118         R_BX = mouse_status.ups[i];
119         mouse_status.ups[i] = 0;
120         R_AX = mouse_status.buttons;
121         R_CX = mouse_status.x;          /* Not quite right */
122         R_DX = mouse_status.y;          /* Not quite right */
123         break;
124         
125     case 0x07:  /* Set min/max horizontal cursor position */
126         mouse_status.range.x = R_CX;
127         mouse_status.range.w = R_DX - R_CX;
128         break;
129         
130     case 0x08:  /* Set min/max vertical cursor position */
131         mouse_status.range.y = R_CX;
132         mouse_status.range.h = R_DX - R_CX;
133         
134     case 0x09:  /* Set graphics cursor block */
135         /* BX,CX is hot spot, ES:DX is data. */
136         break;
137         
138     case 0x0a:  /* Set Text Cursor */
139         mouse_status.hardcursor = R_BX ? 1 : 0;
140         mouse_status.start = R_CX;
141         mouse_status.end = R_CX;        /* XXX is this right ? */
142         break;
143
144     case 0x0b:  /* Read Mouse Motion Counters */
145         mouse_probe();
146         R_CX = mouse_status.x - mouse_status.lastx;
147         R_DX = mouse_status.y - mouse_status.lasty;
148         break;
149
150     case 0x0c:  /* Set event handler */
151         mouse_status.mask = R_CX;
152         mouse_status.handler = MAKEVEC(R_ES, R_DX);
153         break;
154     
155     case 0x0d:  /* Enable light pen */
156     case 0x0e:  /* Disable light pen */
157         break;
158
159     case 0x0f:  /* Set cursor speed */
160         mouse_status.hmickey = R_CX;
161         mouse_status.vmickey = R_DX;
162         break;
163     
164     case 0x10:  /* Exclusive area */
165         mouse_status.exclude.x = R_CX;
166         mouse_status.exclude.y = R_DX;
167         mouse_status.exclude.w = R_SI - R_CX;
168         mouse_status.exclude.h = R_DI - R_DX;
169         break;
170
171     case 0x13:  /* Set maximum for mouse speed doubling */
172         break;
173     case 0x14:  /* Exchange event handlers */
174         mask = mouse_status.mask;
175         vec = mouse_status.handler;
176
177         mouse_status.mask = R_CX;
178         mouse_status.handler = MAKEVEC(R_ES, R_DX);
179         R_CX = mask;
180         PUTVEC(R_ES, R_DX, vec);
181         break;
182
183     case 0x15:  /* Determine mouse status buffer size */
184         R_BX = sizeof(mouse_status);
185         break;
186
187     case 0x16:  /* Store mouse buffer */
188         memcpy((char *)MAKEPTR(R_ES, R_DX), &mouse_status,
189                sizeof(mouse_status));
190         break;
191
192     case 0x17:  /* Restore mouse buffer */
193         memcpy(&mouse_status, (char *)MAKEPTR(R_ES, R_DX),
194                sizeof(mouse_status));
195         break;
196
197     case 0x18:  /* Install alternate handler */
198         mask = R_CX & 0xff;
199         if ((R_CX & 0xe0) == 0x00 ||
200             mask == mouse_status.altmask[0] ||
201             mask == mouse_status.altmask[1] ||
202             mask == mouse_status.altmask[2] ||
203             (mouse_status.altmask[i = 0] &&
204              mouse_status.altmask[i = 1] &&
205              mouse_status.altmask[i = 2])) {
206             R_AX = 0xffff;
207             break;
208         }
209         mouse_status.altmask[i] = R_CX;
210         mouse_status.althandler[i] = MAKEVEC(R_ES, R_DX);
211         break;
212
213     case 0x19:  /* Determine address of alternate event handler */
214         mask = R_CX & 0xff;
215         if (mask == mouse_status.altmask[0])
216             vec = mouse_status.althandler[0];
217         else if (mask == mouse_status.altmask[1])
218             vec = mouse_status.althandler[1];
219         else if (mask == mouse_status.altmask[2])
220             vec = mouse_status.althandler[2];
221         else
222             R_CX = 0;
223         PUTVEC(R_ES, R_DX, vec);
224         break;
225
226     case 0x1a:  /* set mouse sensitivity */
227         mouse_status.hmickey = R_BX;
228         mouse_status.vmickey = R_CX;
229         mouse_status.doubling = R_DX;
230         break;
231
232     case 0x1b:  /* get mouse sensitivity */
233         R_BX = mouse_status.hmickey;
234         R_CX = mouse_status.vmickey;
235         R_DX = mouse_status.doubling;
236         break;
237
238     case 0x1c:  /* set mouse hardware rate */
239     case 0x1d:  /* set display page */
240         break;
241
242     case 0x1e:  /* get display page */
243         R_BX = 0;       /* Always on display page 0 */
244         break;
245
246     case 0x1f:  /* Disable mouse driver */
247         if (mouse_status.installed) {
248             PUTVEC(R_ES, R_DX, mouse_status.handler);
249             mouse_status.installed = 0;
250         } else {
251             R_AX = 0xffff;
252         }
253         break;
254
255     case 0x20:  /* Enable mouse driver */
256         mouse_status.installed = 1;
257         break;
258
259     case 0x21:  /* Reset mouse driver */
260         if (mouse_status.installed) {
261             mouse_status.show = 0;
262             mouse_status.handler = 0;
263             mouse_status.mask = 0;
264             mouse_status.cursor = 0;
265         } else {
266             R_AX = 0xffff;
267         }
268         break;
269
270     case 0x22:  /* Specified language for mouse messages */
271         break;
272
273     case 0x23:  /* Get language number */
274         R_BX = 0;       /* Always return english */
275         break;
276
277     case 0x24:  /* Get mouse type */
278         R_CX = 0x0400;          /* PS/2 style mouse */
279         R_BX = 0x0600 + 24;     /* Version 6.24 */
280         break;
281
282     default:
283         R_FLAGS |= PSL_C;
284         break;
285     }
286 }
287
288 void
289 mouse_init(void)
290 {
291     u_long vec;
292
293     vec = insert_softint_trampoline();
294     ivec[0x33] = vec;
295     register_callback(vec, int33, "int 33");
296     
297     mouse_area[1] = 24;
298 }