]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/doscmd/mouse.c
This commit was generated by cvs2svn to compensate for changes in r75937,
[FreeBSD/FreeBSD.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$
33  */
34
35 #include "doscmd.h"
36 #include "mouse.h"
37
38 mouse_t         mouse_status;
39 u_char          *mouse_area = 0;
40 int             nmice = 0;
41
42 static void 
43 mouse_probe(void) 
44
45 }
46
47 void
48 int33(regcontext_t *REGS)
49 {
50     u_long vec;
51     u_short mask;
52     void *addr;
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         mouse_status.lastx - mouse_status.x;
149         mouse_status.lasty - mouse_status.y;
150         break;
151
152     case 0x0c:  /* Set event handler */
153         mouse_status.mask = R_CX;
154         mouse_status.handler = MAKEVEC(R_ES, R_DX);
155         break;
156     
157     case 0x0d:  /* Enable light pen */
158     case 0x0e:  /* Disable light pen */
159         break;
160
161     case 0x0f:  /* Set cursor speed */
162         mouse_status.hmickey = R_CX;
163         mouse_status.vmickey = R_DX;
164         break;
165     
166     case 0x10:  /* Exclusive area */
167         mouse_status.exclude.x = R_CX;
168         mouse_status.exclude.y = R_DX;
169         mouse_status.exclude.w = R_SI - R_CX;
170         mouse_status.exclude.h = R_DI - R_DX;
171         break;
172
173     case 0x13:  /* Set maximum for mouse speed doubling */
174         break;
175     case 0x14:  /* Exchange event handlers */
176         mask = mouse_status.mask;
177         vec = mouse_status.handler;
178
179         mouse_status.mask = R_CX;
180         mouse_status.handler = MAKEVEC(R_ES, R_DX);
181         R_CX = mask;
182         PUTVEC(R_ES, R_DX, vec);
183         break;
184
185     case 0x15:  /* Determine mouse status buffer size */
186         R_BX = sizeof(mouse_status);
187         break;
188
189     case 0x16:  /* Store mouse buffer */
190         memcpy((char *)MAKEPTR(R_ES, R_DX), &mouse_status,
191                sizeof(mouse_status));
192         break;
193
194     case 0x17:  /* Restore mouse buffer */
195         memcpy(&mouse_status, (char *)MAKEPTR(R_ES, R_DX),
196                sizeof(mouse_status));
197         break;
198
199     case 0x18:  /* Install alternate handler */
200         mask = R_CX & 0xff;
201         if ((R_CX & 0xe0) == 0x00 ||
202             mask == mouse_status.altmask[0] ||
203             mask == mouse_status.altmask[1] ||
204             mask == mouse_status.altmask[2] ||
205             (mouse_status.altmask[i = 0] &&
206              mouse_status.altmask[i = 1] &&
207              mouse_status.altmask[i = 2])) {
208             R_AX = 0xffff;
209             break;
210         }
211         mouse_status.altmask[i] = R_CX;
212         mouse_status.althandler[i] = MAKEVEC(R_ES, R_DX);
213         break;
214
215     case 0x19:  /* Determine address of alternate event handler */
216         mask = R_CX & 0xff;
217         if (mask == mouse_status.altmask[0])
218             vec = mouse_status.althandler[0];
219         else if (mask == mouse_status.altmask[1])
220             vec = mouse_status.althandler[1];
221         else if (mask == mouse_status.altmask[2])
222             vec = mouse_status.althandler[2];
223         else
224             R_CX = 0;
225         PUTVEC(R_ES, R_DX, vec);
226         break;
227
228     case 0x1a:  /* set mouse sensitivity */
229         mouse_status.hmickey = R_BX;
230         mouse_status.vmickey = R_CX;
231         mouse_status.doubling = R_DX;
232         break;
233
234     case 0x1b:  /* set mouse sensitivity */
235         R_BX = mouse_status.hmickey;
236         R_CX = mouse_status.vmickey;
237         R_DX = mouse_status.doubling;
238         break;
239
240     case 0x1c:  /* set mouse hardware rate */
241     case 0x1d:  /* set display page */
242         break;
243
244     case 0x1e:  /* get display page */
245         R_BX = 0;       /* Always on display page 0 */
246         break;
247
248     case 0x1f:  /* Disable mouse driver */
249         if (mouse_status.installed) {
250             PUTVEC(R_ES, R_DX, mouse_status.handler);
251             mouse_status.installed = 0;
252         } else {
253             R_AX = 0xffff;
254         }
255         break;
256
257     case 0x20:  /* Enable mouse driver */
258         mouse_status.installed = 1;
259         break;
260
261     case 0x21:  /* Reset mouse driver */
262         if (mouse_status.installed) {
263             mouse_status.show = 0;
264             mouse_status.handler = 0;
265             mouse_status.mask = 0;
266             mouse_status.cursor = 0;
267         } else {
268             R_AX = 0xffff;
269         }
270         break;
271
272     case 0x22:  /* Specified language for mouse messages */
273         break;
274
275     case 0x23:  /* Get language number */
276         R_BX = 0;       /* Always return english */
277         break;
278
279     case 0x24:  /* Get mouse type */
280         R_CX = 0x0400;          /* PS/2 style mouse */
281         R_BX = 0x0600 + 24;     /* Version 6.24 */
282         break;
283
284     default:
285         R_FLAGS |= PSL_C;
286         break;
287     }
288 }
289
290 void
291 mouse_init(void)
292 {
293     u_long vec;
294
295     vec = insert_softint_trampoline();
296     ivec[0x33] = vec;
297     register_callback(vec, int33, "int 33");
298     
299     mouse_area[1] = 24;
300 }