UNIT MOUSE;
{
	Mouse
	- by Bjarke Viksoe

	One of the standard "hey, I can handle the mouse, too" units.
}


INTERFACE

function InitMouse : boolean;
{Initialize mouse to its default values for current screenmode.
 Mouse is turned off.
 Returns TRUE if mouse is present.}
function MouseDriverPresent : boolean;
{Returns TRUE if there were a mouse driver out there...}
procedure MouseOn;
{Turns mouse image on}
procedure MouseOff;
{Turns mouse image off}
procedure MouseInfo(VAR x,y : integer; VAR lb,rb : boolean);
{Get information about current x- and y-positions.
 Also return info about current status of mouse buttons}
function LeftButton : boolean;
{Retuns TRUE if left mouse button is pressed}
function RightButton : boolean;
{Retuns TRUE if right mouse button is pressed}
procedure LastButtonPress(button : integer; VAR x,y : integer);
{Returns last x/y mouse pos when 'button' was pressed}
procedure LastButtonRelease(button : integer; VAR x,y : integer);
{Returns last x/y mouse pos when 'button' was released}
procedure SetMousePos(x,y : integer);
{Set mouse position on screen...}
procedure SetMouseWindow(x1,y1,x2,y2 : integer);
{Set mouse window limit}
procedure SetMouseImage(hotx,hoty : integer; Image : pointer);
{Change mouse pointer image.
 "Hot?" ranges from -16 to 16
 "Image" is 16 words of mask + 16 words of image}
procedure ReadMouseMotionCounters(VAR x,y : integer);
{Read mouse's motion counters}
procedure DefineMouseRatio(h,v : word);
{Change mouse Mickey/pixel ratio}


IMPLEMENTATION

function InitMouse : boolean; assembler;
asm
	xor	ax,ax
	int	$33
	not	ax
	xor	ax,1
	and	ax,1
end;

function MouseDriverPresent : boolean; assembler;
asm
	mov	ax,$21 {try to reset mouse}
	int	$33
	cmp	ax,-1
	je		@found
	mov	ax,$0	{not there. might be bad driver version... try setup mouse}
	int	$33
	push	ax
	mov	ax,$2	{quickly hide it again}
	int	$33
	pop	ax
@found:
	inc	ax
	xor	ax,1
end;

procedure MouseOn; assembler;
asm
	mov	ax,$0001
	int	$33
end;

procedure MouseOff; assembler;
asm
	mov	ax,$0002
	int	$33
end;

procedure MouseInfo(VAR x,y : integer; VAR lb,rb : boolean); assembler;
asm
	mov	ax,$0003
	int	$33
	les	si,x
	mov	[es:si],cx
	les	si,y
	mov	[es:si],dx

	mov	ax,bx
	and	al,1
	les	si,lb
	mov	[es:si],al
	shr	bl,1
	and	bl,1
	les	si,rb
	mov	[es:si],bl
end;

function LeftButton : boolean; assembler;
asm
	mov	ax,3
	int	$33
	mov	ax,bx
	and	ax,1
end;

function RightButton : boolean; assembler;
asm
	mov	ax,3
	int	$33
	mov	ax,bx
	shr	ax,1
	and	ax,1
end;

procedure LastButtonPress(button : integer; VAR x,y : integer); assembler;
asm
	mov	ax,5
	mov	bx,button
	int	$33
	les	di,x
	mov	[es:di],cx
	les	di,y
	mov	[es:di],dx
end;

procedure LastButtonRelease(button : integer; VAR x,y : integer); assembler;
asm
	mov	ax,6
	mov	bx,button
	int	$33
	les	di,x
	mov	[es:di],cx
	les	di,y
	mov	[es:di],dx
end;

procedure SetMousePos(x,y : integer); assembler;
asm
	mov	ax,$0004
	mov	cx,x
	mov	dx,y
	int	$33
end;

procedure SetMouseWindow(x1,y1,x2,y2 : integer); assembler;
asm
	mov	ax,$0007
	mov	cx,x1
	mov	dx,x2
	int	$33
	mov	ax,$0008
	mov	cx,y1
	mov	dx,y2
	int	$33
end;

procedure SetMouseImage(hotx,hoty : integer; Image : pointer); assembler;
asm
	mov	ax,$0009
	mov	bx,hotx
	mov	cx,hoty
	les	dx,Image
	int	$33
end;

procedure DefineMouseRatio(h,v : word); assembler;
asm
	mov	ax,$000F
	mov	cx,h
	mov	dx,v
	int	$33
end;

procedure ReadMouseMotionCounters(VAR x,y : integer); assembler;
asm
	mov	ax,$000B
	int	$33
	les	di,x
	mov	[es:di],cx
	les	di,y
	mov	[es:di],dx
end;


end.
