'===========================================================================
' Subject: FREEWARE MOUSE ROUTINES            Date: 11-22-96 (21:52)       
'  Author: Mike Ginger                        Code: QB, PDS                
'  Origin: FidoNet QUIK_BAS Echo            Packet: MOUSE.ABC
'===========================================================================
' Note that you will need to invoke QuickBASIC with the '/L' option, ie:
'  QB /L
'$INCLUDE: 'c:\qb\qb.bi'
' Freeware from Mike Ginger

'---------------------------------------------------------------------

' *****************************************************************
' MOUSE Routines
' *****************************************************************

' First, determine if a Mouse is installed.
DECLARE FUNCTION MouseInstalled% ()

' ********************************************************
' Only if a Mouse IS Installed, may you use the following:
' ********************************************************

' Get the Number of Buttons.
DECLARE FUNCTION MouseButtons% ()

' Get the Driver Version Number.
DECLARE FUNCTION MouseVersion! ()

' Determine the Adaptor Type.
DECLARE FUNCTION MouseType$ ()

' Get the IRQ Number.
DECLARE FUNCTION MouseIRQ% ()

' Returns what Mouse Button(s) is being pressed.
DECLARE FUNCTION MouseGetButtonStatus! ()

' This SUB allows you to position the Mouse Cursor anywhere on the Screen.
DECLARE SUB MouseSetPosition (MX!, MY!)

' Allows you to turn the Mouse Cursor Off, when done.
DECLARE SUB MouseCursorOff ()

' To make the Mouse Cursor Visible, before displaying.
DECLARE SUB MouseCursorOn ()

' Allows you to set the Screen Limits, if you wish.
DECLARE SUB MouseSetLimits (MinX!, MinY!, MaxX!, MaxY!)

' Get the Cursor's Horizontal position.
DECLARE FUNCTION MouseGetXPos! ()

' Get the Cursor's Vertical position.
DECLARE FUNCTION MouseGetYPos! ()

' To ReSet the Mouse Cursor, before starting.
DECLARE SUB MouseReset ()

'---------------------------------------------------------------------

mouse:

CLS

LOCATE 3, 1

 ' Is a Mouse Installed?

 ' Don't even think about using the other MouseXXXXX SUBS and
 ' FUNCTIONS unless 'MouseInstalled%' returns True.

  PRINT "Is a Mouse Installed?    ";
 
  IF MouseInstalled% THEN       ' Yes, it is Installed.
	PRINT "Yes"
	PRINT
	PRINT "No. of Buttons:         "; MouseButtons%
	PRINT "Mouse Driver Version No."; MouseVersion!
	PRINT "Mouse Type               "; MouseType$
	PRINT "Mouse IRQ               "; MouseIRQ%

	MouseReset              ' Reset the Mouse Screen Position.

	WHILE pause$ <> CHR$(27)
	pause$ = INKEY$
	LOCATE 10, 1

	MouseCursorOn           ' Make the Mouse Cursor visible.

	PRINT "X Position (Column)  =  "; MouseGetXPos
	PRINT "Y Position (Row)     =  "; MouseGetYPos

	PRINT "Button(s) being Pressed: ";
	IF MouseGetButtonStatus = 1 THEN
		PRINT "Left             "
	ELSEIF MouseGetButtonStatus = 2 THEN
		PRINT "Right            "
	ELSEIF MouseGetButtonStatus = 3 THEN
		PRINT "Both Left & Right"
	ELSEIF MouseGetButtonStatus = 4 THEN
		PRINT "Middle           "
	ELSE
		PRINT "None             "
	END IF

	WEND

  MouseCursorOff                  ' When done, turn off the Mouse Cursor.

  ELSE
	PRINT "No "

	WHILE pause$ <> CHR$(27)
	pause$ = INKEY$
	WEND

  END IF

'GOTO MainMenu

'---------------------------------------------------------------------

FUNCTION MouseButtons%

   DIM InRegs AS RegType
   DIM OutRegs AS RegType


   IF (mouseg OR (mouse% - 2)) AND PEEK(mouse% - 2) <> 207 THEN

	InRegs.ax = &H0
	CALL INTERRUPT(&H33, InRegs, OutRegs)

	IF OutRegs.ax = &HFFFF THEN
		MouseButton% = VAL(HEX$(OutRegs.bx))
		
		SELECT CASE MouseButton%
		CASE 0: MouseButtons% = 3
		CASE 2: MouseButtons% = 2
		CASE 3: MouseButtons% = 3
		CASE 256: MouseButtons% = 2
		CASE ELSE: MouseButtons% = 0
		END SELECT

	END IF

   END IF

END FUNCTION

'*****************************************************************************
'**  This SUB turns the cursor off.                                         **
'*****************************************************************************
SUB MouseCursorOff
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX

  InRegs.ax = 2
  INTERRUPTX &H33, InRegs, OutRegs
 
END SUB

'*****************************************************************************
'**  This SUB turns the cursor on
'*****************************************************************************
SUB MouseCursorOn
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX
 
  InRegs.ax = 1
  INTERRUPTX &H33, InRegs, OutRegs

