2 * Copyright (c) 1992, 1993, 1996
3 * Berkeley Software Design, Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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
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
30 * BSDI int33.c,v 2.2 1996/04/08 19:32:54 bostic Exp
39 u_char *mouse_area = 0;
48 int33(regcontext_t *REGS)
55 R_FLAGS |= PSL_C; /* We don't support a mouse */
59 printf("Mouse: %02x\n", 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;
77 case 0x01: /* Display Mouse Cursor */
78 if ((mouse_status.init += 1) == 0) {
79 mouse_status.show = 1;
83 case 0x02: /* Hide Mouse Cursor */
84 if (mouse_status.init == 0)
85 mouse_status.show = 0;
86 mouse_status.init -= 1;
89 case 0x03: /* Get cursor position/button status */
91 R_CX = mouse_status.x;
92 R_DX = mouse_status.y;
93 R_BX = mouse_status.buttons;
96 case 0x04: /* Move mouse cursor */
97 /* mouse_move(GET16(sc->sc_ecx), GET16(sc->sc_edx)); */
100 case 0x05: /* Determine number of times mouse button was active */
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 */
112 case 0x06: /* Determine number of times mouse button was relsd */
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 */
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;
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;
133 case 0x09: /* Set graphics cursor block */
134 /* BX,CX is hot spot, ES:DX is data. */
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 ? */
143 case 0x0b: /* Read Mouse Motion Counters */
145 R_CX = mouse_status.x - mouse_status.lastx;
146 R_DX = mouse_status.y - mouse_status.lasty;
149 case 0x0c: /* Set event handler */
150 mouse_status.mask = R_CX;
151 mouse_status.handler = MAKEVEC(R_ES, R_DX);
154 case 0x0d: /* Enable light pen */
155 case 0x0e: /* Disable light pen */
158 case 0x0f: /* Set cursor speed */
159 mouse_status.hmickey = R_CX;
160 mouse_status.vmickey = R_DX;
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;
170 case 0x13: /* Set maximum for mouse speed doubling */
172 case 0x14: /* Exchange event handlers */
173 mask = mouse_status.mask;
174 vec = mouse_status.handler;
176 mouse_status.mask = R_CX;
177 mouse_status.handler = MAKEVEC(R_ES, R_DX);
179 PUTVEC(R_ES, R_DX, vec);
182 case 0x15: /* Determine mouse status buffer size */
183 R_BX = sizeof(mouse_status);
186 case 0x16: /* Store mouse buffer */
187 memcpy((char *)MAKEPTR(R_ES, R_DX), &mouse_status,
188 sizeof(mouse_status));
191 case 0x17: /* Restore mouse buffer */
192 memcpy(&mouse_status, (char *)MAKEPTR(R_ES, R_DX),
193 sizeof(mouse_status));
196 case 0x18: /* Install alternate handler */
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])) {
208 mouse_status.altmask[i] = R_CX;
209 mouse_status.althandler[i] = MAKEVEC(R_ES, R_DX);
212 case 0x19: /* Determine address of alternate event handler */
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];
222 PUTVEC(R_ES, R_DX, vec);
225 case 0x1a: /* set mouse sensitivity */
226 mouse_status.hmickey = R_BX;
227 mouse_status.vmickey = R_CX;
228 mouse_status.doubling = R_DX;
231 case 0x1b: /* get mouse sensitivity */
232 R_BX = mouse_status.hmickey;
233 R_CX = mouse_status.vmickey;
234 R_DX = mouse_status.doubling;
237 case 0x1c: /* set mouse hardware rate */
238 case 0x1d: /* set display page */
241 case 0x1e: /* get display page */
242 R_BX = 0; /* Always on display page 0 */
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;
254 case 0x20: /* Enable mouse driver */
255 mouse_status.installed = 1;
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;
269 case 0x22: /* Specified language for mouse messages */
272 case 0x23: /* Get language number */
273 R_BX = 0; /* Always return english */
276 case 0x24: /* Get mouse type */
277 R_CX = 0x0400; /* PS/2 style mouse */
278 R_BX = 0x0600 + 24; /* Version 6.24 */
292 vec = insert_softint_trampoline();
294 register_callback(vec, int33, "int 33");