* new mouse uni

This commit is contained in:
Jonas Maebe 1998-07-15 16:10:35 +00:00
parent 6d4bdf4e02
commit 9d1f36f36a

View File

@ -3,8 +3,6 @@
This file is part of the Free Pascal run time library. This file is part of the Free Pascal run time library.
Copyright (c) 1993,97 by the Free Pascal development team Copyright (c) 1993,97 by the Free Pascal development team
Mouse unit containing allmost all interrupt 33h functions
See the file COPYING.FPC, included in this distribution, See the file COPYING.FPC, included in this distribution,
for details about the copyright. for details about the copyright.
@ -18,63 +16,95 @@ Unit Mouse;
Interface Interface
{ {
Mouse support functions and procedures,with error checking if mouse Mouse support functions and procedures, with error checking: if mouse
isn't present then the routine ends,if you want to remove error checking isn't present then the routine ends. If you want to remove error checking,
remove the next define. remove the next define.
} }
{$DEFINE MOUSECHECK} {$DEFINE MOUSECHECK}
{check if mouse is present and sets the mouse variable} {initializes the mouse with the default values for the current screen mode}
Function Check_Mouse:Boolean; Function InitMouse:Boolean;
{shows mouse pointer,text+graphics screen support} {shows mouse pointer,text+graphics screen support}
Procedure Show_Mouse; Procedure ShowMouse;
{hides mouse pointer} {hides mouse pointer}
Procedure Hide_Mouse; Procedure HideMouse;
{reads mouse position in pixels,divide by 8 to get text position,and reads
buttons state(1-left button,2=right button,7=middle button)} {reads mouse position in pixels (divide by 8 to get text position in standard
Procedure read_mouse (var x,y:Longint;var buttons:Longint); text mode) and reads the buttons state:
{sets mouse pointer in text mode} bit 1 set -> left button pressed
Procedure Mouse_Cur(X,Y:Longint); bit 2 set -> right button pressed
{sets the mouse shape in text mode} bit 3 set -> middle button pressed
Procedure Mouse_Shape(BackColor,ForColor,Ascii:LongInt); Have a look at the example program in the manual to see how you can use this}
{sets the mouse ascii in text mode} Procedure GetMouseState(var x,y, buttons :Longint);
Procedure Mouse_Ascii(Ascii:LongInt);
{returns which button was pressed after last call to function} {returns true if the left button is pressed}
Function mouse_press(var x,y:Longint;button:Longint):Longint; Function LPressed:Boolean;
{returns which button was realeased after last call to function}
Function mouse_release (var x,y:Longint;button:Longint):integer; {returns true if the right button is pressed}
{set's mouse y range} Function RPressed:Boolean;
Procedure mouse_yrange (min,max:Longint);
{set's mouse y range} {returns true if the middle button is pressed}
Procedure mouse_xrange (min,max:Longint); Function MPressed:Boolean;
{set mouse speed}
Procedure Micky(Horizontal ,Vertical:Longint); {positions the mouse pointer}
{set rectangle on screen that mouse will disappear if will point on it} Procedure SetMousePos(x,y:Longint);
Procedure Unseen_Mouse(x1,y1,x2,y2:Longint);
{return if right button pressed} {returns at which position "button" was last pressed in x,y and returns the
Function IsRPressed:Boolean; number of times this button has been pressed since the last time this
{return if left button pressed} function was called with "button" as parameter. For button you can use the
Function IsLPressed:Boolean; LButton, RButton and MButton constants for resp. the left, right and middle
{return if middle button pressed} button}
Function IsMPressed:Boolean; Function GetLastButtonPress(button:Longint;var x,y:Longint): Longint;
{return mouse X coordinate in textmode}
Function MouseX:longint; {returns at which position "button" was last released in x,y and returns the
{return mouse Y coordinate in textmode} number of times this button has been re since the last time. For button
Function MouseY:longint; you can use the LButton, RButton and MButton constants for resp. the left,
{return which mouse buttons are pressed, only in bit 0-2} right and middle button}
Function MouseButtons:longint; Function GetLastButtonRelease (button : Longint; var x,y:Longint): Longint;
{set window for mouse}
Procedure MWindow(x1,y1,x2,y2:Longint); {sets mouse's x range, with Min and Max resp. the higest and the lowest
column (in pixels) in between which the mouse cursor can move}
Procedure SetMouseXRange (Min,Max:Longint);
{sets mouse's y range, with Min and Max resp. the higest and the lowest
row (in pixels) in between which the mouse cursor can move}
Procedure SetMouseYRange (Min,Max:Longint);
{set the window coordinates in which the mouse cursor can move}
Procedure SetMouseWindow(x1,y1,x2,y2:Longint);
{sets the mouse shape in text mode: background and foreground color and the
Ascii value with which the character on screen is XOR'ed when the cursor
moves over it. Set to 0 for a "transparent" cursor}
Procedure SetMouseShape(ForeColor,BackColor,Ascii:Byte);
{sets the mouse ascii in text mode. The difference between this one and
SetMouseShape, is that the foreground and background colors stay the same
and that the Ascii code you enter is the character that you will get on
screen; there's no XOR'ing}
Procedure SetMouseAscii(Ascii:Byte);
{set mouse speed in mickey's/pixel; default: horizontal: 8; vertical: 16}
Procedure SetMouseSpeed(Horizontal ,Vertical:Longint);
{set a rectangle on screen that mouse will disappear if it is moved into}
Procedure SetMouseHideWindow(x1,y1,x2,y2:Longint);
Const LButton = 1; {left button}
RButton = 2; {right button}
MButton = 4; {middle button}
Var Var
MouseFound:Boolean; MouseFound: Boolean;
Implementation Implementation
{$I386_ATT} {$I386_ATT}
Function Check_Mouse:Boolean; Function InitMouse: Boolean;
begin begin
asm asm
xorl %eax,%eax xorl %eax,%eax
@ -83,13 +113,12 @@ begin
popl %ebp popl %ebp
cmpw $0xffff,%ax cmpw $0xffff,%ax
setz %al setz %al
movb %al,MouseFound
movb %al,__RESULT movb %al,__RESULT
end; end;
end; end;
procedure show_mouse; Procedure ShowMouse;
begin begin
{$IFDEF MOUSECHECK} {$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit; If (Not MouseFound) Then Exit;
@ -102,7 +131,7 @@ begin
end; end;
end; end;
procedure hide_mouse; Procedure HideMouse;
begin begin
{$IFDEF MOUSECHECK} {$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit; If (Not MouseFound) Then Exit;
@ -115,7 +144,7 @@ begin
end; end;
end; end;
procedure read_mouse (var x,y,buttons:Longint); Procedure GetMouseState(var x,y,buttons:Longint);
begin begin
{$IFDEF MOUSECHECK} {$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit; If (Not MouseFound) Then Exit;
@ -136,164 +165,23 @@ begin
end; end;
end; end;
function mouse_press(var x,y:Longint;button:Longint):Longint; Function LPressed:Boolean;
begin Begin
{$IFDEF MOUSECHECK} {$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit; If (Not MouseFound) Then Exit;
{$ENDIF} {$ENDIF}
asm asm
movl $5,%eax movl $3,%eax
movl button,%ebx
pushl %ebp pushl %ebp
int $0x33 int $0x33
popl %ebp popl %ebp
andl $0xffff,%ecx movl %ebx,%eax
andl $0xffff,%edx andl $1,%eax
movl x,%ebx movb %al,__RESULT
movl %ecx,(%ebx)
movl y,%ebx
movl %edx,(%ebx)
movl %eax,__RESULT
end; end;
end; end;
function mouse_release (var x,y:Longint;button : Longint):integer; Function RPressed:Boolean;
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $6,%eax
movl button,%ebx
pushl %ebp
int $0x33
popl %ebp
andl $0xffff,%ecx
andl $0xffff,%edx
movl x,%ebx
movl %ecx,(%ebx)
movl y,%ebx
movl %edx,(%ebx)
movl %eax,__RESULT
end;
end;
procedure mouse_yrange (min,max:Longint);
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $8,%eax
movl min,%ecx
movl max,%edx
pushl %ebp
int $0x33
popl %ebp
end;
end;
procedure mouse_xrange (min,max:Longint);
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $7,%eax
movl min,%ecx
movl max,%edx
pushl %ebp
int $0x33
popl %ebp
end;
end;
Procedure Mouse_Cur(X,Y:Longint);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $4,%eax
movl X,%ecx
movl Y,%edx
shll $3,%ecx
shll $3,%edx
pushl %ebp
int $0x33
popl %ebp
End;
End;
Procedure Mouse_Shape(BackColor,ForColor,Ascii:LongInt);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
xorl %ebx,%ebx
movl $0xa,%eax
movl $0xff,%ecx
xorl %edx,%edx
movb 8(%ebp),%dh
shlb $4,%dh
addb ForColor,%dh
pushl %ebp
int $0x33
popl %ebp
End;
End;
Procedure Mouse_Ascii(Ascii:LongInt);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
xorl %ebx,%ebx
movl $0xa,%eax
movl $0xff00,%ecx
xorl %edx,%edx
movb 8(%ebp),%dl
pushl %ebp
int $0x33
popl %ebp
End;
End;
Procedure Unseen_Mouse(x1,y1,x2,y2:Longint);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $0x0010,%eax
movl x1,%ecx
movl y1,%edx
movl x2,%esi
movl y2,%edi
pushl %ebp
int $0x33
popl %ebp
end;
End;
Procedure Micky(Horizontal ,Vertical:Longint);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $0x0f,%eax
movl Horizontal,%ecx
movl Vertical,%edx
pushl %ebp
int $0x33
popl %ebp
end;
End;
Function IsRPressed:Boolean;
Begin Begin
{$IFDEF MOUSECHECK} {$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit; If (Not MouseFound) Then Exit;
@ -310,23 +198,7 @@ Begin
end; end;
end; end;
Function IsLPressed:Boolean; Function MPressed:Boolean;
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $3,%eax
pushl %ebp
int $0x33
popl %ebp
movl %ebx,%eax
andl $1,%eax
movb %al,__RESULT
end;
end;
Function IsMPressed:Boolean;
Begin Begin
{$IFDEF MOUSECHECK} {$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit; If (Not MouseFound) Then Exit;
@ -343,73 +215,208 @@ Begin
end; end;
end; end;
function MouseX:longint; Procedure SetMousePos(x,y:Longint);
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $3,%eax
pushl %ebp
int $0x33
popl %ebp
movzwl %cx,%eax
shrl $3,%eax
incl %eax
movl %eax,__RESULT
end;
end;
function MouseY:longint;
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $3,%eax
pushl %ebp
int $0x33
popl %ebp
movzwl %dx,%eax
shrl $3,%eax
incl %eax
movl %eax,__RESULT
end;
end;
function MouseButtons:longint;
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $3,%eax
pushl %ebp
int $0x33
popl %ebp
movl %ebx,%eax
andl $7,%eax
movl %eax,__RESULT
end;
end;
Procedure MWindow(x1,y1,x2,y2:Longint);
Begin Begin
{$IFDEF MOUSECHECK} {$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit; If (Not MouseFound) Then Exit;
{$ENDIF} {$ENDIF}
mouse_xrange(x1,x2); asm
mouse_yrange(y1,y2); movl $4,%eax
movl x,%ecx
movl y,%edx
pushl %ebp
int $0x33
popl %ebp
End;
End;
Function GetLastButtonPress(Button: Longint;var x,y:Longint):Longint;
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $5,%eax
movl button,%ebx
shrl $1, %ebx {0 = left, 1 = right, 2 = middle}
pushl %ebp
int $0x33
popl %ebp
andl $0xffff,%ebx
andl $0xffff,%edx
andl $0xffff,%ecx
movl %ebx, __RESULT
movl x,%eax
movl %ecx,(%eax)
movl y,%eax
movl %edx,(%eax)
end;
end;
Function GetLastButtonRelease (button : Longint; var x,y:Longint): Longint;
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $6,%eax
movl button,%ebx
shrl $1, %ebx {0 = left, 1 = right, 2 = middle}
pushl %ebp
int $0x33
popl %ebp
andl $0xffff,%ebx
andl $0xffff,%ecx
andl $0xffff,%edx
movl %ebx,__RESULT
movl x,%eax
movl %ecx,(%eax)
movl y,%eax
movl %edx,(%eax)
end;
end;
Procedure SetMouseXRange (Min,Max:Longint);
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $7,%eax
movl min,%ecx
movl max,%edx
pushl %ebp
int $0x33
popl %ebp
end;
end;
Procedure SetMouseYRange (min,max:Longint);
begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $8,%eax
movl min,%ecx
movl max,%edx
pushl %ebp
int $0x33
popl %ebp
end;
end;
Procedure SetMouseWindow(x1,y1,x2,y2:Longint);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
SetMouseXRange(x1,x2);
SetMouseYRange(y1,y2);
End;
Procedure SetMouseShape(ForeColor,BackColor,Ascii:Byte);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
xorl %ebx,%ebx
movl $0xa,%eax
movl $0xffff,%ecx
xorl %edx,%edx
movb BackColor,%dh
shlb $4,%dh
addb ForeColor,%dh
movb Ascii,%dl
pushl %ebp
int $0x33
popl %ebp
End;
End;
Procedure SetMouseAscii(Ascii:byte);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
xorl %ebx,%ebx
movl $0xa,%eax
movl $0xff00,%ecx
xorl %edx,%edx
movb Ascii,%dl
pushl %ebp
int $0x33
popl %ebp
End;
End;
Procedure SetMouseHideWindow(x1,y1,x2,y2:Longint);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $0x0010,%eax
movl x1,%ecx
movl y1,%edx
movl x2,%esi
movl y2,%edi
pushl %ebp
int $0x33
popl %ebp
end;
End;
Procedure SetMouseSpeed(Horizontal,Vertical:Longint);
Begin
{$IFDEF MOUSECHECK}
If (Not MouseFound) Then Exit;
{$ENDIF}
asm
movl $0x0f,%eax
movl Horizontal,%ecx
movl Vertical,%edx
pushl %ebp
int $0x33
popl %ebp
end;
End; End;
Begin Begin
Check_Mouse; MouseFound := InitMouse;
End. End.
{ {
$Log$ $Log$
Revision 1.4 1998-05-22 00:39:25 peter Revision 1.5 1998-07-15 16:10:35 jonas
* go32v1, go32v2 recompiles with the new objects * new mouse uni
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
Revision 1.3 1998/04/05 13:56:54 peter
- fixed mouse to compile with $i386_att
+ linux crt supports redirecting (not Esc-codes anymore)
Revision 1.2 1998/03/26 12:25:22 peter
* integrated both mouse units
Revision 1.1.1.1 1998/03/25 11:18:41 root
* Restored version
Revision 1.4 1998/03/24 15:53:12 peter
* cleanup and doesn't give warnings when compiling
Revision 1.3 1998/01/26 11:56:24 michael
+ Added log at the end
Revision 1.2
date: 1997/12/01 12:15:45; author: michael; state: Exp; lines: +14 -12
+ added copyright reference in header.
Revision 1.1
date: 1997/11/27 08:33:49; author: michael; state: Exp;
Initial revision
Revision 1.1.1.1
date: 1997/11/27 08:33:49; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
} }