home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Shareware - Software Farm 2
/
wosw_2.zip
/
wosw_2
/
CPROG
/
CMOUSE.ZIP
/
CMOUSE.HPP
< prev
Wrap
C/C++ Source or Header
|
1991-04-02
|
8KB
|
293 lines
/*
cmouse.hpp
4-2-90
Microsoft mouse interrupt functions
Copyright 1991
John W. Small
All rights reserved
PSW / Power SoftWare
P.O. Box 10072
McLean, Virginia 22102 8072
(703) 759-3838
Works consulted:
"Microsoft Mouse Programmer's Reference."
Bellevue, Washington: Microsoft Press, 1989.
"Microsoft Mouse Programmer's Reference Guide."
Bellevue, Washington: Microsoft Press, 1986.
Refer to above works for mouse function
documentation.
*/
#ifndef CMOUSE_CPP
#define CMOUSE_CPP
typedef void interrupt (*MouseDriver)(...);
typedef void interrupt (*MouseHandler)(...);
#define MOUSE_INT 0x33
// mouse button designators
#define MBleft 1
#define MBright 2
// mouse events for callMask, altCallMask,
// eventMask, eventFlags
#define MEmoved 1
#define MEleftPressed 2
#define MEleftReleased 4
#define MErightPressed 8
#define MErightReleased 16
#define MEshiftPressed 32
#define MEctrlPressed 64
#define MEaltPressed 128
// mouse types
#define MTunknown 0
#define MTbus 1
#define MTserial 2
#define MTinPort 3
#define MTps2 4
#define MThp 5
// mouse error message languages
#define MLenglish 0
#define MLfrench 1
#define MLdutch 2
#define MLgerman 3
#define MLswedish 4
#define MLfinnish 5
#define MLspanish 6
#define MLportuguese 7
#define MLitalian 8
// Do not instantiate the MicrosoftMouse class!
// Reference MM.??? instead!
// Write appropriate fields in MM and call member function
// or call function and read appropriate fields.
// Use physical screen coordinates for all values not
// the mouse virtual coordinates. Conversion to/from
// mouse virtual coordinate is automatically handled
// by the class member functions.
class MicrosoftMouse {
static unsigned Xcell[];
static unsigned Ycell[];
static unsigned LeftTopOfs[];
// MF0, MF33 : Video mode at reset/softReset
// Call reset after all video mode changes!
unsigned vmode;
// MF21, MF22, MF23 : Used by save and restore
void * origState, * state;
unsigned stateSize;
// MF31, MF32 : Used by off/on
MouseDriver mouseIntrVector;
// condOff virtual coordinates
unsigned covx1, covy1, covx2, covy2;
public:
// MF0 : Set by reset
unsigned present;
unsigned buttons;
// MF3, MF5, MF6 : Button Status
unsigned leftPressed, rightPressed;
// MF3, MF4 : Mouse Positon
unsigned x, y;
// X & Y are physical, not virtual coordinates!
// Text modes upper left corner : 1,1
// Graphics modes upper left corner : 0,0
// MF5 : Button Press Information
unsigned lastLeftPressX, lastLeftPressY,
leftPresses;
unsigned lastRightPressX, lastRightPressY,
rightPresses;
// X & Y are physical, not virtual coordinates!
// MF5, MF6 : Button Requested
unsigned buttonRequested;
// MF6 : Button Release Information
unsigned lastLeftReleaseX, lastLeftReleaseY,
leftReleases;
unsigned lastRightReleaseX, lastRightReleaseY,
rightReleases;
// X & Y are physical, not virtual coordinates!
// MF11 : Mouse motion counters
unsigned vertMickeys, horzMickeys;
// MF12, MF20 : set/swapInterrupt(s) mask/addr
MouseHandler handler; // See MMautoEventHandler
unsigned callMask;
// Also used by autoEventUpdate.
// Set by Mouse Event Handler.
unsigned eventMask, eventFlags, eventCount,
eventMoved;
long eventTime;
long clickTimeOut;
long leftClickTime;
unsigned leftClicks;
long rightClickTime;
unsigned rightClicks;
// MF24, MF25 : set/getAltInterrupt mask/addr
MouseHandler altHandler; // See MMautoEventHandler
unsigned altCallMask;
// MF25 can read those set by MF20!
// MF26, MF27 : set/getSensitivity
unsigned horzPercent, vertPercent, doublePercent;
// MF29, MF30 : set/getCRTpage
unsigned crtPage;
// MF34, MF35 : Used by get/setLanguage
unsigned language;
// MF36 : Set by driver
unsigned driverVersion;
unsigned IRQ;
unsigned typeRequired;
MicrosoftMouse();
~MicrosoftMouse();
void reset(); /* MF0 */
void show() { _AX = 1; geninterrupt(MOUSE_INT); } /* MF1 */
void hide() { _AX = 2; geninterrupt(MOUSE_INT); } /* MF2 */
void updateStatusInfo(); /* MF3 */
void gotoxy(); /* MF4 */
void updatePressInfo(); /* MF5 */
void updateReleaseInfo(); /* MF6 */
void trap(unsigned x1, unsigned y1, /* MF7, MF8 */
unsigned x2, unsigned y2);
void graphicsCursor(signed char horzHS, /* MF9 */
signed char vertHS,
unsigned far *scrCurMask);
void softwareTextCursor( /* MF10 */
unsigned scrMask, unsigned curMask)
{ _BX = 0; _CX = scrMask; _DX = curMask;
_AX = 10; geninterrupt(MOUSE_INT); }
void updateMotionInfo() /* MF11 */
{ _AX = 11; geninterrupt(MOUSE_INT);
horzMickeys = _CX; vertMickeys = _DX; }
void setInterrupt() { /* MF12 */
_ES = FP_SEG(handler);
_DX = FP_OFF(handler);
_CX = callMask;
_AX = 12;
geninterrupt(MOUSE_INT);
}
void lightPenOn() /* MF13 */
{ _AX = 13; geninterrupt(MOUSE_INT); }
void lightPenOff() /* MF14 */
{ _AX = 14; geninterrupt(MOUSE_INT); }
void speed(unsigned horz, unsigned vert) /* MF15 */
{ _CX = horz; _DX = vert; _AX = 15;
geninterrupt(MOUSE_INT); }
void condOffZone(unsigned x1, unsigned y1,
unsigned x2, unsigned y2)
{
covx1 = virtualX(x1);
covy1 = virtualY(y1);
covx2 = virtualX(x2);
covy2 = virtualY(y2);
}
void condOff() /* MF16 */
{
_DI = covy2;
_SI = covx2;
_DX = covy1;
_CX = covx1;
_AX = 16;
geninterrupt(MOUSE_INT);
}
void doubleSpeedThreshold(unsigned mickeys) /* MF19 */
{ _DX = mickeys; _AX = 19;
geninterrupt(MOUSE_INT); }
void swapInterrupts(); /* MF20 */
void autoEventUpdate(); /* N/A */
void save(); /* MF21, MF22 */
void restore(); /* MF23 */
void setAltInterrupt() /* MF24 */
{
_ES = FP_SEG(altHandler);
_DX = FP_OFF(altHandler);
_CX = altCallMask;
_AX = 24;
geninterrupt(MOUSE_INT);
}
void getAltInterrupt() /* MF25 */
{
_CX = altCallMask;
_AX = 25;
geninterrupt(MOUSE_INT);
altHandler = (MouseHandler) MK_FP(_BX,_DX);
}
void clearAltInterrupts(); /* N/A */
void setSensitivity() /* MF26 */
{ _DX = doublePercent; _CX = vertPercent;
_BX = horzPercent; _AX = 26;
geninterrupt(MOUSE_INT); }
void getSensitivity() /* MF27 */
{ _AX = 27; geninterrupt(MOUSE_INT);
horzPercent = _BX; vertPercent = _CX;
doublePercent = _DX; }
void setInterruptRate(unsigned rate) /* MF28 */
{
if (typeRequired != MTinPort) return;
_BX = rate;
_AX = 28;
geninterrupt(MOUSE_INT);
}
void setCRTpage() /* MF29 */
{ _BX = crtPage; _AX = 29;
geninterrupt(MOUSE_INT); }
void getCRTpage() /* MF30 */
{ _AX = 30; geninterrupt(MOUSE_INT);
crtPage = _BX; }
void off(); /* MF31 */
void on(); /* MF32 */
void softReset(); /* MF33 */
void setLanguage() /* MF34 */
{ _BX = language; _AX = 34;
geninterrupt(MOUSE_INT); }
void getLanguage() /* MF35 */
{ _AX = 35; geninterrupt(MOUSE_INT);
language = _BX; }
void driver(); /* MF36 */
unsigned virtualX(unsigned x) {
return ((x - LeftTopOfs[vmode])
* Xcell[vmode]); }
unsigned virtualY(unsigned y) {
return ((y - LeftTopOfs[vmode])
* Ycell[vmode]); }
unsigned physicalX(unsigned x) {
return (x / Xcell[vmode]
+ LeftTopOfs[vmode]); }
unsigned physicalY(unsigned y) {
return (y / Ycell[vmode]
+ LeftTopOfs[vmode]); }
}; // MicrosoftMouse
#endif