home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / bonus / mausit.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-02-06  |  3.0 KB  |  123 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      MAUSIT.PAS                        *)
  3. (*              Mausroutinen für HERCULES.PAS             *)
  4. (*             (c) 1991 Roland Ruder & TOOLBOX            *)
  5. (* ------------------------------------------------------ *)
  6. UNIT MausIt;
  7.  
  8. INTERFACE
  9. USES Dos;
  10.  
  11. PROCEDURE MouseOn;      (* Export wg. HERCULES.PAS *)
  12. PROCEDURE MouseOff;     (*       ebenso            *)
  13. PROCEDURE SwitchMouse;  (*       ebenso            *)
  14.  
  15. IMPLEMENTATION
  16.  
  17. VAR
  18.   Regs : Registers;
  19.   OldVector : Pointer;
  20.   MouseEmu : BOOLEAN;
  21.  
  22. PROCEDURE InsertKey(Low, High, Count : BYTE);
  23. (* Schreibt durch Mausaktionen emulierte Tasten in den
  24.    Tastaturpuffer *)
  25. VAR
  26.   B : BYTE;
  27.   W : WORD;
  28. BEGIN
  29.   Count := Count DIV 20;
  30.   FOR B := 0 TO Count DO
  31.   BEGIN
  32.     W := MemW[$40:$1C];
  33.     Mem[$40:W] := Low;
  34.     Mem[$40:W + 1] := High;
  35.     IF W >= $3C THEN MemW[$40:$1C] := $1E
  36.     ELSE Inc(MemW[$40:$1C], 2);
  37.     Port[$20] := $20;
  38.   END;
  39. END;
  40.  
  41. FUNCTION ButtonPressed(B : BYTE) : BOOLEAN;
  42. BEGIN
  43.   Regs.AX := 5;
  44.   Regs.BX := B;
  45.   Intr($33, Regs);
  46.   ButtonPressed := (Regs.BX = 1);
  47. END;
  48.  
  49. PROCEDURE MouseMoved(VAR X, Y : INTEGER);
  50. BEGIN
  51.   Regs.AX := 11;
  52.   Intr($33, Regs);
  53.   X := Regs.CX;
  54.   Y := Regs.DX;
  55. END;
  56.  
  57. FUNCTION MouseInstalled : BOOLEAN;
  58. BEGIN
  59.   MouseInstalled := FALSE;
  60.   IF Mem[$0000:$00CC] <> 0 THEN BEGIN
  61.     Regs.AX := 0;
  62.     Regs.BX := 0;
  63.     Regs.CX := 0;
  64.     Regs.DX := 0;
  65.     Intr($33, Regs);
  66.     MouseInstalled := (Regs.AX <> 0);
  67.   END
  68. END;
  69.  
  70. PROCEDURE SwitchMouse;
  71. (* Emulation ein/aus *)
  72. BEGIN
  73.   MouseEmu := NOT MouseEmu;
  74. END;
  75.  
  76. {$F+}
  77. PROCEDURE TimerInt(FLAGS, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP : WORD);
  78. INTERRUPT;
  79. VAR X, Y : INTEGER;
  80. BEGIN
  81. IF NOT MouseEmu THEN Exit;
  82. MouseMoved(X, Y);
  83. IF X < - 10 THEN InsertKey(0, 75, Abs(X))       (* Cursor l. *)
  84.     ELSE IF X > 10 THEN InsertKey(0, 77, X);    (* rechts    *)
  85. IF Y < - 10 THEN InsertKey(0, 72, Abs(Y))       (* rauf      *)
  86.     ELSE IF Y > 10 THEN InsertKey(0, 80, Y);    (* runter    *)
  87. IF ButtonPressed(0) THEN InsertKey(13, 0, 1);   (* Links: Enter *)
  88. IF ButtonPressed(1) THEN InsertKey(27, 0, 1);   (* Rechts: Esc  *)
  89. INLINE($9C / $3E / $FF / $1E / OldVector);
  90. END;
  91. {$F-}
  92.  
  93. PROCEDURE MouseOn;
  94. (* "Manuelles" Einschalten der Emulation *)
  95. BEGIN
  96.   IF NOT MouseInstalled THEN Exit;
  97.   GetIntVec($1C, OldVector);
  98.   SetIntVec($1C, @TimerInt);
  99. END;
  100.  
  101. {$F+}
  102. PROCEDURE MouseOff;
  103. (* Exit-Prozedur wg. automatischer Emulation durch "uses MausIt" *)
  104. BEGIN
  105.   IF NOT MouseInstalled THEN Exit;
  106.   SetIntVec($1C, OldVector);
  107. END;
  108. {$F-}
  109.  
  110. BEGIN
  111. (* Initialisierung der Unit: Automatisch Mausemulation einschalten.
  112.    Der Export der Prozeduren MouseOn, MouseOff und SwitchMouse ist
  113.    speziell für das Programm HERCULES.PAS vorgesehen, ansonsten ge-
  114.    nügt das einfache Einbinden der Unit mittels "uses MausIt". *)
  115.   IF MouseInstalled THEN BEGIN
  116.     OldVector := ExitProc;
  117.     ExitProc := @MouseOff;
  118.     MouseOn;
  119.     MouseEmu := TRUE;
  120.   END;
  121. END.
  122.  
  123.