END SUB

'*****************************************************************************
'**  This SUB returns which button is being pressed.                        **
'**  Returns : 1    Left Button                                             **
'**            2    Right Button                                            **
'**            3    Both Buttons                                            **
'**            4    Middle Button                                           **
'*****************************************************************************
FUNCTION MouseGetButtonStatus
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX
 
  InRegs.ax = 3
  INTERRUPTX &H33, InRegs, OutRegs

  MouseGetButtonStatus = OutRegs.bx

END FUNCTION

'*****************************************************************************
'**  This SUB returns the current mouse XPosition                           **
'**  For graphics screens this returns a pixel position                     **
'**  It also returns a quasi-pixel position in text mode, to get the text   **
'**  position just divide this number by 8                                  **
'*****************************************************************************
FUNCTION MouseGetXPos
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX
 
  InRegs.ax = 3
  INTERRUPTX &H33, InRegs, OutRegs
  MouseGetXPos = OutRegs.cx

END FUNCTION

'*****************************************************************************
'**  This SUB returns the current mouse XPosition                           **
'**  For graphics screens this returns a pixel position                     **
'**  It also returns a quasi-pixel position in text mode, to get the text   **
'**  position just divide this number by 8                                  **
'*****************************************************************************
FUNCTION MouseGetYPos
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX
 
  InRegs.ax = 3
  INTERRUPTX &H33, InRegs, OutRegs
  MouseGetYPos = OutRegs.dx

END FUNCTION

FUNCTION MouseInstalled%

 ' Is a Mouse Installed?

 DEF SEG = 0

	p207 = PEEK(207): p206 = PEEK(206): p205 = PEEK(205): p204 = PEEK(204)
	mouseg = 256 * p207 + p206
	mouse% = 256 * p205 + p204 + 2
	DEF SEG = mouseg
	IF (mouseg OR (mouse% - 2)) AND PEEK(mouse% - 2) <> 207 THEN
	MouseInstalled% = 1
	END IF

DEF SEG

END FUNCTION

FUNCTION MouseIRQ%


   DIM InRegs AS RegType
   DIM OutRegs AS RegType

	InRegs.ax = &H24
	CALL INTERRUPT(&H33, InRegs, OutRegs)

   IF OutRegs.ax <> &HFFFF THEN
	  
	MouseIRQ% = VAL(HEX$(OutRegs.cx AND &HFF))

   END IF

END FUNCTION

  '*******************************************************************
  '**  This SUB resets the mouse driver and must be called before   **
  '**  you do any other mouse functions.  If not called the results **
  '**  are unpredictable                                            **
  '*******************************************************************
SUB MouseReset
 
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX
 
  SHARED NumberofButtons
  InRegs.ax = 0
  INTERRUPTX &H33, InRegs, OutRegs
  NumberofButtons = OutRegs.bx

END SUB

  '****************************************************************
  '**  This lets you define the area that the mouse can move in. **
  '**  The default is the entire screen                          **
  '****************************************************************
SUB MouseSetLimits (MinX, MinY, MaxX, MaxY)
 
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX
 
  InRegs.ax = 7
  InRegs.cx = MinX
  InRegs.dx = MaxX
  INTERRUPTX &H33, InRegs, OutRegs
  InRegs.ax = 8
  InRegs.cx = MinY
  InRegs.dx = MaxY
  INTERRUPTX &H33, InRegs, OutRegs

END SUB

  '************************************************************
  '**  This SUB allows you to put the mouse cursor anywhere  **
  '**  on the screen that you want.                          **
  '************************************************************
SUB MouseSetPosition (MX, MY)
 
  DIM InRegs AS RegTypeX
  DIM OutRegs AS RegTypeX
 
  InRegs.ax = 4
  InRegs.cx = MX
  InRegs.dx = MY
  INTERRUPTX &H33, InRegs, OutRegs

END SUB

FUNCTION MouseType$

   DIM InRegs AS RegType
   DIM OutRegs AS RegType

	InRegs.ax = &H24
	CALL INTERRUPT(&H33, InRegs, OutRegs)

   IF OutRegs.ax <> &HFFFF THEN
	  
	MousType% = VAL(HEX$(OutRegs.cx \ 256))
	 SELECT CASE MousType%
	  CASE 1: MouseType$ = "Bus"
	  CASE 2: MouseType$ = "Serial"
	  CASE 3: MouseType$ = "InPort"
	  CASE 4: MouseType$ = "PS/2"
	  CASE 5: MouseType$ = "HP"
	  CASE ELSE: MouseType$ = "Unknown"
	 END SELECT

   END IF

END FUNCTION

FUNCTION MouseVersion!

   DIM InRegs AS RegType
   DIM OutRegs AS RegType

	InRegs.ax = &H24
	CALL INTERRUPT(&H33, InRegs, OutRegs)

	IF OutRegs.ax <> &HFFFF THEN
    
	MouseMajVer = OutRegs.bx \ &H100
	MouseMinVer = OutRegs.bx AND &HFF
	MouseVersion! = (MouseMinVer + (100 * MouseMajVer)) / 100

	END IF

END FUNCTION
