Category : Files from Magazines
Archive   : ITP9005.ZIP
Filename : MOUSE.PAS

 
Output of file : MOUSE.PAS contained in archive : ITP9005.ZIP

UNIT Mouse;

{Program: Master Mouse Routine Library}

INTERFACE

USES DOS;

CONST

{Button press definitions}

PrL = 1;
PrR = 2;
PrLr = 3;
PrM = 4;
PrLM = 5;
PrMR = 6;
PrAll = 7;
PrNone = 0;

{Button definitions}

ButtonLeft = 0;
ButtonRight = 1;
ButtonMiddle = 2;


FUNCTION ThereIsAMouse: Boolean;
FUNCTION MouseReset: Boolean;
FUNCTION GetMouseStatus
(VAR MPosX, MPosY: Byte): Byte;

PROCEDURE ClearButton (Button: Byte);
PROCEDURE MouseOn;
PROCEDURE MouseOff;
PROCEDURE SetMouseSoftCursor
(MouseChar, MouseFGColor, MouseBGColor: Byte);

IMPLEMENTATION

CONST
MouseIntr = $33;

VAR
MouseVisible : Boolean;
MHMax, MVMax, MHCell, MVCell : Word;
Regs : Registers;

PROCEDURE MouseHandler (A, B, C, D: Byte);
BEGIN
WITH Regs DO
BEGIN
ax := A;
bx := B;
cx := C;
dx := D;
Intr(MouseIntr, Regs)
END
END;

FUNCTION GetButtonUpStatus
(Button: Byte;VAR MPosX, MPosY: Word): Boolean;

BEGIN
WITH Regs DO
BEGIN
ax := 6;
bx := Button;
MouseHandler(ax, bx, 0, 0);
MPosX := cx DIV MHCell + 1;
MPosY := dx DIV MVCell + 1;
IF ax = 0 THEN
GetButtonUpStatus := TRUE
ELSE
GetButtonUpStatus := FALSE
END
END;

PROCEDURE ClearButton (Button: Byte);
VAR
MPosX,MPosY: Word;

BEGIN
REPEAT UNTIL
GetButtonUpStatus(Button, MPosX,MPosY)
END;

FUNCTION GetMouseStatus
(VAR MPosX, MPosY: Byte): Byte;
BEGIN
WITH Regs DO
BEGIN
ax := 3;
MouseHandler(ax, 0, 0, 0);
GetMouseStatus := bx;
MPosX := cx DIV MHCell + 1;
MPosY := dx DIV MVCell + 1
END
END;

PROCEDURE MouseOff;
BEGIN
IF MouseVisible THEN
BEGIN
MouseHandler(2, 0, 0, 0);
MouseVisible := FALSE
END
END;

PROCEDURE MouseOn;
BEGIN
IF NOT MouseVisible THEN
BEGIN
MouseHandler(1, 0, 0, 0);
MouseVisible := TRUE
END
END;

FUNCTION MouseReset: Boolean;
BEGIN
MHMax := 639; {Max virtual horizontal pos}
MVMax := 199; {Max virtual vertical pos}
MHCell := 8; {Mouse horizontal cell width}
MVCell := 8; {Mouse vertical cell height}
MouseHandler(0, 0, 0, 0);
IF Regs.ax = 0 THEN
MouseReset := FALSE
ELSE
MouseReset := TRUE;
MouseVisible := FALSE
END;

PROCEDURE SetMouseSoftCursor
(MouseChar, MouseFGColor, MouseBGColor: Byte);
BEGIN
MouseOn;
Regs.ax := 10;
Regs.bx := 0; {Select software cursor}
{Screen Mask Value (don't change character)}
Regs.cx := $8800;
Regs.dx := $8800 + MouseBGColor * 4096 +
MouseFGColor * 256 + MouseChar;
Intr($33,Regs);
MouseOff
END;

FUNCTION ThereIsAMouse: Boolean;
CONST
IRET = 207;
VAR
MouseSegment : Word ABSOLUTE $0000:$00CE;
MouseOffset : Word ABSOLUTE $0000:$00CC;
MouseInstruction: Byte;
BEGIN
IF (MouseSegment = 0) AND
(MouseOffset = 0) THEN
ThereIsAMouse := FALSE
ELSE
BEGIN
MouseInstruction :=
MEM[MouseSegment:MouseOffset];
IF MouseInstruction = IRET THEN
ThereIsAMouse := FALSE
ELSE
ThereIsAMouse := TRUE
END
END;

{No initialization section}

END.