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

    Unit Mouse;
    { Copyright (c) 1991, Crazy Systems Software, Inc. }

    {$G+}

    {
     *************************************************
     *                                               *
     *       Mouse in Text Mode Interface Unit       *
     *            for Borland Pascal 7.0             *
     *                                               *
     *      Completely written by  Andrew Eigus      *
     *************************************************
    }

    interface

    type
      TMouseWinRect = record
        X1, Y1, X2, Y2 : word
      end;

      TMouseParamTable = record
        BaudRate,  { Baud rate / 100 }
        Emulation,
        ReportRate, { Report rate }
        FirmRev,
        ZeroWord,  { Should be zero }
        Port,  { Com Port used }
        PhysButtons, { Physical buttons }
        LogButtons : word { Logical buttons }
      end;

      TMouseRec = record
        Keys,
        Hzints,
        Page,
        XCoord,
        YCoord,
        HSpeed,
        VSpeed,
        DSpeed : word;
        Column,
        Row : byte;
        W : TMouseWinRect;
        ButtonClicked : byte;
        ParamTable : TMouseParamTable
      end;

    const
      LeftButton  = 1;
      MidButton   = 4;
      RightButton = 2;

      mNoInts    = 0;
      m30HzInts  = 1;
      m50HzInts  = 2;
      m100HzInts = 3;
      m200HzInts = 4;

    var
      M : TMouseRec;
      MouseInstalled : boolean;

    function InstallMouse : boolean;
    function GetMouseInfo(var M : TMouseRec) : byte;
    function ButtonReleased : boolean;
    procedure SetMouseCursor(CursorOn : boolean);
    procedure SetMouseCursorType(HotSpotX, HotSpotY : word; var CursorImage);
    procedure MoveMouseTo(XCoord, YCoord : integer);
    procedure SetMouseWindow(X1, Y1, X2, Y2 : word);
    procedure GetMouseSpeed;
    procedure SetMouseSpeed(HorSpeed, VrtSpeed, DblSpeed : integer);
    procedure SetMouseInts(Hz : word);
    function GetMousePage : word;
    procedure SetMousePage(Page : word);
    procedure UninstallMouse;

    implementation

    Function InstallMouse; assembler;
    Asm
      XOR AX,AX  { zero function }
      INT 33h
      CMP AL,0
      JE  @@1
      MOV MouseInstalled,True
      LEA DI,M
      MOV [ES:DI](TMouseRec).Keys,0
      MOV [ES:DI](TMouseRec).Keys,BX
      PUSH ES
      PUSH DI
      CALL GetMouseInfo
      CALL GetMousePage
      CALL GetMouseSpeed
      MOV [ES:DI](TMouseRec).W.X1,1
      MOV [ES:DI](TMouseRec).W.Y1,1
      MOV [ES:DI](TMouseRec).W.X2,639
      MOV [ES:DI](TMouseRec).W.Y2,199
      MOV AX,246Ch
      LEA DX,M.ParamTable
      INT 33h
      MOV AL,True
    @@1:
    End; { InstallMouse }

    Function GetMouseInfo; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,0003h
      INT 33h
      LES DI,M
      MOV [ES:DI](TMouseRec).XCoord,CX
      SHR CX,3
      INC CL
      MOV [ES:DI](TMouseRec).Column,CL
      MOV [ES:DI](TMouseRec).YCoord,DX
      SHR DX,3
      INC DL
      MOV [ES:DI](TMouseRec).Row,DL
      MOV [ES:DI](TMouseRec).ButtonClicked,BL
      MOV AL,BL   { LeftButton, MidButton or RightButton }
    @@1:
    End; { GetMouseInfo }

    Function ButtonReleased; assembler;
    Asm
      LEA DI,M
      PUSH ES
      PUSH DI
      CALL GetMouseInfo
      MOV AL,True
      CMP BL,0
      JE  @@1
      MOV AL,False
    @@1:
    End; { ButtonReleased }

    Procedure SetMouseCursor; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@2
      MOV AX,0001h
      CMP CursorOn,True
      JE  @@1
      MOV AX,0002h
    @@1:
      INT 33h
    @@2:
    End; { SetMouseCursor }

    Procedure SetMouseCursorType; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,000Ah
      MOV BX,HotSpotX
      MOV CX,HotSpotY
      LES DX,CursorImage
      INT 33h
    @@1:
    End; { SetMouseCursorType }

    Procedure MoveMouseTo; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,0004h
      MOV CX,XCoord
      MOV DX,YCoord
      INT 33h
    @@1:
    End; { MoveMouseTo }

    Procedure SetMouseWindow; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      LEA DI,M
      MOV AX,0007h
      MOV CX,X1
      MOV [ES:DI](TMouseRec).W.X1,CX
      MOV DX,X2
      MOV [ES:DI](TMouseRec).W.X2,DX
      INT 33h
      MOV AX,0008h
      MOV CX,Y1
      MOV [ES:DI](TMouseRec).W.Y1,CX
      MOV DX,Y2
      MOV [ES:DI](TMouseRec).W.Y2,DX
      INT 33h
    @@1:
    End; { SetMouseWindow }

    Procedure GetMouseSpeed; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,001Bh
      INT 33h
      LEA DI,M
      MOV [ES:DI](TMouseRec).HSpeed,BX
      MOV [ES:DI](TMouseRec).VSpeed,CX
      MOV [ES:DI](TMouseRec).DSpeed,DX
    @@1:
    End; { GetMouseSpeed }

    Procedure SetMouseSpeed; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,001Ah
      MOV BX,HorSpeed
      MOV CX,VrtSpeed
      MOV DX,DblSpeed
      INT 33h
      CALL GetMouseSpeed
    @@1:
    End; { SetMouseSpeed }

    Procedure SetMouseInts; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,001Ch
      MOV BX,Hz
      INT 33h
    @@1:
    End; { SetMouseInts }

    Function GetMousePage; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,001Eh
      INT 33h
      LEA DI,M
      MOV [ES:DI](TMouseRec).Page,BX
      MOV AX,BX
    @@1:
    End; { GetMousePage }

    Procedure SetMousePage; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,001D
      MOV BX,Page
      INT 33h
      CALL GetMousePage
    @@1:
    End; { SetMousePage }

    Procedure UninstallMouse; assembler;
    Asm
      CMP MouseInstalled,True
      JNE @@1
      MOV AX,0020h
      INT 33h
    @@1:
    End; { UninstallMouse }

    Begin
      MouseInstalled := False;
      FillChar(M, SizeOf(TMouseRec), 0)
    End. { Mouse }

    {---now the demo program---}

    Program MouDemo;

    uses Crt, Mouse;

    Begin
      if InstallMouse then
      begin
        ClrScr;
        SetMouseCursor(True);
        WriteLn('Mouse is installed.');
        WriteLn('Click left mouse button in the upper left corner of your ' +
          'screen to quit.');
        repeat
          GetMouseInfo(M);
        until (M.ButtonClicked = LeftButton) and (M.Column = 1) and (M.Row = 1);
        Write('Waiting to release left button...');
        repeat until ButtonReleased;
        Write(#13);
        ClrEol;
        SetMouseCursor(False);
        UninstallMouse
      end else WriteLn('Mouse is NOT installed.')
    End.

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