unit mouse;

interface

   type GrPointMask = array[1..2,0..15] of Word;
        Proc        = procedure;

Function  MouseIsPresent : boolean;
{ Zjistuje jestli je mys instalovana }

Procedure ShowPointer;
{ Zobrazeni mysiho kurzoru }

Procedure HidePointer;
{ Schovani mysiho kurzoru }

Procedure GetMousePos(var X,Y : Word);
{ Nancteni mysich souradnic do promenne }

Function  MouX : Word;
{ Zjisti horizontalni pozici mysi }

Function  MouY : Word;
{ Zjisti vertikalni pozici mysi }

Procedure MouseSetPos(X,Y : Word);
{ Nastaveni pozice mysi }

Procedure MouseStatus(var X,Y : Word;Var LefBut,MidBut,RigBut : Boolean);
{ Zjisteni stavu mysi }

Function  LbPressed : boolean;
{ Zjisteni stisku leveho tlacitka mysi }

Function  RbPressed : boolean;
{ Zjisteni stisku praveho tlacitka mysi }

Procedure MousePressCount(Button : Word;var Pocet,X,Y : Word);
{ Zjisteni poctu stisku tlacitka }

Procedure MouseReleaseCount(Button : Word;var Pocet,X,Y : Word);
{ Zjisteni poctu uvolneni tlacitka }

Procedure MouseRange(X1,Y1,X2,Y2 : Word);
{ Nastaveni hranic pro kurzor mysi }

Procedure MouseSetGrCurs(X,Y : Integer; PointerMask : GrPointMask);
{ Definice grafickeho kurzoru }

Procedure MouseSetHardTCurs(FirstLine : Word;var LastLine : Word);
{ Definice hardwaroveho textoveho kurzoru }

Procedure MouseSetSoftTCurs(ScreenMask : Word;var CursorMask : Word);
{ Definice softwaroveho textoveho kurzoru }

Procedure MouseRelPosChange(var X,Y : Integer);
{ Zjisti relativni zmeny souradnic }

Procedure MouseHandleEvent(EventMask : Word;var Handle : Proc);
{ Nastaveni obsluzne rutiny udalosti mysi }

Procedure MouseSpeed(X,Y : Word);
{ Nastaveni rychlosti mysi }

Procedure MouseSensitivity(X,Y,DTreshold : Word);
{ Nastaveni citlivosti mysi }

Procedure MouseReset;
{ Inicializace citacu mysi }


{*************************** TLACITKA ****************************}
   const LeftBut = 0;
         MiddBut = 2;
         RighBut = 1;


