kernel: Use hashdestroy() to free hash tables allocated with hashinit().
[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  * $FreeBSD: src/usr.bin/doscmd/mouse.c,v 1.3.2.1 2002/04/25 11:04:51 tg Exp $
33  */
34
35 #include "doscmd.h"
36 #include "mouse.h"
37
38 mouse_t         mouse_status;
39 u_char          *mouse_area = NULL;
40 int             nmice = 1;
41
42 static void 
43 mouse_probe(void) 
44
45 }
46
47 void
48 int33(regcontext_t *REGS)
49 {
50     u_long vec = 0;
51     u_short mask;
52     int i;
53
54     if (!nmice) {
55         R_FLAGS |= PSL_C;       /* We don't support a mouse */
56         return;
57     }
58
59     printf("Mouse: %02x\n", R_AX);
60     switch (R_AX) {
61     case 0x00:                          /* Reset Mouse */
62         printf("Installing mouse driver\n");
63         R_AX = 0xffff;                  /* Mouse installed */
64         R_BX = 2;                       /* Number of mouse buttons */
65         memset(&mouse_status, 0, sizeof(mouse_status));
66         mouse_status.installed = 1;
67         mouse_status.hardcursor = 1;
68         mouse_status.end = 16;
69         mouse_status.hmickey = 8;
70         mouse_status.vmickey = 16;
71         mouse_status.doubling = 100;
72         mouse_status.init = -1;
73         mouse_status.range.w = 8 * 80;
74         mouse_status.range.h = 16 * 25;
75         break;
76
77     case 0x01:  /* Display Mouse Cursor */
78         if ((mouse_status.init += 1) == 0) {
79             mouse_status.show = 1;
80         }
81         break;
82
83     case 0x02:  /* Hide Mouse Cursor */
84         if (mouse_status.init == 0)
85             mouse_status.show = 0;
86         mouse_status.init -= 1;
87         break;
88
89     case 0x03:  /* Get cursor position/button status */
90         mouse_probe();
91         R_CX = mouse_status.x;
92         R_DX = mouse_status.y;
93         R_BX = mouse_status.buttons;
94         break;
95
96     case 0x04:  /* Move mouse cursor */
97         /* mouse_move(GET16(sc->sc_ecx), GET16(sc->sc_edx)); */
98         break;
99
100     case 0x05:  /* Determine number of times mouse button was active */
101         i = R_BX & 3;
102         if (i == 3)
103             i = 1;
104         
105         R_BX = mouse_status.downs[i];
106         mouse_status.downs[i] = 0;
107         R_AX = mouse_status.buttons;
108         R_CX = mouse_status.x;          /* Not quite right */
109         R_DX = mouse_status.y;          /* Not quite right */
110         break;
111
112     case 0x06:  /* Determine number of times mouse button was relsd */
113         i = R_DX & 3;
114         if (i == 3)
115             i = 1;
116         
117         R_BX = mouse_status.ups[i];
118         mouse_status.ups[i] = 0;
119         R_AX = mouse_status.buttons;
120         R_CX = mouse_status.x;          /* Not quite right */
121         R_DX = mouse_status.y;          /* Not quite right */
122         break;
123         
124     case 0x07:  /* Set min/max horizontal cursor position */
125         mouse_status.range.x = R_CX;
126         mouse_status.range.w = R_DX - R_CX;
127         break;
128         
129     case 0x08:  /* Set min/max vertical cursor position */
130         mouse_status.range.y = R_CX;
131         mouse_status.range.h = R_DX - R_CX;
132         
133     case 0x09:  /* Set graphics cursor block */
134         /* BX,CX is hot spot, ES:DX is data. */
135         break;
136         
137     case 0x0a:  /* Set Text Cursor */
138         mouse_status.hardcursor = R_BX ? 1 : 0;
139         mouse_status.start = R_CX;
140         mouse_status.end = R_CX;        /* XXX is this right ? */
141         break;
142
143     case 0x0b:  /* Read Mouse Motion Counters */
144         mouse_probe();
145         R_CX = mouse_status.x - mouse_status.lastx;
146         R_DX = mouse_status.y - mouse_status.lasty;
147         break;
148
149     case 0x0c:  /* Set event handler */
150         mouse_status.mask = R_CX;
151         mouse_status.handler = MAKEVEC(R_ES, R_DX);
152         break;
153     
154     case 0x0d:  /* Enable light pen */
155     case 0x0e:  /* Disable light pen */
156         break;
157
158     case 0x0f:  /* Set cursor speed */
159         mouse_status.hmickey = R_CX;
160         mouse_status.vmickey = R_DX;
161         break;
162     
163     case 0x10:  /* Exclusive area */
164         mouse_status.exclude.x = R_CX;
165         mouse_status.exclude.y = R_DX;
166         mouse_status.exclude.w = R_SI - R_CX;
167         mouse_status.exclude.h = R_DI - R_DX;
168         break;
169
170     case 0x13:  /* Set maximum for mouse speed doubling */
171         break;
172     case 0x14:  /* Exchange event handlers */
173         mask = mouse_status.mask;
174         vec = mouse_status.handler;
175
176         mouse_status.mask = R_CX;
177         mouse_status.handler = MAKEVEC(R_ES, R_DX);
178         R_CX = mask;
179         PUTVEC(R_ES, R_DX, vec);
180         break;
181
182     case 0x15:  /* Determine mouse status buffer size */
183         R_BX = sizeof(mouse_status);
184         break;
185
186     case 0x16:  /* Store mouse buffer */
187         memcpy((char *)MAKEPTR(R_ES, R_DX), &mouse_status,
188                sizeof(mouse_status));
189         break;
190
191     case 0x17:  /* Restore mouse buffer */
192         memcpy(&mouse_status, (char *)MAKEPTR(R_ES, R_DX),
193                sizeof(mouse_status));
194         break;
195
196     case 0x18:  /* Install alternate handler */
197         mask = R_CX & 0xff;
198         if ((R_CX & 0xe0) == 0x00 ||
199             mask == mouse_status.altmask[0] ||
200             mask == mouse_status.altmask[1] ||
201             mask == mouse_status.altmask[2] ||
202             (mouse_status.altmask[i = 0] &&
203              mouse_status.altmask[i = 1] &&
204              mouse_status.altmask[i = 2])) {
205             R_AX = 0xffff;
206             break;
207         }
208         mouse_status.altmask[i] = R_CX;
209         mouse_status.althandler[i] = MAKEVEC(R_ES, R_DX);
210         break;
211
212     case 0x19:  /* Determine address of alternate event handler */
213         mask = R_CX & 0xff;
214         if (mask == mouse_status.altmask[0])
215             vec = mouse_status.althandler[0];
216         else if (mask == mouse_status.altmask[1])
217             vec = mouse_status.althandler[1];
218         else if (mask == mouse_status.altmask[2])
219             vec = mouse_status.althandler[2];
220         else
221             R_CX = 0;
222         PUTVEC(R_ES, R_DX, vec);
223         break;
224
225     case 0x1a:  /* set mouse sensitivity */
226         mouse_status.hmickey = R_BX;
227         mouse_status.vmickey = R_CX;
228         mouse_status.doubling = R_DX;
229         break;
230
231     case 0x1b:  /* get mouse sensitivity */
232         R_BX = mouse_status.hmickey;
233         R_CX = mouse_status.vmickey;
234         R_DX = mouse_status.doubling;
235         break;
236
237     case 0x1c:  /* set mouse hardware rate */
238     case 0x1d:  /* set display page */
239         break;
240
241     case 0x1e:  /* get display page */
242         R_BX = 0;       /* Always on display page 0 */
243         break;
244
245     case 0x1f:  /* Disable mouse driver */
246         if (mouse_status.installed) {
247             PUTVEC(R_ES, R_DX, mouse_status.handler);
248             mouse_status.installed = 0;
249         } else {
250             R_AX = 0xffff;
251         }
252         break;
253
254     case 0x20:  /* Enable mouse driver */
255         mouse_status.installed = 1;
256         break;
257
258     case 0x21:  /* Reset mouse driver */
259         if (mouse_status.installed) {
260             mouse_status.show = 0;
261             mouse_status.handler = 0;
262             mouse_status.mask = 0;
263             mouse_status.cursor = 0;
264         } else {
265             R_AX = 0xffff;
266         }
267         break;
268
269     case 0x22:  /* Specified language for mouse messages */
270         break;
271
272     case 0x23:  /* Get language number */
273         R_BX = 0;       /* Always return english */
274         break;
275
276     case 0x24:  /* Get mouse type */
277         R_CX = 0x0400;          /* PS/2 style mouse */
278         R_BX = 0x0600 + 24;     /* Version 6.24 */
279         break;
280
281     default:
282         R_FLAGS |= PSL_C;
283         break;
284     }
285 }
286
287 void
288 mouse_init(void)
289 {
290     u_long vec;
291
292     vec = insert_softint_trampoline();
293     ivec[0x33] = vec;
294     register_callback(vec, int33, "int 33");
295     
296     mouse_area[1] = 24;
297 }