home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* MAUSIT.PAS *)
- (* Mausroutinen für HERCULES.PAS *)
- (* (c) 1991 Roland Ruder & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT MausIt;
-
- INTERFACE
- USES Dos;
-
- PROCEDURE MouseOn; (* Export wg. HERCULES.PAS *)
- PROCEDURE MouseOff; (* ebenso *)
- PROCEDURE SwitchMouse; (* ebenso *)
-
- IMPLEMENTATION
-
- VAR
- Regs : Registers;
- OldVector : Pointer;
- MouseEmu : BOOLEAN;
-
- PROCEDURE InsertKey(Low, High, Count : BYTE);
- (* Schreibt durch Mausaktionen emulierte Tasten in den
- Tastaturpuffer *)
- VAR
- B : BYTE;
- W : WORD;
- BEGIN
- Count := Count DIV 20;
- FOR B := 0 TO Count DO
- BEGIN
- W := MemW[$40:$1C];
- Mem[$40:W] := Low;
- Mem[$40:W + 1] := High;
- IF W >= $3C THEN MemW[$40:$1C] := $1E
- ELSE Inc(MemW[$40:$1C], 2);
- Port[$20] := $20;
- END;
- END;
-
- FUNCTION ButtonPressed(B : BYTE) : BOOLEAN;
- BEGIN
- Regs.AX := 5;
- Regs.BX := B;
- Intr($33, Regs);
- ButtonPressed := (Regs.BX = 1);
- END;
-
- PROCEDURE MouseMoved(VAR X, Y : INTEGER);
- BEGIN
- Regs.AX := 11;
- Intr($33, Regs);
- X := Regs.CX;
- Y := Regs.DX;
- END;
-
- FUNCTION MouseInstalled : BOOLEAN;
- BEGIN
- MouseInstalled := FALSE;
- IF Mem[$0000:$00CC] <> 0 THEN BEGIN
- Regs.AX := 0;
- Regs.BX := 0;
- Regs.CX := 0;
- Regs.DX := 0;
- Intr($33, Regs);
- MouseInstalled := (Regs.AX <> 0);
- END
- END;
-
- PROCEDURE SwitchMouse;
- (* Emulation ein/aus *)
- BEGIN
- MouseEmu := NOT MouseEmu;
- END;
-
- {$F+}
- PROCEDURE TimerInt(FLAGS, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP : WORD);
- INTERRUPT;
- VAR X, Y : INTEGER;
- BEGIN
- IF NOT MouseEmu THEN Exit;
- MouseMoved(X, Y);
- IF X < - 10 THEN InsertKey(0, 75, Abs(X)) (* Cursor l. *)
- ELSE IF X > 10 THEN InsertKey(0, 77, X); (* rechts *)
- IF Y < - 10 THEN InsertKey(0, 72, Abs(Y)) (* rauf *)
- ELSE IF Y > 10 THEN InsertKey(0, 80, Y); (* runter *)
- IF ButtonPressed(0) THEN InsertKey(13, 0, 1); (* Links: Enter *)
- IF ButtonPressed(1) THEN InsertKey(27, 0, 1); (* Rechts: Esc *)
- INLINE($9C / $3E / $FF / $1E / OldVector);
- END;
- {$F-}
-
- PROCEDURE MouseOn;
- (* "Manuelles" Einschalten der Emulation *)
- BEGIN
- IF NOT MouseInstalled THEN Exit;
- GetIntVec($1C, OldVector);
- SetIntVec($1C, @TimerInt);
- END;
-
- {$F+}
- PROCEDURE MouseOff;
- (* Exit-Prozedur wg. automatischer Emulation durch "uses MausIt" *)
- BEGIN
- IF NOT MouseInstalled THEN Exit;
- SetIntVec($1C, OldVector);
- END;
- {$F-}
-
- BEGIN
- (* Initialisierung der Unit: Automatisch Mausemulation einschalten.
- Der Export der Prozeduren MouseOn, MouseOff und SwitchMouse ist
- speziell für das Programm HERCULES.PAS vorgesehen, ansonsten ge-
- nügt das einfache Einbinden der Unit mittels "uses MausIt". *)
- IF MouseInstalled THEN BEGIN
- OldVector := ExitProc;
- ExitProc := @MouseOff;
- MouseOn;
- MouseEmu := TRUE;
- END;
- END.
-
-