unit FMouse;
{ -- fMouse (c) Dreadnaut 2003 - dreadnaut@libero.it --
  unit per la gestione del mouse, compatibile al 99% con la
  gestione usata dalla unit Drivers (TEvent diventa FEvent). }

interface

 type
  Pnt    = record x,y:integer; end;
  FEvent = record
            Where   : Pnt;
            What    : byte;
            Buttons : byte;
           end;

 const
  moResetMouse   = $00;    moShowMouse    = $01;
  moHideMouse    = $02;    moGetPosition  = $03;
  moSetPosition  = $04;    moGetButPress  = $05;
  moGetButRel    = $06;    moSetHorzRange = $07;
  moSetVertRange = $08;    moSetGraphCur  = $09;
  moSetTextCur   = $0A;    moGetMouseRel  = $0B;
{ moSetInterrupt = $0C;    moLightPen_ON  = $0D;
  moLightPen_OFF = $0E;}   moSetMouseSpd  = $0F;

  mbLeftButton   = $01;    mbRightButton  = $02;
  mbCenterButton = $04;

  evNothing      = $00;    evMouseDown    = $01;
  evMouseUp      = $02;    evMouseMove    = $04;
  evMouseAuto    = $08;

 Function  InitEvents: boolean;
 Procedure ShowMouse;{ far; }
 Procedure HideMouse;
 Procedure GetMouseEvent(var e: FEvent);

 Procedure MousePos     (var x,y,buttons:integer);
 Procedure MouseRel     (var x,y        :integer);
 Procedure SetMouseSens (    x,y        :integer);
 procedure MousePressed (var x,y,buttons:integer);
 procedure MouseReleased(var x,y,buttons:integer);
 procedure SetMouseView (x1,y1,x2,y2: word);
 procedure SetMousePos  (x,y:word);

implementation

 var
  FmData : record
            NButton : byte;
            Init    : byte;
            b,p     : integer;
            Where   : Pnt;
           end;

 Procedure GetMouseEvent(var e: FEvent);
  var
   p : Pnt;
   b : integer;
  begin
   e.What := evNothing;
   MousePos(P.x,P.y,b);
   if (P.x <> e.Where.X) or (P.y <> e.Where.Y) then
    begin
     e.What       := 4; { evMouseMove}
     if FmData.p <> 0 then e.What := evMouseAuto;
     e.Where      := P;
     FmData.Where := P;
    end;
   if b <> FmData.p
    then if b = 0
          then begin
           e.What   := 2; {evMouseUp}
           FmData.p := 0;
           FmData.b := 0;
          end
          else if FmData.b = 0
                then begin
                      e.What    := 1; {evMouseDown}
                      e.Buttons := b;
                      FmData.p  := b;
                      FmData.b  := 1;
                     end
                else begin
                      e.What   := 8; {evMouseAuto}
                      FmData.b := 0;
                     end;
  end;

 Function InitEvents: boolean; assembler;
   asm
    MOV   ax, moResetMouse
    INT   33h
    MOV   byte ptr [FmData.NButton],bl
    MOV   byte ptr [FmData.Init],al
    CMP   ax,0
    JE    @InitQuit
    PUSH  ax
    MOV   ax, moShowMouse
    INT   33h
    POP   ax
 @InitQuit:
   end;

 Procedure ShowMouse; assembler;
  asm
   MOV   AX, moShowMouse
   INT   33h
  end;

 Procedure HideMouse; assembler;
  asm
   MOV   AX, moHideMouse
   INT   33h
  end;

 Procedure MousePos(var x,y,buttons:integer); assembler;
  asm
   MOV    AX, moGetPosition
   INT    33h
   LES    DI,buttons
   MOV    AX,BX
   STOSW
   LES    DI,x
   MOV    AX,CX
   STOSW
   LES    DI,y
   MOV    AX,DX
   STOSW
  end;

 Procedure MouseRel(var x,y:integer); assembler;
  asm
   MOV    AX, moGetMouseRel
   INT    33h
   LES    DI,x
   MOV    AX,CX
   STOSW
   LES    DI,y
   MOV    AX,DX
   STOSW
  end;

 Procedure SetMouseSens(x,y:integer); assembler;
  asm
   MOV   AX, moSetMouseSpd
   MOV   BX, x
   MOV   CX, y
   INT   33h
  end;

 procedure SetMouseView(x1,y1,x2,y2: word); assembler;
  asm
   MOV   AX, moSetHorzRange
   MOV   CX, word ptr x1
   MOV   DX, word ptr x2
   INT   33h
   MOV   AX, moSetVertRange
   MOV   CX, word ptr y1
   MOV   DX, word ptr y2
   INT   33h
  end;

 procedure SetMousePos(x,y:word); assembler;
  asm
   MOV   AX, moSetPosition
   MOV   CX, word ptr x
   MOV   DX, word ptr y
   INT   33h
  end;

 procedure MousePressed(var x,y,buttons: integer); assembler;
  asm
   MOV   AX, moGetButPress
   INT   33h
   LES   DI,buttons
   MOV   AX,BX
   STOSW
   LES   DI,x
   MOV   AX,CX
   STOSW
   LES   DI,y
   MOV   AX,DX
   STOSW
  end;

 procedure MouseReleased(var x,y,buttons: integer); assembler;
  asm
   MOV   AX, moGetButRel
   INT   33h
   LES   DI,buttons
   MOV   AX,BX
   STOSW
   LES   DI,x
   MOV   AX,CX
   STOSW
   LES   DI,y
   MOV   AX,DX
   STOSW
  end;

end.
