Unit Mouse4;

{*******************************************************************}
{*                   Mouse4 - Text Mouse Unit                      *}
{*                     version .9, 11/20/87                        *}
{*                by Richard Sadowsky 74017,1670                   *}
{*                 released to the public domain                   *}
{*******************************************************************}

Interface

Uses DOS;

const
  CURPOS           = 1; { not used yet in this version }
  LEFTPRESS        = 2;
  LEFTREL          = 4;
  RIGHTPRESS       = 8;
  RIGHTREL         = 16;

var
  Mouse_Reg        : Registers;
  Mouse_Installed  : Boolean;
  Mouse_Error      : Word;

function InitMouse : Word;
{ Function 0 - Initialize mouse software and hardware }

procedure ShowMouse;
{ function 1 - show mouse cursor }

procedure HideMouse;
{ function 2 - hide mouse cursor }

function MousePosition(var MouseX,MouseY : Word) : Word;
{ function 3 - return mouse position and button status }
{ X and Y values scaled for 80 col text mode }

procedure setmouseposition(mousex, mousey: Word);
{ function 4 - sets mouse position  }
{ X and Y values scaled for 80 col text mode }

function mousepress(button: Word;
                     var count, lastx, lasty: Word): Word;
{ function 5 - gets button press information  }
{ X and Y values scaled for 80 col text mode }

function mouserelease(button: Word;
                       var count, lastx, lasty: Word): Word;
{ function 6 - gets button release information  }
{ X and Y values scaled for 80 col text mode }

procedure setmousexy(x1,y1,x2,y2: Word);
{ functions 7 and 8 - sets min/max values for horizontal/vertical  }
{ X and Y values scaled for 80 col text mode }

procedure restoremousexy;
{ functions 7 and 8 - restores min/max values for CGA screen }

procedure SetPixeltoMickey(Horiz,Verti : Word);
{ function 15 - sets the mickey to pixel ratio }

implementation

function InitMouse : Word;
{ Function 0 - Initialize mouse software and hardware }
begin
  with Mouse_Reg do
    Ax := 0;
  Intr($33,Mouse_Reg);
  InitMouse := Mouse_Reg.Ax;
end;

procedure ShowMouse;
{ function 1 - show mouse cursor }
begin
  Mouse_Reg.Ax := 1;
  Intr($33,Mouse_Reg);
end;

procedure HideMouse;
{ function 2 - hide mouse cursor }

begin
  Mouse_Reg.AX := 2;
  Intr($33,Mouse_Reg);
end;

function MousePosition(var MouseX,MouseY : Word) : Word;
{ function 3 - return mouse position and button status }
{ X and Y values scaled for 80 col text mode }
begin
  Mouse_Reg.Ax := 3;
  Intr($33,Mouse_Reg);
  with Mouse_Reg do begin
    MouseX := Succ(Cx DIV 8);
    MouseY := Succ(Dx DIV 8);
    MousePosition := Bx;
  end;
end;

procedure setmouseposition(mousex, mousey: Word);
{ function 4 - sets mouse position  }
{ X and Y values scaled for 80 col text mode }
begin
  Mouse_Reg.ax:=4;
  Mouse_Reg.cx:=Pred(mousex*8);
  Mouse_Reg.dx:=Pred(mousey*8);
  intr($33,Mouse_Reg);
end;

function mousepress(button: Word;
                     var count, lastx, lasty: Word): Word;
{ function 5 - gets button press information  }
{ X and Y values scaled for 80 col text mode }
begin
  Mouse_Reg.ax:=5;
  Mouse_Reg.bx:=button;
  intr($33,Mouse_Reg);;
  mousepress:=Mouse_Reg.ax;
  count:=Mouse_Reg.bx;
  lastx:=Succ(Mouse_Reg.cx div 8);
  lasty:=Succ(Mouse_Reg.dx div 8);
end;

function mouserelease(button: Word;
                       var count, lastx, lasty: Word): Word;
{ function 6 - gets button release information  }
{ X and Y values scaled for 80 col text mode }
begin
  Mouse_Reg.ax:=6;
  Mouse_Reg.bx:=button;
  intr($33,Mouse_Reg);;
  mouserelease:=Mouse_Reg.ax;
  count:=Mouse_Reg.bx;
  lastx := Succ(Mouse_Reg.cx div 8);
  lasty := Succ(Mouse_Reg.dx div 8);
end;

procedure setmousexy(x1,y1,x2,y2: Word);
{ functions 7 and 8 - sets min/max values for horizontal/vertical  }
{ X and Y values scaled for 80 col text mode }
begin
  Mouse_Reg.ax:=7;
  Mouse_Reg.cx:=Pred(x1*8);
  Mouse_Reg.dx:=Pred(x2*8);
  intr($33,Mouse_Reg);
  Mouse_Reg.ax:=8;
  Mouse_Reg.cx:=Pred(y1*8);
  Mouse_Reg.dx:=Pred(y2*8);
  intr($33,Mouse_Reg);
end;

procedure restoremousexy;
{ functions 7 and 8 - restores min/max values for CGA screen }
begin
  Mouse_Reg.ax:=7;
  Mouse_Reg.cx:=0;
  Mouse_Reg.dx:=639;
  intr($33,Mouse_Reg);
  Mouse_Reg.ax:=8;
  Mouse_Reg.cx:=0;
  Mouse_Reg.dx:=199;
  intr($33,Mouse_Reg);
end;

procedure SetPixeltoMickey(Horiz,Verti : Word);
{ function 15 - sets the mickey to pixel ratio }

begin
  with Mouse_Reg do begin
    Ax := 15;
    Cx := Horiz;
    Dx := Verti;
  end;
  Intr($33,Mouse_Reg)
end;

begin
  Mouse_Error := InitMouse;
  Mouse_Installed := Mouse_Error = 65535;
end.
