summaryrefslogtreecommitdiffstats
path: root/usr.bin/doscmd/mouse.c
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1997-08-09 01:43:15 +0000
committerdyson <dyson@FreeBSD.org>1997-08-09 01:43:15 +0000
commit305573cb2990c5d329d149cef5a3b5533b1e8fd9 (patch)
treedf06304b637358dbe8a006fdb7a6ea5955fee179 /usr.bin/doscmd/mouse.c
parentdede28832bba6a9de7a428ff58df92439bddbc9c (diff)
downloadFreeBSD-src-305573cb2990c5d329d149cef5a3b5533b1e8fd9.zip
FreeBSD-src-305573cb2990c5d329d149cef5a3b5533b1e8fd9.tar.gz
Add our doscmd to the tree. This is a result of work from BSDI, and
a group of dos emulator developers. Submitted by: Jonathan Lemon <jlemon@americantv.com> Obtained from: BSDI
Diffstat (limited to 'usr.bin/doscmd/mouse.c')
-rw-r--r--usr.bin/doscmd/mouse.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/usr.bin/doscmd/mouse.c b/usr.bin/doscmd/mouse.c
new file mode 100644
index 0000000..8593667
--- /dev/null
+++ b/usr.bin/doscmd/mouse.c
@@ -0,0 +1,300 @@
+/*
+ * Copyright (c) 1992, 1993, 1996
+ * Berkeley Software Design, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Berkeley Software
+ * Design, Inc.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * BSDI int33.c,v 2.2 1996/04/08 19:32:54 bostic Exp
+ *
+ * $Id: mouse.c,v 1.3 1996/09/22 15:42:58 miff Exp $
+ */
+
+#include "doscmd.h"
+#include "mouse.h"
+
+mouse_t mouse_status;
+u_char *mouse_area = 0;
+int nmice = 0;
+
+static void
+mouse_probe(void)
+{
+}
+
+void
+int33(regcontext_t *REGS)
+{
+ u_long vec;
+ u_short mask;
+ void *addr;
+ int i;
+
+ if (!nmice) {
+ R_FLAGS |= PSL_C; /* We don't support a mouse */
+ return;
+ }
+
+ printf("Mouse: %02x\n", R_AX);
+ switch (R_AX) {
+ case 0x00: /* Reset Mouse */
+ printf("Installing mouse driver\n");
+ R_AX = 0xffff; /* Mouse installed */
+ R_BX = 2; /* Number of mouse buttons */
+ memset(&mouse_status, 0, sizeof(mouse_status));
+ mouse_status.installed = 1;
+ mouse_status.hardcursor = 1;
+ mouse_status.end = 16;
+ mouse_status.hmickey = 8;
+ mouse_status.vmickey = 16;
+ mouse_status.doubling = 100;
+ mouse_status.init = -1;
+ mouse_status.range.w = 8 * 80;
+ mouse_status.range.h = 16 * 25;
+ break;
+
+ case 0x01: /* Display Mouse Cursor */
+ if ((mouse_status.init += 1) == 0) {
+ mouse_status.show = 1;
+ }
+ break;
+
+ case 0x02: /* Hide Mouse Cursor */
+ if (mouse_status.init == 0)
+ mouse_status.show = 0;
+ mouse_status.init -= 1;
+ break;
+
+ case 0x03: /* Get cursor position/button status */
+ mouse_probe();
+ R_CX = mouse_status.x;
+ R_DX = mouse_status.y;
+ R_BX = mouse_status.buttons;
+ break;
+
+ case 0x04: /* Move mouse cursor */
+ /* mouse_move(GET16(sc->sc_ecx), GET16(sc->sc_edx)); */
+ break;
+
+ case 0x05: /* Determine number of times mouse button was active */
+ i = R_BX & 3;
+ if (i == 3)
+ i = 1;
+
+ R_BX = mouse_status.downs[i];
+ mouse_status.downs[i] = 0;
+ R_AX = mouse_status.buttons;
+ R_CX = mouse_status.x; /* Not quite right */
+ R_DX = mouse_status.y; /* Not quite right */
+ break;
+
+ case 0x06: /* Determine number of times mouse button was relsd */
+ i = R_DX & 3;
+ if (i == 3)
+ i = 1;
+
+ R_BX = mouse_status.ups[i];
+ mouse_status.ups[i] = 0;
+ R_AX = mouse_status.buttons;
+ R_CX = mouse_status.x; /* Not quite right */
+ R_DX = mouse_status.y; /* Not quite right */
+ break;
+
+ case 0x07: /* Set min/max horizontal cursor position */
+ mouse_status.range.x = R_CX;
+ mouse_status.range.w = R_DX - R_CX;
+ break;
+
+ case 0x08: /* Set min/max vertical cursor position */
+ mouse_status.range.y = R_CX;
+ mouse_status.range.h = R_DX - R_CX;
+
+ case 0x09: /* Set graphics cursor block */
+ /* BX,CX is hot spot, ES:DX is data. */
+ break;
+
+ case 0x0a: /* Set Text Cursor */
+ mouse_status.hardcursor = R_BX ? 1 : 0;
+ mouse_status.start = R_CX;
+ mouse_status.end = R_CX; /* XXX is this right ? */
+ break;
+
+ case 0x0b: /* Read Mouse Motion Counters */
+ mouse_probe();
+ R_CX = mouse_status.x - mouse_status.lastx;
+ R_DX = mouse_status.y - mouse_status.lasty;
+ mouse_status.lastx - mouse_status.x;
+ mouse_status.lasty - mouse_status.y;
+ break;
+
+ case 0x0c: /* Set event handler */
+ mouse_status.mask = R_CX;
+ mouse_status.handler = N_GETVEC(R_ES, R_DX);
+ break;
+
+ case 0x0d: /* Enable light pen */
+ case 0x0e: /* Disable light pen */
+ break;
+
+ case 0x0f: /* Set cursor speed */
+ mouse_status.hmickey = R_CX;
+ mouse_status.vmickey = R_DX;
+ break;
+
+ case 0x10: /* Exclusive area */
+ mouse_status.exclude.x = R_CX;
+ mouse_status.exclude.y = R_DX;
+ mouse_status.exclude.w = R_SI - R_CX;
+ mouse_status.exclude.h = R_DI - R_DX;
+ break;
+
+ case 0x13: /* Set maximum for mouse speed doubling */
+ break;
+ case 0x14: /* Exchange event handlers */
+ mask = mouse_status.mask;
+ vec = mouse_status.handler;
+
+ mouse_status.mask = R_CX;
+ mouse_status.handler = GETVEC(R_ES, R_DX);
+ R_CX = mask;
+ N_PUTVEC(R_ES, R_DX, vec);
+ break;
+
+ case 0x15: /* Determine mouse status buffer size */
+ R_BX = sizeof(mouse_status);
+ break;
+
+ case 0x16: /* Store mouse buffer */
+ memcpy((char *)N_GETPTR(R_ES, R_DX), &mouse_status,
+ sizeof(mouse_status));
+ break;
+
+ case 0x17: /* Restore mouse buffer */
+ memcpy(&mouse_status, (char *)N_GETPTR(R_ES, R_DX),
+ sizeof(mouse_status));
+ break;
+
+ case 0x18: /* Install alternate handler */
+ mask = R_CX & 0xff;
+ if ((R_CX & 0xe0) == 0x00 ||
+ mask == mouse_status.altmask[0] ||
+ mask == mouse_status.altmask[1] ||
+ mask == mouse_status.altmask[2] ||
+ (mouse_status.altmask[i = 0] &&
+ mouse_status.altmask[i = 1] &&
+ mouse_status.altmask[i = 2])) {
+ R_AX = 0xffff;
+ break;
+ }
+ mouse_status.altmask[i] = R_CX;
+ mouse_status.althandler[i] = N_GETVEC(R_ES, R_DX);
+ break;
+
+ case 0x19: /* Determine address of alternate event handler */
+ mask = R_CX & 0xff;
+ if (mask == mouse_status.altmask[0])
+ vec = mouse_status.althandler[0];
+ else if (mask == mouse_status.altmask[1])
+ vec = mouse_status.althandler[1];
+ else if (mask == mouse_status.altmask[2])
+ vec = mouse_status.althandler[2];
+ else
+ R_CX = 0;
+ N_PUTVEC(R_ES, R_DX, vec);
+ break;
+
+ case 0x1a: /* set mouse sensitivity */
+ mouse_status.hmickey = R_BX;
+ mouse_status.vmickey = R_CX;
+ mouse_status.doubling = R_DX;
+ break;
+
+ case 0x1b: /* set mouse sensitivity */
+ R_BX = mouse_status.hmickey;
+ R_CX = mouse_status.vmickey;
+ R_DX = mouse_status.doubling;
+ break;
+
+ case 0x1c: /* set mouse hardware rate */
+ case 0x1d: /* set display page */
+ break;
+
+ case 0x1e: /* get display page */
+ R_BX = 0; /* Always on display page 0 */
+ break;
+
+ case 0x1f: /* Disable mouse driver */
+ if (mouse_status.installed) {
+ N_PUTVEC(R_ES, R_DX, mouse_status.handler);
+ mouse_status.installed = 0;
+ } else {
+ R_AX = 0xffff;
+ }
+ break;
+
+ case 0x20: /* Enable mouse driver */
+ mouse_status.installed = 1;
+ break;
+
+ case 0x21: /* Reset mouse driver */
+ if (mouse_status.installed) {
+ mouse_status.show = 0;
+ mouse_status.handler = 0;
+ mouse_status.mask = 0;
+ mouse_status.cursor = 0;
+ } else {
+ R_AX = 0xffff;
+ }
+ break;
+
+ case 0x22: /* Specified language for mouse messages */
+ break;
+
+ case 0x23: /* Get language number */
+ R_BX = 0; /* Always return english */
+ break;
+
+ case 0x24: /* Get mouse type */
+ R_CX = 0x0400; /* PS/2 style mouse */
+ R_BX = 0x0600 + 24; /* Version 6.24 */
+ break;
+
+ default:
+ R_FLAGS |= PSL_C;
+ break;
+ }
+}
+
+void
+mouse_init(void)
+{
+ u_long vec;
+
+ vec = insert_softint_trampoline();
+ ivec[0x33] = vec;
+ register_callback(vec, int33, "int 33");
+
+ mouse_area[1] = 24;
+}
OpenPOWER on IntegriCloud