[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]

    (*
                                   Mouse Functions
                                   ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

              I am relesing this source into the Public Domain. You are
              free to use and/or modify this code as you wish.
              This code is being released as-is, and should be at your
              own risk. Liberty Software, and myself are not responsible
              for what it may or may not do on your system.

              Written on : 02/25/95, by: Tim E. Rhodes - Liberty Software
    *)
    Unit MsFuncs;
    Interface
    Uses Dos,Crt;
    Var
     MSAvailable  : Boolean; {True if Mouse Available}
     MsButtons    : Integer; {Number of buttons if Mouse Available}
     MsLastX      : Word;    {Filled by MsGetPos,Ms*Pressed and Ms*Released}
     MsLastY      : Word;    {Filled by MsGetPos,Ms*Pressed and Ms*Released}
     Count        :Word;
    Procedure MsInit;                  {0000h RESET DRIVER AND READ STATUS}
    Procedure MsShow;                  {0001h SHOW MOUSE CURSOR}
    Procedure MsHide;                  {0002h HIDE MOUSE CURSOR}
    Procedure MsGetPos;                {0003h RETURN POSITION AND BUTTON STATUS}
                                       {      Fills MsPosX, and MsPosY}
    Function MsWhereX:Word;            {0003h RETURN MOUSE COLUMN POSITION}
    Function MsWhereY:Word;            {0003h RETURN MOUSE ROW POSITION}
    Function MsLeftDown:Boolean;       {0003h RETURN TRUE IF LEFT BUTTON DOWN}
    Function MsRightDown:Boolean;      {0003h RETURN TRUE IF RIGHT BUTTON DOWN}
    Function MsBothDown:Boolean;       {0003h RETURN TRUE IF BOTH BUTTONS DOWN}
    Function MsMiddleDown:Boolean;     {0003h RETURN TRUE IF MIDDLE BUTTON DOWN}
    Procedure MsGotoXY(X,Y:Word);      {0004h POSITION MOUSE CURSOR}
    Function MsLeftPressed:Boolean;    {0005h RETURN TRUE IF LEFT BUTTON PRESSED}
    Function MsRightPressed:Boolean;   {0005h RETURN TRUE IF RIGHT BUTTON PRESSED}
    Function MsBothPressed:Boolean;    {0005h RETURN TRUE IF BOTH BUTTONS PRESSED}
    Function MsMiddlePressed:Boolean;  {0005h RETURN TRUE IF MIDDLE BUTTON PRESSED}
    Function MsLeftReleased:Boolean;   {0006h RETURN TRUE IF LEFT BUTTON RELEASED}
    Function MsRightReleased:Boolean;  {0006h RETURN TRUE IF RIGHT BUTTON RELEASED}
    Function MsBothReleased:Boolean;   {0006h RETURN TRUE IF BOTH BUTTONS RELEASED}
    Function MsMiddleReleased:Boolean; {0006h RETURN TRUE IF MIDDLE BUTTON RELEASED}
    Procedure MsWindow(X,Y,X1,Y1:Word);{0007h DEFINE HORIZONTAL CURSOR RANGE}
                                       {  and 0008h  VERTICAL CURSOR RANGE}
                            {NOT USED - 0009h DEFINE GRAPHICS CURSOR - NOT USED}
    Procedure MsAttr(ScreenMask,CursorMask:Word);
                                       {000Ah DEFINE TEXT CURSOR - SOFTWARE}
    Procedure MsSize(StartScan,EndScan:Word);
                                       {000Ah DEFINE TEXT CURSOR - HARDWARE}
    Implementation
    Var
     SavedExitPtr : Pointer;
     Regs         : Registers;
     TempWord     : Word;
    Procedure MsInit;Assembler;
     Asm
              MOV MSAvailable,False
              MOV MsButtons,0
              MOV AX,0000h
              INT 33h
              CMP AX,0000h
               JE @Done
              CMP AX,0FFFFh
              JNE @Done
              MOV MsAvailable,True
              CMP BX,0002h
               JE @Two
              CMP BX,0003h
               JE @Three
              CMP BX,0FFFFh
               JE @Three
        @Two: MOV MsButtons,2
              JMP @Done
      @Three: MOV MsButtons,3
              JMP @Done
       @Done:
     End;
    Procedure MsShow;Assembler;
     Asm
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0001h
             INT 33h
      @Done:
     End;
    Procedure MsHide;Assembler;
     Asm
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0002h
             INT 33h
      @Done:
     End;
    Procedure MsGetPos;
     Begin
      Asm
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0003h
              INT 33h
              MOV MsLastX,CX
              MOV MsLastY,DX
       @Done:
      End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
     End;

    Function MsWhereX:Word;
     Begin
      Asm
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0003h
              INT 33h
              MOV TempWord,CX
       @Done:
      End;
      MsWhereX:=(TempWord DIV 8)+1;{Converts XPos to 80 column test mode}
     End;
    Function MsWhereY:Word;
     Begin
      Asm
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0003h
              INT 33h
              MOV TempWord,DX
       @Done:
      End;
      MsWhereY:=(TempWord DIV 8)+1;{Converts YPos to 25 Row text mode}
     End;
    Function MsLeftDown:Boolean;
     Begin
      Asm
              MOV @Result,False
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0003h
              INT 33h
              MOV MsLastX,CX
              MOV MsLastY,DX
              CMP BX,1
              JNE @Done
              MOV @Result,True
       @Done:
      End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
     End;
    Function MsRightDown:Boolean;
     Begin
      Asm
              MOV @Result,False
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0003h
              INT 33h
              MOV MsLastX,CX
              MOV MsLastY,DX
              CMP BX,2
              JNE @Done
              MOV @Result,True
       @Done:
      End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
     End;
    Function MsBothDown:Boolean;
     Begin
      Asm
              MOV @Result,False
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0003h
              INT 33h
              MOV MsLastX,CX
              MOV MsLastY,DX
              CMP BX,3
              JNE @Done
              MOV @Result,True
       @Done:
      End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
     End;
    Function MsMiddleDown:Boolean;
     Begin
      Asm
              MOV @Result,False
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0003h
              INT 33h
              MOV MsLastX,CX
              MOV MsLastY,DX
              CMP BX,4
              JNE @Done
              MOV @Result,True
       @Done:
      End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
     End;

    Procedure MsGotoXY(X,Y:Word);
     Begin
      X:=(X-1)*8;{Convert 80 Column text mode to pixels}
      Y:=(Y-1)*8;{Convert 25 Row text mode to pixels}
      Asm
              CMP MsAvailable,True
              JNE @Done
              MOV AX,0004h
              MOV CX,X
              MOV DX,Y
              INT 33h
       @Done:
      End;
     End;
    Function MsLeftPressed:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0005h
             MOV BX,0000h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,1
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;
    Function MsRightPressed:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0005h
             MOV BX,0001h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,2
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;
    Function MsBothPressed:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0005h
             MOV BX,0002h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,3
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;
    Function MsMiddlePressed:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0005h
             MOV BX,0002h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,4
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;
    Function MsLeftReleased:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0006h
             MOV BX,0000h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,1
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;

    Function MsRightReleased:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0006h
             MOV BX,0001h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,2
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;
    Function MsBothReleased:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0006h
             MOV BX,0002h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,3
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;
    Function MsMiddleReleased:Boolean;
    Begin
     Asm
             MOV @Result,False
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0006h
             MOV BX,0002h
             INT 33h
             MOV Count,BX
             MOV MsLastX,CX
             MOV MsLastY,DX
             CMP AX,4
             JNE @Done
             MOV @Result,True
      @Done:
     End;
      MsLastX:=(MsLastX DIV 8)+1;{Converts XPos to 80 column test mode}
      MsLastY:=(MsLastY DIV 8)+1;{Converts YPos to 25 Row text mode}
    End;
    Procedure MsWindow(X,Y,X1,Y1:Word);
    Begin
      X:=(X-1)*8;{Convert 80 Column text mode to pixels}
      Y:=(Y-1)*8;{Convert 25 Row text mode to pixels}
      X1:=(X1-1)*8;{Convert 80 Column text mode to pixels}
      Y1:=(Y1-1)*8;{Convert 25 Row text mode to pixels}
     Asm
             CMP MsAvailable,True
             JNE @Done
             MOV AX,0007h
             MOV CX,X
             MOV DX,X1
             INT 33h
             MOV AX,0008h
             MOV CX,Y
             MOV DX,Y1
             INT 33h
             JMP @Done
      @Done:
     End;
    End;
    Procedure MsAttr(ScreenMask,CursorMask:Word);Assembler;
     Asm
             CMP MsAvailable,True
             JNE @Done
             MOV AX,000Ah
             MOV BX,0000h
             MOV CX,ScreenMask
             MOV DX,CursorMask
             INT 33h
      @Done:
     End;
    Procedure MsSize(StartScan,EndScan:Word);Assembler;
     Asm
             CMP MsAvailable,True
             JNE @Done
             MOV AX,000Ah
             MOV BX,0001h
             MOV CX,StartScan
             MOV DX,EndScan
             INT 33h
      @Done:
     End;
    Procedure MouseExit;
     Begin
      ExitProc:=SavedExitPtr;
     End;
    Begin
     SavedExitPtr:=ExitProc;
     ExitProc:=@MouseExit;
     MsInit;
    End.

[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]