home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / mouse.swg / 0003_RODENT.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  7KB  |  259 lines

  1. Unit Rodent;
  2. Interface
  3. Uses Dos;
  4.  
  5. const MDD = $33;   { mouse interupt }
  6.                    { Interupt driven        Polled       = AX  }
  7.       bit_0 = $01; { mouse movement         left button down   }
  8.       bit_1 = $02; { left button pressed    right button down  }
  9.       bit_2 = $04; { left button released   center button down }
  10.       bit_3 = $08; { right button pressed }
  11.       bit_4 = $10; { right button released }
  12.       bit_5 = $20; { center pressed }
  13.       bit_6 = $40; { center released }
  14.       bit_7 = $80;
  15.  
  16. type
  17.   resetRec = record
  18.     exists   : Boolean;
  19.     nButtons : Integer;
  20.   end;
  21.   LocRec = record
  22.     buttonStatus,
  23.     opCount,
  24.     column,
  25.     row       : Integer;
  26.   end;
  27.   moveRec = record
  28.     hCount,
  29.     vCount    : Integer;
  30.   end;
  31. {$F+}
  32.   eventRec = record
  33.                flag, button, col, row: Word;
  34.              end;
  35. {$F-}
  36.  
  37. var mReg     : Registers;
  38.     theMouse : resetRec;     { Does mouse exist }
  39.     mrecord  : locRec;       { polled record    }
  40.     mEvent   : eventRec;     { interupt record  }
  41.  
  42. procedure mFixXY (x1,y1,x2,y2:integer);
  43. function mouseX (n:integer) : integer;
  44. function mouseY (n:integer) : integer;
  45. procedure mReset (VAR Mouse: resetRec);                                {  0 }
  46. procedure mShow;                                                       {  1 }
  47. procedure mHide;                                                       {  2 }
  48. procedure mPos (VAR Mouse: LocRec);                                    {  3 }
  49. procedure mMoveto (col, row: Integer);                                 {  4 }
  50. procedure mPressed (button: Integer; VAR Mouse: LocRec);               {  5 }
  51. procedure mReleased (button: Integer; VAR Mouse: LocRec);              {  6 }
  52. procedure mColRange (min, max : Integer);                              {  7 }
  53. procedure mRowRange (min, max : Integer);                              {  8 }
  54. procedure mGraphCursor (hHot, vHot: Integer; maskSeg, maskOfs: Word);  {  9 }
  55. procedure mTextCursor (ctype, p1, p2: Word);                           { 10 }
  56. procedure mMotion (VAR moved: moveRec);                                { 11 }
  57. procedure mInstTask (mask: Word);                                      { 12 }
  58. procedure mLpenOn;                                                     { 13 }
  59. procedure mLpenOff;                                                    { 14 }
  60. procedure mRatio (horiz, vert: Integer);                               { 15 }
  61.  
  62. implementation
  63. var
  64.   maxcol   : word absolute $0040:$004A;   { x }
  65.  
  66. procedure EventHandler(Flags,CS,AX,BX,CX,DX,SI,DI,DS,ES,BP: Word);
  67. interrupt;
  68. begin
  69.   mEvent.flag   := AX;
  70.   mEvent.button := BX;
  71.   mEvent.col    := CX;
  72.   mEvent.row    := DX;
  73.   inLine($8B/$E5/$5D/$07/$1F/$5F/$5E/$5A/$59/$5B/$58/$CB);
  74. end;
  75.  
  76. function Lower (n1, n2: Integer): Integer;
  77.   begin
  78.     if n1 < n2 then Lower := n1 else Lower := n2;
  79.   end;
  80.  
  81. function Upper (n1, n2: Integer): Integer;
  82.   begin
  83.     if n1 > n2 then Upper := n1 else Upper := n2;
  84.   end;
  85.  
  86. procedure mFixXY;
  87.   var i : integer;
  88.   begin
  89.     if maxcol = 80
  90.     then i := 3
  91.     else i := 4;
  92.     mColRange(pred(x1) shl i,pred(x2) shl i);
  93.     mRowRange(pred(y1) shl 3,pred(y2) shl 3);
  94.   end;
  95.  
  96. function mouseX;
  97.   var i : integer;
  98.   begin
  99.     if maxcol = 80
  100.     then i := 3
  101.     else i := 4;
  102.     mouseX := succ(n shr i);
  103.   end;
  104.  
  105. function mouseY;
  106.   begin
  107.     mouseY := succ(n shr 3);
  108.   end;
  109.  
  110. procedure mReset (VAR Mouse: resetRec);
  111.   begin
  112.     mreg.ax := 0;
  113.     intr(MDD, mreg);
  114.     Mouse.exists := boolean(mreg.ax <> 0);
  115.     Mouse.nButtons := mreg.bx;
  116.   end;
  117.  
  118. procedure mShow;
  119.   begin
  120.     inline($B8/$01/$00/$CD/MDD);
  121. {    mreg.ax := 1;    }
  122. {    intr(MDD, mreg); }
  123.   end;
  124.  
  125. procedure mHide;
  126.   begin
  127.     inline($B8/$02/$00/$CD/MDD);
  128. {    mreg.ax := 2;    }
  129. {    intr(MDD, mreg); }
  130.   end;
  131.  
  132. procedure mPos (VAR Mouse: LocRec);
  133.   begin
  134.     mreg.ax := 3;
  135.     intr(MDD, mreg);
  136.     Mouse.buttonStatus := mreg.bx;
  137.     Mouse.column := mreg.cx;
  138.     Mouse.row := mreg.dx;
  139.   end;
  140.  
  141. procedure mMoveto (col, row: Integer);
  142.   var i : word;
  143.   begin
  144.     if maxcol = 80
  145.     then i := 3
  146.     else i := 4;
  147.     mreg.ax := 4;
  148.     mreg.cx := col shl i;
  149.     mreg.dx := row shl i;;
  150.     intr(MDD, mreg);
  151.   end;
  152.  
  153. procedure mPressed (button: Integer; VAR Mouse: LocRec);
  154.   begin
  155.     mreg.ax := 5;
  156.     mreg.bx := button;
  157.     intr(MDD, mreg);
  158.     Mouse.buttonStatus := mreg.ax;
  159.     Mouse.opCount := mreg.bx;
  160.     Mouse.column := mreg.cx;
  161.     Mouse.row := mreg.dx;
  162.   end;
  163.  
  164. procedure mReleased (button: Integer; VAR Mouse: LocRec);
  165.   begin
  166.     mreg.ax := 6;
  167.     mreg.bx := button;
  168.     intr(MDD, mreg);
  169.     Mouse.buttonStatus := mreg.ax;
  170.     Mouse.opCount := mreg.bx;
  171.     Mouse.column := mreg.cx;
  172.     Mouse.row := mreg.dx;
  173.   end;
  174.  
  175. procedure mColRange (min, max : Integer);
  176.   begin
  177.     mreg.ax := 7;
  178.     mreg.cx := Lower(min, max);
  179.     mreg.dx := Upper(min, max);
  180.     intr(MDD, mreg);
  181.   end;
  182.  
  183. procedure mRowRange (min, max : Integer);
  184.   begin
  185.     mreg.ax := 8;
  186.     mreg.cx := Lower (min, max);
  187.     mreg.dx := Upper (min, max);
  188.     intr(MDD, mreg);
  189.   end;
  190.  
  191. procedure mGraphCursor (hHot, vHot: Integer; maskSeg, maskOfs: Word);
  192.   begin
  193.     mreg.ax := 9;
  194.     mreg.bx := hHot;
  195.     mreg.cx := vHot;
  196.     mreg.dx := maskOfs;
  197.     mreg.es := maskSeg;
  198.     intr(MDD, mreg);
  199.   end;
  200.  
  201. procedure mTextCursor (ctype, p1, p2: Word);
  202.   begin
  203.     mreg.ax := 10;
  204.     mreg.bx := ctype;       { 0=software, 1=hardware          }
  205.     mreg.cx := p1;          { 0=and mask else start line      }
  206.     mreg.dx := p2;          { 0=xor mask else Cursor end line }
  207.     intr(MDD, mreg);
  208.   end;
  209.  
  210. { Returns mouse displacement in mickeys since last call }
  211. procedure mMotion (VAR moved: moveRec);
  212.   begin
  213.     mreg.ax := 11;
  214.     intr(MDD, mreg);
  215.     moved.hCount := mreg.cx;
  216.     moved.vCount := mreg.dx;
  217.   end;
  218.  
  219. procedure mInstTask;
  220.   begin
  221.     mreg.ax := 12;
  222.     mreg.cx := mask;         { see bit constants above }
  223.     mreg.dx := Ofs(EventHandler);
  224.     mreg.es := Seg(EventHandler);
  225.     intr(MDD, mreg);
  226.   end;
  227.  
  228. procedure mLpenOn;
  229.   begin
  230.     mreg.ax := 13;
  231.     intr(MDD, mreg);
  232.   end;
  233.  
  234. procedure mLpenOff;
  235.   begin
  236.     mreg.ax := 14;
  237.     intr(MDD, mreg);
  238.   end;
  239.  
  240. procedure mRatio (horiz, vert: Integer);
  241.   begin
  242.     mreg.ax := 15;
  243.     mreg.cx := horiz;
  244.     mreg.dx := vert;
  245.     intr(MDD, mreg);
  246.   end;
  247.  
  248. { Sample base line program...
  249.   mReset(theMouse);
  250.   if theMouse.exists
  251.   then minstTask(15);      (* for 80x25 *)
  252.   mFixXY(1,1,succ(lo(windmax)),succ(hi(windmax)));
  253.   mEvent.Flag := 0;
  254. << do the program >>
  255.   mReset(theMouse);
  256. }
  257. END.
  258.  
  259.