{******************* MASKY GRAFIKYCH KURZORU *********************}
{1-Maska obrazovky; 2-Maska kurzoru;}

   Const Kursor   : GrPointMask = ( ( $3FFF, $1FFF, $0FFF, $07FF,
                                      $03FF, $01FF, $00FF, $007F,
                                      $003F, $001F, $001F, $00FF,
                                      $30FF, $F87F, $F87F, $FC7F ),

                                    ( $0000, $4000, $6000, $7000,
                                      $7800, $7C00, $7E00, $7F00,
                                      $7F80, $7FC0, $7C00, $4600,
                                      $0600, $0300, $0300, $0000 ) );

         Pes       : GrPointMask = ( ($ffff, $FFFF, $FFFF, $F9FF,
                                      $F9bF, $fFbF, $FF7F, $8F7F,
                                      $FeFF, $FFFF, $FFFF, $FFFF,
                                      $FFFF, $FFFF, $FFFF, $FFFF ),


                                    ( $0000, $0300, $0fc0, $19c0,
                                      $19c0, $7fbf, $7f7f, $0f7f,
                                      $3efe, $18ce, $08c4, $01ce,
                                      $038e, $0000, $0000, $0000) );

         Kursor3   : GrPointMask = ( ($ffff, $FFFF, $FFFF, $FfFF,
                                      $FffF, $fFfF, $FFfF, $fFfF,
                                      $FfFF, $FFFF, $FFFF, $FFFF,
                                      $FFFF, $FFFF, $FFFF, $FFFF ),


                                    ( $1f00, $0000, $0000, $0000,
                                      $0000, $0000, $0000, $0000,
                                      $0000, $0000, $0000, $0000,
                                      $0000, $0000, $0000, $0000) );



         Kriz     : GrPointMask = ( ( $FFFF, $FFFF, $FFFF, $FFFF,
                                      $FFFF, $FFFF, $FFFF, $FFFF,
                                      $FFFF, $FFFF, $FFFF, $FFFF,
                                      $FFFF, $FFFF, $FFFF, $FFFF ),

                                    ( $0100, $0100, $0100, $0100,
                                      $0100, $0000, $0000, $F93E,
                                      $0000, $0000, $0100, $0100,
                                      $0100, $0100, $0100, $0000 ) );

         Hodiny   : GrPointMask = ( ( $F839, $E008, $C004, $8003,
                                      $8003, $0001, $0001, $0001,
                                      $0001, $0001, $8003, $8003,
                                      $C007, $E00F, $F83F, $FFFF ),

                                    ( $07C6, $1FF7, $383B, $600C,
                                      $600C, $C006, $C006, $DF06,
                                      $C106, $C106, $610C, $610C,
                                      $3838, $1FF0, $07C0, $0000 ) );

         Otaznik  : GrPointMask = ( ( $FFFF, $C0FF, $807F, $987F,
                                      $FC7F, $F87F, $E0FF, $C3FF,
                                      $C7FF, $C7FF, $C7FF, $FFFF,
                                      $C7FF, $C7FF, $C7FF, $FFFF ),

                                    ( $0000, $3E00, $6700, $0300,
                                      $0300, $0600, $1800, $3000,
                                      $3000, $3000, $0000, $0000,
                                      $3000, $3000, $0000, $0000 ) );

         Sipka    : GrPointMask = ( ( $003F, $003F, $003F, $07FF,
                                      $03FF, $11FF, $18FF, $1C7F,
                                      $1E3F, $1F1F, $FF8F, $FFCF,
                                      $FFFF, $FFFF, $FFFF, $FFFF ),

                                    ( $0000, $7F80, $6000, $5000,
                                      $4800, $4400, $4200, $4100,
                                      $4080, $1010, $0000, $0000,
                                      $0000, $0000, $0000, $0000 ) );


         Listecek : GrPointMask = ( ( $3FFF, $1FFF, $0FFF, $07FF,
                                      $03FF, $01FF, $00FF, $007F,
                                      $007F, $00FF, $10FF, $F8FF,
                                      $FFFF, $FFFF, $FFFF, $FFFF ),

                                    ( $0000, $4000, $6000, $7000,
                                      $7800, $7C00, $7E00, $7F00,
                                      $7F00, $6C00, $0600, $0000,
                                      $0000, $0000, $0000, $0000 ) );

         Krizek   : GrPointMask = ( ( $F1FF, $F1FF, $F1FF, $001F,
                                      $001F, $001F, $F1FF, $F1FF,
                                      $F1FF, $FFFF, $FFFF, $FFFF,
                                      $FFFF, $FFFF, $FFFF, $FFFF ),

                                    ( $0000, $0400, $0400, $0400,
                                      $7FC0, $0400, $0400, $0400,
                                      $0000, $0000, $0000, $0000,
                                      $0000, $0000, $0000, $0000 ) );

         Fatcurs  : GrPointMask = ( ( $007F, $007F, $007F, $007F,
                                      $003F, $001F, $000F, $0007,
                                      $0003, $F001, $F800, $FC01,
                                      $FE03, $FF07, $FF8F, $FFDF ),

                                    ( $0000, $7F00, $7F00, $7F00,
                                      $7F80, $7FC0, $7FE0, $7FF0,
                                      $0FF8, $07FC, $03FE, $01FC,
                                      $00F8, $0070, $0020, $0000 ) );

         Pogocurs : GrPointMask = ( ( $1999, $6666, $6676, $1646,
                                      $7666, $7999, $FFFF, $FFFF,
                                      $9909, $6696, $6697, $0199,
                                      $659C, $6696, $6699, $FFFF ),

                                    ( $E666, $9999, $9989, $E9B9,
                                      $8999, $8666, $0000, $0000,
                                      $66F6, $9969, $9968, $FE66,
                                      $9A63, $9969, $9966, $0000 ) );


{*************** SOURADNICE VZTAZNYCH BODU KURZORU MYSI **********}

   SipkaX   = 15;
   SipkaY   = 7;
   KrizX    = 7;
   KrizY    = 7;
   HodinyX  = 8;
   HodinyY  = 8;
   OtaznikX = 5;
   OtaznikY = 5;

