home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************************
- * mouse.c
- *
- * The mouse interface through INT 33.
- **********************************************************************
- This file is part of
-
- STK -- The sprite toolkit -- version 1.0
-
- Copyright (C) Jari Karjala 1990
-
- The sprite toolkit (STK) is a FreeWare toolkit for creating high
- resolution sprite graphics with PCompatible hardware. This toolkit
- is provided as is without any warranty or such thing. See the file
- COPYING for further information.
-
- **********************************************************************/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <dos.h>
- #include <graphics.h>
-
- #define NO_EXTERNS
- #include "mouse.h"
-
- /** first mask, then shape, must be words **/
-
- MOUSE_POINTER mouse_pointer_arrow = { /* HotSpot 1,1 */
- 0x3FFF,0x1FFF,0x0FFF,0x07FF,0x03FF,0x01FF,
- 0x00FF,0x007F,0x003F,0x001F,0x01FF,0x10FF,
- 0x30FF,0xF87F,0xF87F,0xF87F,
-
- 0x0000,0x4000,0x6000,0x7000,0x7800,0x7C00,
- 0x7E00,0x7F00,0x7F80,0x7C00,0x6C00,0x4600,
- 0x0600,0x0300,0x0300,0x0000,
- };
-
- MOUSE_POINTER mouse_pointer_hourglass = {
- 0x0001,0x0001,0x8003,0xC007,0xC007,0xE00F,
- 0xF01F,0xF83F,0xF83F,0xF01F,0xE00F,0xC007,
- 0xC007,0x8003,0x0001,0x0001,
-
- 0x0000,0x7FFC,0x3FF8,0x1010,0x1010,0x0820,
- 0x0440,0x0280,0x0280,0x0440,0x0920,0x1390,
- 0x17D0,0x3FF8,0x7FFC,0x0000,
- };
-
- MOUSE_POINTER mouse_pointer_cross = {
- 0xFFFF,0xFFFF,0xFEFF,0xFC7F,0xFC7F,0xFC7F,
- 0xC007,0x8003,0xC007,0xFC7F,0xFC7F,0xFC7F,
- 0xFEFF,0xFFFF,0xFFFF,0xFFFF,
-
- 0x0000,0x0000,0x0000,0x0100,0x0100,0x0100,
- 0x0100,0x3EF8,0x0100,0x0100,0x0100,0x0100,
- 0x0000,0x0000,0x0000,0x0000,
-
- };
-
- /* Initialize mouse driver, return the number of buttons or 0 if no driver */
- int mouse_driver_init(void)
- {
- struct REGPACK regs;
-
- regs.r_ax = 0;
- regs.r_bx = 0;
- intr(0x33,®s);
- if (regs.r_ax==0)
- return 0;
- else
- return regs.r_bx;
- }
-
- void mouse_show_pointer(void)
- {
- struct REGPACK regs;
- regs.r_ax = 1;
- intr(0x33,®s);
- }
-
- void mouse_hide_pointer(void)
- {
- struct REGPACK regs;
- regs.r_ax = 2;
- intr(0x33,®s);
- }
-
- void mouse_get_pointer_xy(int *x, int *y)
- {
- struct REGPACK regs;
- regs.r_ax = 3;
- intr(0x33,®s);
- *x = regs.r_cx;
- *y = regs.r_dx;
- }
-
- void mouse_get_rel_pointer_xy(int *x, int *y)
- {
- struct REGPACK regs;
- regs.r_ax = 11;
- intr(0x33,®s);
- *x = regs.r_cx;
- *y = regs.r_dx;
- }
-
- int mouse_get_buttons(void)
- {
- struct REGPACK regs;
- regs.r_ax = 3;
- intr(0x33,®s);
- return regs.r_bx;
- }
-
- int mouse_get_presses(int buttons)
- {
- struct REGPACK regs;
- regs.r_ax = 5;
- regs.r_bx = buttons;
- intr(0x33,®s);
- return regs.r_bx;
- }
-
- int mouse_get_releases(int buttons)
- {
- struct REGPACK regs;
- regs.r_ax = 6;
- regs.r_bx = buttons;
- intr(0x33,®s);
- return regs.r_bx;
- }
-
- void mouse_set_pointer_xy(int x, int y)
- {
- struct REGPACK regs;
- regs.r_ax = 4;
- regs.r_cx = x;
- regs.r_dx = y;
- intr(0x33,®s);
- }
-
- void mouse_set_sensitivity(int x, int y)
- {
- struct REGPACK regs;
- regs.r_ax = 15;
- regs.r_cx = x;
- regs.r_dx = y;
- intr(0x33,®s);
- }
-
- void mouse_set_pointer_window(int a, int b, int c, int d)
- {
- struct REGPACK regs;
- regs.r_ax = 7;
- regs.r_cx = a; regs.r_dx = c;
- intr(0x33,®s);
- regs.r_ax = 8;
- regs.r_cx = b; regs.r_dx = d;
- intr(0x33,®s);
- }
-
- void mouse_disable_pointer_window(int a, int b, int c, int d)
- {
- struct REGPACK regs;
-
- regs.r_ax = 16;
- regs.r_cx = a; regs.r_dx = b; regs.r_si = c; regs.r_di = d;
- intr(0x33,®s);
- }
-
-
- void mouse_set_pointer_shape(int HotX, int HotY, MOUSE_POINTER shape)
- {
- struct REGPACK regs;
- regs.r_ax = 9;
- regs.r_bx = HotX;
- regs.r_cx = HotY;
- #if defined(_LARGE_) || defined(_HUGE_) || defined(_COMPACT_)
- regs.r_dx = FP_OFF(shape);
- regs.r_es = FP_SEG(shape);
- regs.r_ds = FP_SEG(shape);
- #else
- regs.r_dx = FP_OFF(shape);
- regs.r_es = _DS;
- regs.r_ds = _DS;
- #endif
- intr(0x33,®s);
- }
-
- void mouse_set_light_pen(int a)
- {
- struct REGPACK regs;
- if (a == 0)
- regs.r_ax = 14;
- else
- regs.r_ax = 13;
- intr(0x33,®s);
- }
-
- /** not tested **/
- void mouse_set_event_handler(int mask, void far (*proc)())
- {
- struct REGPACK regs;
- regs.r_ax = mask;
- regs.r_es = FP_SEG(proc); regs.r_dx = FP_OFF(proc);
- intr(0x33,®s);
- }
-
-
- /**********************************************************************
- * Initialize the mouse driver, set the pointer shape and pointer window.
- * Return: the number of buttons or 0 if no mouse detected
- **********************************************************************/
- int mouse_initialize(void)
- {
- int Buttons;
-
- Buttons = mouse_driver_init();
- if (Buttons!=0) {
- mouse_set_pointer_window(0,0,getmaxx(),getmaxy());
- mouse_set_pointer_shape(1,1,mouse_pointer_arrow);
- mouse_set_light_pen(0);
- mouse_show_pointer();
- }
- return Buttons;
- }
-
-