home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TTT405.ZIP / KEYTTT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-07-17  |  6.5 KB  |  261 lines

  1. {$S-,R-,V-,D-,T-}
  2. {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
  3. {         TechnoJocks Turbo Toolkit v4.05           Released: Jul 18, 1988    }
  4. {                                                                             }
  5. {         Module: KeyTTT    --    keyboard and mouse input                    }
  6. {                                                                             }
  7. {                  Copyright R. D. Ainsbury (c) 1986-88                       }
  8. {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
  9.  
  10. unit KeyTTT;
  11.  
  12. Interface
  13.  
  14. uses CRT, DOS;
  15.  
  16. type
  17.   Button = (NoB,LeftB,RightB,BothB);
  18.  
  19. var
  20.   Moused : boolean;
  21.   Horiz_Sensitivity : integer;
  22.  
  23.  
  24. Function  Mouse_Installed:Boolean;
  25. Procedure Show_Mouse_Cursor;
  26. Procedure Hide_Mouse_Cursor;
  27. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  28. Procedure Move_Mouse(Hor,Ver: integer);
  29. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  30. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  31. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  32. Function  GetKey : Char;
  33. Procedure DelayKey(Time : integer);
  34.  
  35. Implementation
  36.  
  37.  
  38. Function Mouse_Installed:Boolean;
  39. var
  40.   Reg: registers;
  41.  
  42.     Function Interrupt_loaded:boolean;
  43.     begin
  44.         Reg.Ax := 0;
  45.         Intr($33,Reg);
  46.         Interrupt_Loaded :=  Reg.Ax <> 0;
  47.     end;
  48.  
  49. begin
  50.     If Memw[$0000:$00CC] = 0 then
  51.        Mouse_Installed := false          {don't call interrupt if vector is zero}
  52.     else
  53.        Mouse_Installed := Interrupt_loaded;
  54. end; {Func Mouse_Installed}
  55.  
  56. Procedure Show_Mouse_Cursor;
  57. var
  58.   Reg: registers;
  59. begin
  60.     Reg.Ax := 1;
  61.     Intr($33,Reg);
  62. end; {Proc Show_Mouse_Cursor}
  63.  
  64. Procedure Hide_Mouse_Cursor;
  65. var
  66.   Reg : registers;
  67. begin
  68.     Reg.Ax := 2;
  69.     Intr($33,Reg);
  70. end; {Proc Hide_Mouse_Cursor}
  71.  
  72. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  73. var
  74.   Reg: registers;
  75. begin
  76.     with Reg do
  77.     begin
  78.         Ax := 3;
  79.         Intr($33,Reg);
  80.         Hor := Cx div 8;
  81.         Ver := Dx div 8;
  82.         {$B+}
  83.         If ((Bx and $1) <> $1)  and  ((Bx and $2) <> $2) then
  84.         begin
  85.             But := NoB;
  86.             exit;
  87.         end;
  88.         If ((Bx and $1) = $1)  and   ((Bx and $2) = $2) then
  89.            But := BothB
  90.         else
  91.         begin
  92.             If (Bx and $1) = $1 then
  93.                But := LeftB
  94.             else
  95.                But := RightB;
  96.         end;
  97.         {$B-}
  98.     end; {with}
  99. end;   {Get_Mouse_Action}
  100.  
  101. Procedure Move_Mouse(Hor,Ver: integer);
  102. var
  103.   Reg: registers;
  104. begin
  105.     Reg.Ax := 4;
  106.     Reg.Cx := pred(Hor*8);
  107.     Reg.Dx := pred(ver*8);
  108.     Intr($33,Reg);
  109. end; {Proc Move_mouse}
  110.  
  111. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  112. var
  113.  Reg: registers;
  114. begin
  115.     Reg.Ax := 7;
  116.     Reg.Cx := pred(Left*8);
  117.     Reg.Dx := pred(Right*8);
  118.     Intr($33,Reg);
  119. end;
  120.  
  121. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  122. var
  123.  Reg: registers;
  124. begin
  125.     Reg.Ax := 8;
  126.     Reg.Cx := pred(Top*8);
  127.     Reg.Dx := pred(Bot*8);
  128.     Intr($33,Reg);
  129. end;
  130.  
  131. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  132. var
  133.   Reg: registers;
  134. begin
  135.    Reg.Ax := 10;
  136.    Reg.Bx := 0;        {software text cursor}
  137.    Reg.Cx := $7700;
  138.    Reg.Dx := $77 and OrdChar;
  139.    Intr($33,Reg);
  140. end;
  141.  
  142. Function GetKey:char;
  143. {waits for keypress or mouse activity}
  144. {Note that if an extended key is pressed e.g. F1, then a value of 128 is
  145.  added to the Char value. Also if a mouse is active the trapped mouse
  146.  activity is returned as follows:
  147.  
  148.                MouseUp    =  #128;
  149.                MouseDown  =  #129;
  150.                MouseLeft  =  #130;
  151.                MouseRight =  #131;
  152.                MouseEsc   =  #132;        right button
  153.                MouseEnter =  #133;        left button
  154. }
  155. Const
  156.  H = 40;
  157.  V = 13;
  158.  MouseUp    =  #128;
  159.  MouseDown  =  #129;
  160.  MouseLeft  =  #130;
  161.  MouseRight =  #131;
  162.  MouseEsc   =  #132;
  163.  MouseEnter =  #133;
  164. var
  165.   Action,
  166.   Finished : boolean;
  167.   Hor, Ver : integer;
  168.   B : button;
  169.   Ch : char;
  170. begin
  171.     Finished := false;
  172.     Action := false;
  173.     B := NoB;
  174.     If Moused then Move_Mouse(H,V);     {logically put mouse in middle of screen}
  175.     Repeat                      {keep checking Mouse for activity until keypressed}
  176.          If Moused then
  177.          begin
  178.              Get_Mouse_Action(B,Hor,Ver);
  179.              Case B of
  180.              LeftB : begin
  181.                          Ch := MouseEnter;
  182.                          Finished := true;
  183.                      end;
  184.              RightB: begin
  185.                          Ch := MouseEsc;
  186.                          Finished := true;
  187.                      end;
  188.              end; {case}
  189.              If (Ver - V) > 1 then
  190.              begin
  191.                  Ch := MouseDown;
  192.                  Finished := true;
  193.              end
  194.              else
  195.                 If (V - Ver) > 1 then
  196.                 begin
  197.                     Ch := MouseUp;
  198.                     Finished := true;
  199.                 end
  200.                 else
  201.                    If (Hor - H) > Horiz_Sensitivity then
  202.                    begin
  203.                        Ch := MouseRight;
  204.                        Finished := true;
  205.                    end
  206.                    else
  207.                       If (H - Hor) > Horiz_Sensitivity then
  208.                       begin
  209.                           Ch := MouseLeft;
  210.                           Finished := true;
  211.                       end;
  212.          end;
  213.          If Keypressed or finished then Action := true;
  214.     until Action;
  215.     If not finished then
  216.     begin
  217.         Ch := ReadKey;
  218.         Repeat
  219.              if Ch = #0 then
  220.              begin
  221.                  Ch := ReadKey;
  222.                  if Ord(Ch) > 127 then
  223.                     Ch := #0
  224.                  else
  225.                     Ch := Chr(Ord(Ch) + 128);
  226.              end;
  227.         Until Ch <> #0;
  228.     end;
  229.  
  230.     If finished and (Ch in [MouseEnter,MouseEsc]) then
  231.     begin
  232.         Delay(150);
  233.         Get_Mouse_Action(B,Hor,Ver);  {abbbsorb an mouse activity}
  234.     end;
  235.     GetKey := Ch;
  236. end;
  237.  
  238. Procedure DelayKey(Time : integer);
  239. var
  240.   I : Integer;
  241.   ChD : char;
  242. begin
  243.     I := 1;
  244.     While I < Time DIV 100 do
  245.     begin
  246.         Delay(100);
  247.         I := succ(I);
  248.         If Keypressed then
  249.         begin
  250.             I := MaxInt;
  251.             ChD := GetKey;           {absorb the keypress}
  252.         end;
  253.     end;
  254. end; {DelayKey}
  255.  
  256. begin   {unit initialization code}
  257.     Moused := Mouse_Installed;
  258.     If Moused then Horiz_Sensitivity := 1;
  259. end.
  260.  
  261.