home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* MENROUTS.PAS *)
- (* Routinen für MENUE.PAS *)
- (* *)
- (* (C) 1988 by Lutz & Stefan Tandecki & TOOLBOX *)
- (* ------------------------------------------------------ *)
-
- UNIT MenRouts;
-
- INTERFACE
-
- USES Crt, Dos;
-
- TYPE WorkString = String[255];
-
- FUNCTION Kette(Anzahl, Code: BYTE): WorkString;
-
- PROCEDURE Cursor(TopEdge, BottomEdge: BYTE);
- PROCEDURE CursorOff;
- PROCEDURE CursorOn;
- PROCEDURE FillLinePart(Zeile, Spalte, Breite: BYTE);
- PROCEDURE InitMergeClip;
- PROCEDURE MergeBoxInScreen(SourceX1, SourceY1, SourceX2,
- SourceY2, DestX1, DestY1: INTEGER);
- PROCEDURE ReversAus;
- PROCEDURE ReversEin;
- PROCEDURE WriteInMergeClip(Spalte, Zeile: BYTE;
- Arg: WorkString);
-
- VAR CGAMode : BOOLEAN;
- VideoScr1 : ARRAY[1..4000] OF BYTE ABSOLUTE $B000:$0000;
- VideoScr2 : ARRAY[1..4000] OF BYTE ABSOLUTE $B800:$0000;
-
- IMPLEMENTATION
-
- VAR MergeMem : ARRAY[1..4000] OF BYTE;
- Reg : Registers;
-
- (* ------------------------------------------------------ *)
- (* Kette - Gibt n gleiche Zeichen zurück. *)
-
- FUNCTION Kette(Anzahl, Code: BYTE): WorkString;
- VAR i: BYTE;
-
- BEGIN
- FOR i := 1 TO Anzahl DO Kette[i] := Chr(Code);
- Kette[0] := Chr(Anzahl);
- END;
-
- (* ------------------------------------------------------ *)
- (* Cursor - Bestimmt die Form des Cursors. *)
-
- PROCEDURE Cursor(TopEdge, BottomEdge: BYTE);
-
- BEGIN
- WITH Reg DO BEGIN
- ax := 1 SHL 8;
- cx := TopEdge SHL 8 + BottomEdge;
- END;
- Intr($10, Reg);
- END;
-
- (* ------------------------------------------------------ *)
- (* CursorOn - Schaltet den Cursor (wieder) ein. *)
-
- PROCEDURE CursorOn;
-
- BEGIN
- Cursor(11, 13);
- END;
-
- (* ------------------------------------------------------ *)
- (* CursorOff - Schaltet den Cursor aus. *)
-
- PROCEDURE CursorOff;
-
- BEGIN
- Cursor(8, 0);
- END;
-
- (* ------------------------------------------------------ *)
- (* ReversEin - Bildschirmattribut für revers *)
-
- PROCEDURE ReversEin;
-
- BEGIN
- TextColor(Black); TextBackground(White);
- END;
-
- (* ------------------------------------------------------ *)
- (* ReversAus - Schaltet das Bildschirmattribut aus. *)
-
- PROCEDURE ReversAus;
-
- BEGIN
- NormVideo;
- END;
-
- (* ------------------------------------------------------ *)
- (* FillLinePart - Füllt Teile der Zeile mit aktuellem *)
- (* Textattribut. *)
-
- PROCEDURE FillLinePart(Zeile, Spalte, Breite: BYTE);
- VAR i, e : INTEGER;
-
- BEGIN
- e := 160 * (Zeile - 1) + 2 * (Spalte - 1);
- FOR i := 1 TO Breite DO
- IF (CGAMode) THEN
- VideoScr1[e + 2 * i] := TextAttr
- ELSE
- VideoScr2[e + 2 * i] := TextAttr;
- END;
-
- (* ------------------------------------------------------ *)
- (* InitMergeClip - Initialisiert Pseudo-Bildschirm. *)
-
- PROCEDURE InitMergeClip;
- VAR x, y: INTEGER;
-
- BEGIN
- FOR y := 0 TO 24 DO
- FOR x := 0 TO 79 DO BEGIN
- MergeMem[1 + y * 160 + x * 2] := 32;
- MergeMem[y * 160 + x * 2 + 2] := TextAttr;
- END;
- END;
-
- (* ------------------------------------------------------ *)
- (* WriteInMergeClip - Schreibt in Pseudo-Bildschirm *)
- (* einen übergebenen String. *)
-
- PROCEDURE WriteInMergeClip(Spalte, Zeile: BYTE;
- Arg: WorkString);
- VAR i, e : INTEGER;
-
- BEGIN
- e := 1 + 160 * (Zeile - 1) + 2 * (Spalte - 1);
- FOR i := 1 TO Length(Arg) DO
- IF (Arg[i] = #1) THEN
- LowVideo
- ELSE
- If (Arg[i] = #2) THEN
- HighVideo
- ELSE BEGIN
- MergeMem[e] := Ord(Arg[i]);
- MergeMem[e + 1] := TextAttr;
- e := e + 2;
- END;
- END;
-
- (* ------------------------------------------------------ *)
- (* MergeBoxInScreen - Blendet einen Bereich des *)
- (* Pseudo-Bildschirms in den *)
- (* aktuellen Bildschirm ein. *)
-
- PROCEDURE MergeBoxInScreen(SourceX1, SourceY1, SourceX2,
- SourceY2, DestX1, DestY1: INTEGER);
- VAR i, Quelle, Ziel, AnzBytes: INTEGER;
-
- BEGIN
- Quelle := 1 + (SourceY1 - 1) * 160 + (SourceX1 - 1) * 2;
- Ziel := 1 + (DestY1 - 1) * 160 + (DestX1 - 1) * 2;
- AnzBytes := (SourceX2 - SourceX1) * 2;
- FOR i := SourceY1 TO SourceY2 DO BEGIN
- IF (CGAMode) THEN
- Move(MergeMem[Quelle], VideoScr1[Ziel], AnzBytes)
- ELSE
- Move(MergeMem[Quelle], VideoScr2[Ziel], AnzBytes);
- INC (Quelle, 160);
- INC (Ziel, 160);
- END;
- END;
-
-
- BEGIN (* Of Unit *)
- IF (Mem[0000:1040] AND $30) = $30 THEN CGAMode := TRUE
- ELSE CGAMode := FALSE;
- END.
-
- (* ------------------------------------------------------ *)
- (* Ende von MENROUTS.PAS *)