UNIT Mouse;

INTERFACE

 VAR
  a, b: Array [1..5] of Byte;
  x, y, xmin, ymin, xmax, ymax: Integer;
  sens: Byte;
  left, right, both: Boolean;

 Procedure Scan;
 Procedure LimitX(x1,x2: Integer);
 Procedure LimitY(y1,y2: Integer);
 Procedure Go(x0,y0: Integer);
 Procedure Sensitivity(sens0: Byte);
 Procedure AddKursor(x,y: Integer; a0,b0,n: Byte);
 Procedure SetKursor(n: Byte);
 Procedure Show;
 Function Area(x1, y1, x2, y2: Integer): Boolean;

IMPLEMENTATION

 Uses
  Dos, VGraph;

 Var
  mask: Array [1..5] of Pointer;
  reg: Registers;
  i,j,m: Byte;

 Procedure Scan;
  begin
   reg.ax:=3;
   intr($33,reg);
   x:=Round(reg.cx/sens);
   y:=Round(reg.dx/sens);
    case reg.bx of
     1: begin
	 left:=true;
	 right:=false;
	 both:=false
	end;
     2: begin
	 left:=false;
	 right:=true;
	 both:=false
	end;
     3: begin
	 left:=true;
	 right:=true;
	 both:=true
	end
     else begin
	   left:=false;
	   right:=false;
	   both:=false
	  end
    end {case}
  end; {Scan}

 Procedure LimitX(x1,x2: Integer);
  begin
   reg.ax:=7;
   reg.cx:=Round(x1*sens);
   reg.dx:=Round(x2*sens);
   intr($33,reg);
   xmin:=x1;
   xmax:=x2
  end; {LimitX}

 Procedure LimitY(y1,y2: Integer);
  begin
   reg.ax:=8;
   reg.cx:=Round(y1*sens);
   reg.dx:=Round(y2*sens);
   intr($33,reg);
   ymin:=y1;
   ymax:=y2
  end; {LimitY}

 Procedure Go(x0,y0: Integer);
  begin
   reg.ax:=4;
   reg.cx:=Round(x0*sens);
   reg.dx:=Round(y0*sens);
   intr($33,reg);
   x:=x0;
   y:=y0
  end; {Go}

 Procedure Sensitivity(Sens0: Byte);
  begin
   sens:=sens0;
   Go(x,y);
   LimitX(xmin,xmax);
   LimitY(ymin,ymax)
  end; {Sensitivity}

 Procedure AddKursor(x,y: Integer; a0,b0,n: Byte);
  var
   i, j: Byte;
  begin
   FreeMem(mask[n], a[n]*b[n]);
   a[n]:=a0;
   b[n]:=b0;
   GetMem(mask[n], a[n]*b[n]);
    for i:=0 to b[n]-1
    do for j:=0 to a[n]-1
       do Mem[Seg(mask[n]^):(i*a[n]+j)]:=GetPixel(x+j,y+i)
  end; {AddKursor}

 Procedure SetKursor(n: Byte);
  begin
   m:=n
  end; {SetKursor}

 Procedure Show;
  var
   i, j: Byte;
  begin
   for i:=0 to b[m]-1
   do for j:=0 to a[m]-1
      do if Mem[Seg(mask[m]^):(i*a[m]+j)] <> 0
	 then PutPixel(x+j, y+i, Mem[Seg(mask[m]^):(i*a[m]+j)])
  end; {Show}

 Function Area(x1, y1, x2, y2: Integer): Boolean;
  begin
   if (x >= x1)and(x <= x2)and(y >= y1)and(y <= y2)
   then Area:=true
   else Area:=false
  end; {Area}

BEGIN
 sens:=1;
 m:=1;
 a[m]:=15;
 b[m]:=15;
 GetMem(mask[m],a[m]*b[m]);
  for i:=0 to 14
  do for j:=0 to 14
     do if (i <= 9-j)or(i = j)or(i = j+1)or(i = j-1)
	then Mem[Seg(mask[m]^):(i*a[m]+j)]:=15
	else Mem[Seg(mask[m]^):(i*a[m]+j)]:=0;
 LimitX(0,639);
 LimitY(0,479);
 Go(100,100)
END.