Implementation

uses dos;
var regs : registers;


Function MouseIsPresent;
   begin
    regs.ax:=0;
    intr($33,regs);
   if regs.ax = 0 then
      MouseIsPresent := false
   else
      MouseIsPresent := true;
  end;

Procedure ShowPointer;
   begin
    regs.ax:=1;
    intr($33,regs);
   end;

Procedure HidePointer;
   begin
    regs.ax:=2;
    intr($33,regs);
   end;

Procedure GetMousePos;
   begin
    regs.ax:=3;
    intr($33,regs);
    x:=regs.cx;
    y:=regs.dx;
  end;

Function Moux;
   begin
    regs.ax:=3;
    intr($33,regs);
    MouX:=regs.cx;
   end;

Function MouY;
   begin
    regs.ax:=3;
    intr($33,regs);
    MouY:=regs.dx;
   end;

Procedure MouseStatus;Assembler;
   Asm
      Mov Ax, 03
      Int 33h
      Ror Bx, 1
      Sbb Ah, Ah
      Les Di, LefBut
      Mov [Di], Ah
      Ror Bx, 1
      Sbb Ah, Ah
      Les Di, RigBut
      Mov [Di], Ah
      Ror Bx, 1
      Sbb Ah, Ah
      Les Di, MidBut
      Mov [Di], Ah
      Les Di, X
      Mov [Di], Cx
      Les Di, Y
      Mov [Di], Dx
   end;

Procedure MouseSetPos;Assembler;
   Asm
      Mov Ax, 04
      Mov Cx, X
      Mov Dx, Y
      Int 33h
   end;

Function LbPressed;
   begin
    regs.ax:=3;
    intr($33,regs);
    LbPressed:=(regs.bx and 1) <> 0;
   end;

Function RbPressed;
   begin
    regs.ax:=3;
    intr($33,regs);
    RbPressed:=(regs.bx and 2) <> 0;
   end;

Procedure MousePressCount;Assembler;
   Asm
      Mov Ax, 05
      Mov Bx, Button
      Int 33h
      Les di, Pocet
      Mov [Di], Bx
      Les Di, X
      Mov [Di], Cx
      Les Di, Y
      Mov [Di], Dx
   end;

Procedure MouseReleaseCount;Assembler;
   Asm
      Mov Ax, 06
      Mov Bx, Button
      Int 33h
      Les Di, Pocet
      Mov [Di], Bx
      Les Di, X
      Mov [Di], Cx
      Les Di, Y
      Mov [Di], Dx
   end;

Procedure MouseRange;Assembler;
   Asm
      Mov Ax, 07
      Mov Cx, X1
      Mov Dx, X2
      Int 33h
      Mov Ax, 08
      Mov Cx, Y1
      Mov Dx, Y2
      Int 33h
   end;

Procedure MouseSetGrCurs;Assembler;
   Asm
      Mov Ax, 09
      Mov Bx, X
      Mov Cx, Y
      Les Dx, PointerMask
      Int 33h
   end;

Procedure MouseSetHardTCurs;Assembler;
   Asm
      Mov Ax, 0Ah
      Mov Bx, 01
      Mov Cx, FirstLine
      Les Dx, LastLine
      Int 33h
   end;

Procedure MouseSetSoftTCurs;Assembler;
   Asm
      Mov Ax, 0Ah
      Mov Bx, 00
      Mov Cx, ScreenMask
      Les Dx, CursorMask
      Int 33h
   end;

Procedure MouseRelPosChange;Assembler;
   Asm
      Mov Ax, 08h
      Int 33h
      Les Di, X
      Mov [Di], Cx
      Les Di, Y
      Mov [Di], Dx
   end;

Procedure MouseHandleEvent;Assembler;
   Asm
      Mov Ax, 0Ch
      Mov Cx, EventMask
      Lea Dx, Handle
      Int 33h
   end;

Procedure MouseSpeed;Assembler;
   Asm
      Mov Ax, 0Fh
      Mov Cx, X
      Mov Dx, Y
      Int 33h
   end;

Procedure MouseSensitivity;Assembler;
   Asm
      Mov Ax, 1Ah
      Mov Bx, X
      Mov Cx, Y
      Mov Dx, DTreshold
      Int 33h
   end;

Procedure MouseReset; Assembler;
   Asm
      Mov Ax, 21h
      Int 33h
   end;

end.
