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)
56 R_FLAGS |= PSL_C; /* We don't support a mouse */
60 printf("Mouse: %02x\n", 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;
78 case 0x01: /* Display Mouse Cursor */
79 if ((mouse_status.init += 1) == 0) {
80 mouse_status.show = 1;
84 case 0x02: /* Hide Mouse Cursor */
85 if (mouse_status.init == 0)
86 mouse_status.show = 0;
87 mouse_status.init -= 1;
90 case 0x03: /* Get cursor position/button status */
92 R_CX = mouse_status.x;
93 R_DX = mouse_status.y;
94 R_BX = mouse_status.buttons;
97 case 0x04: /* Move mouse cursor */
98 /* mouse_move(GET16(sc->sc_ecx), GET16(sc->sc_edx)); */
101 case 0x05: /* Determine number of times mouse button was active */
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 */
113 case 0x06: /* Determine number of times mouse button was relsd */
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 */
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;
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;
134 case 0x09: /* Set graphics cursor block */
135 /* BX,CX is hot spot, ES:DX is data. */
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 ? */
144 case 0x0b: /* Read Mouse Motion Counters */
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;
152 case 0x0c: /* Set event handler */
153 mouse_status.mask = R_CX;
154 mouse_status.handler = MAKEVEC(R_ES, R_DX);
157 case 0x0d: /* Enable light pen */
158 case 0x0e: /* Disable light pen */
161 case 0x0f: /* Set cursor speed */
162 mouse_status.hmickey = R_CX;
163 mouse_status.vmickey = R_DX;
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;
173 case 0x13: /* Set maximum for mouse speed doubling */
175 case 0x14: /* Exchange event handlers */
176 mask = mouse_status.mask;
177 vec = mouse_status.handler;
179 mouse_status.mask = R_CX;
180 mouse_status.handler = MAKEVEC(R_ES, R_DX);
182 PUTVEC(R_ES, R_DX, vec);
185 case 0x15: /* Determine mouse status buffer size */
186 R_BX = sizeof(mouse_status);
189 case 0x16: /* Store mouse buffer */
190 memcpy((char *)MAKEPTR(R_ES, R_DX), &mouse_status,
191 sizeof(mouse_status));
194 case 0x17: /* Restore mouse buffer */
195 memcpy(&mouse_status, (char *)MAKEPTR(R_ES, R_DX),
196 sizeof(mouse_status));
199 case 0x18: /* Install alternate handler */
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])) {
211 mouse_status.altmask[i] = R_CX;
212 mouse_status.althandler[i] = MAKEVEC(R_ES, R_DX);
215 case 0x19: /* Determine address of alternate event handler */
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];
225 PUTVEC(R_ES, R_DX, vec);
228 case 0x1a: /* set mouse sensitivity */
229 mouse_status.hmickey = R_BX;
230 mouse_status.vmickey = R_CX;
231 mouse_status.doubling = R_DX;
234 case 0x1b: /* set mouse sensitivity */
235 R_BX = mouse_status.hmickey;
236 R_CX = mouse_status.vmickey;
237 R_DX = mouse_status.doubling;
240 case 0x1c: /* set mouse hardware rate */
241 case 0x1d: /* set display page */
244 case 0x1e: /* get display page */
245 R_BX = 0; /* Always on display page 0 */
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;
257 case 0x20: /* Enable mouse driver */
258 mouse_status.installed = 1;
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;
272 case 0x22: /* Specified language for mouse messages */
275 case 0x23: /* Get language number */
276 R_BX = 0; /* Always return english */
279 case 0x24: /* Get mouse type */
280 R_CX = 0x0400; /* PS/2 style mouse */
281 R_BX = 0x0600 + 24; /* Version 6.24 */
295 vec = insert_softint_trampoline();
297 register_callback(vec, int33, "int 33");