home *** CD-ROM | disk | FTP | other *** search
- UNIT Interpreter;
- (* (c) 1991 Ralf Hensmann & toolbox *)
-
-
- (**************************************************************************)
- (* Interpreter der TOOLBOX-Trickbox *)
- (* *)
- (* Aufgabe: Interpretierung von Tastaturzeichen auf dem Schirm. *)
- (* *)
- (* Alle Zeichen werden als druckbar angesehen und auf dem Bildschirm aus- *)
- (* gegeben. Steuerzeichen werden als Steuercode interpretiert. *)
- (* Steuercodes: *)
- (* *)
- (* A..P : Vordergrundfarbe setzen (0..15) *)
- (* a..p : Hintergrundfarbe setzen (0..15) *)
- (* <> : Cursor links bzw. rechts *)
- (* ^_ : Cursor oben bzw. unten *)
- (* - : Umschalten in den Line-Modus (Einfache Linie) *)
- (* = : Umschalten in den Line-Modus (Doppelte Linie) *)
- (* ? : Umschalten in den Line-Modus (keine Linienänderung) *)
- (* / : Ausschalten des Linienmodus *)
- (* U : Rubber-Mode *)
- (* # : Ein/Ausschalten des Einfügemodus *)
- (* ! : Umschalten auf hellen/blinkenden Hintergrund *)
- (* X,Y : Zeilen einfügen/löschen *)
- (* R : Return des Editors *)
- (* W : Warte-Befehl (3*normales Warten) *)
- (* Z : Löscht den Bildschirm *)
- (* {} : HOME, END *)
- (* () : PgUp,PgDown *)
- (* [] : Ctrl-Pfeiltasten *)
- (* $& : Del, BS *)
- (* *)
- (* Im Linienmodus sind nur die Befehle /,<,>,^ und _ erlaubt ! *)
- (* *)
- (**************************************************************************)
-
- INTERFACE
-
- (**************************************************************************)
- (* *)
- (* Import *)
- (* *)
- (* ScreenLow: TScreen - Schirmtyp (80*25 Zeichen) *)
- (* PScreen - Zeiger auf Schirmtyp *)
- (* Screen - Zeiger auf den Textbildschirm *)
- (* InsChar(ch) - fügt Zeichen an Cursorposition ein. *)
- (* NewLine(i,i,i,i,b) - Neue Linie von nach, doppelt ? *)
- (* InsCr - Editor-CR (Einfügemodus) *)
- (* SetHighBack(b) - Setzt Hintergrund hell/blinkend *)
- (* *)
- (**************************************************************************)
- USES ScreenLow,Crt;
-
- TYPE TStatus = RECORD (* wird nur wegen DISPOSE exportiert *)
- Ins : BOOLEAN;
- Line : BOOLEAN;
- Double : BOOLEAN;
- Rubber : BOOLEAN;
- HighBack : BOOLEAN;
- Ctrl : BOOLEAN;
- LastX,
- LastY : BYTE;
- Wait : REAL;
- TCol,BCol : BYTE;
- Schirm : TScreen;
- END;
- PStatus = ^TStatus;
-
- VAR PrintState : BOOLEAN; (* Gibt an, ob Print... erfolgreich war *)
-
- PROCEDURE InitScreen;
- (* Initialisiert den Schirm *)
-
- FUNCTION SaveState(CtrlMode : BOOLEAN) : PStatus;
- (* Sichert Status der Operation *)
-
- PROCEDURE RestoreState(State : PStatus; VAR CtrlMode : BOOLEAN);
- (* Stellt den gespeicherten Status wieder her. *)
-
- PROCEDURE PrintChar(CH : CHAR; Time : BOOLEAN);
- (* Druckt ein Zeichen an der Stelle aus und korrigiert die Zeile *)
-
- PROCEDURE PrintCode(CH : CHAR; Time : BOOLEAN);
- (* Gibt den Code aus *)
-
- PROCEDURE WriteStatusLine(Pos : INTEGER);
- (* Gibt die Statuszeile aus *)
-
- IMPLEMENTATION
-
- VAR Ins : BOOLEAN; (* Insert-Modus an ? *)
- Line : BOOLEAN; (* Line-Modus an ? *)
- Double : BOOLEAN; (* Doppel-Linienmode ? *)
- Rubber : BOOLEAN;
- HighBack : BOOLEAN; (* Background hell/blinkend *)
- Wait : REAL; (* Verzögerungszeit *)
- TCol,BCol : BYTE; (* Vorder- und Hintergrundfarbe *)
-
- PROCEDURE TextBackground(Color : BYTE);
- BEGIN
- TextAttr := TextAttr AND $F + (Color AND $F) SHL 4;
- END;
-
- PROCEDURE TextColor(Color : BYTE);
- BEGIN
- TextAttr := TextAttr AND $F0 + (Color AND $F);
- END;
-
- PROCEDURE WriteStatusLine(Pos : INTEGER);
- TYPE BoolSt = ARRAY [FALSE..TRUE] OF STRING[8];
- CONST InsertSt : BoolSt = ('<Ovr> ','<Ins> ');
- LineSt : BoolSt = (' ','Line ');
- DoubleSt : BoolSt = (' ',' ╠╬╣ ');
- RubberSt : BoolSt = (' ','<Rub> ');
- HighBSt : BoolSt = ('<Blk> ','<Hgh> ');
- VAR x,y : INTEGER;
- BEGIN
- x := WhereX; y := WhereY;
- GotoXY(1,25);
- Write('':79);
- GotoXY(1,25);
- Write('(',x:2,' /',y:2,') ',InsertSt[Ins],LineSt[Line],DoubleSt[Double],
- RubberSt[Rubber],HighBSt[HighBack],' ',Wait:6:2);
- END;
-
- FUNCTION SaveState(CtrlMode : BOOLEAN) : PStatus;
- VAR p : PStatus;
- BEGIN
- New(p);
- p^.Ins := Ins; p^.Line := Line;
- p^.Double := Double; p^.Schirm := Screen^;
- p^.Wait := Wait; p^.TCol := TCol;
- p^.BCol := BCol; p^.HighBack := HighBack;
- SaveState := p; p^.Ctrl := CtrlMode;
- p^.LastX := WhereX; p^.LastY := WhereY;
- p^.Rubber := Rubber;
- END;
-
- PROCEDURE RestoreState(State : PStatus; VAR CtrlMode : BOOLEAN);
- BEGIN
- Ins := State^.Ins; Line := State^.Line;
- Double := State^.Double; Wait := State^.Wait;
- Screen^:= State^.Schirm; TCol := State^.TCol;
- BCol := State^.BCol; HighBack := State^.HighBack;
- SetHighBack(HighBack); CtrlMode := State^.Ctrl;
- Rubber := State^.Rubber;
- Cursor(Line);
- TextColor(TCol);
- TextBackground(BCol);
- GotoXY(State^.LastX,State^.LastY);
- END;
-
- PROCEDURE InitScreen;
- BEGIN
- TextColor(LightGray); TCol := LightGray;
- TextBackground(Black); BCol := Black;
- Ins := FALSE; Line := FALSE;
- Double := FALSE; Wait := 30;
- SetHighBack(FALSE); HighBack := FALSE;
- Rubber := FALSE;
- ClrScr;
- GotoXY(1,1);
- END; (* InitScreen *)
-
- PROCEDURE PrintChar(CH : CHAR; Time : BOOLEAN);
- BEGIN
- IF Line THEN
- PrintState := FALSE
- ELSE BEGIN
- PrintState := TRUE;
- IF Ins THEN InsChar(CH) ELSE Write(CH);
- IF Time AND (Wait >= 1.0) THEN Delay(Trunc(Wait));
- END;
- END; (* PrintChar *)
-
- PROCEDURE PrintCode(CH : CHAR; Time : BOOLEAN);
- VAR x,y,hx,hy : INTEGER;
- BEGIN
- IF Time AND (Wait >= 1.0) AND (CH IN ['<','>','^','_','{','}','X','+','Y','R','Z','(',')','[',']','$','&']) THEN
- Delay(Trunc(Wait));
- x := WhereX; y := WhereY;
- IF Line THEN BEGIN
-
- hx := x; hy := y;
- CASE CH OF
- '<' : IF x=1 THEN x := 80 ELSE Dec(x);
- '>' : IF x=80 THEN x := 1 ELSE Inc(x);
- '^' : IF y=1 THEN y := 25 ELSE Dec(y);
- '_' : IF y=25 THEN y := 1 ELSE Inc(y);
- '-' : BEGIN Double := FALSE; Rubber := FALSE END;
- '=' : BEGIN Double := TRUE; Rubber := FALSE END;
- 'U' : Rubber := TRUE;
- '?' : Rubber := FALSE;
- '/' : BEGIN
- Line:=FALSE;
- Cursor(FALSE);
- PrintState := TRUE;
- Exit;
- END;
- ELSE BEGIN
- PrintState := FALSE;
- Exit;
- END; END;
- NewLine(hx,hy,x,y,Double,Rubber,TCol);
- GotoXY(x,y);
- PrintState := TRUE;
-
- END ELSE BEGIN
-
- PrintState := TRUE;
-
- CASE CH OF
- 'A'..'P' : BEGIN
- TCol := Ord(CH) - Ord('A');
- TextColor(TCol);
- END;
- 'a'..'p' : BEGIN
- BCol := Ord(CH) - Ord('a');
- TextBackground(BCol);
- END;
- '<' : IF x=1 THEN x := 80 ELSE Dec(x);
- '>' : IF x=80 THEN x := 1 ELSE Inc(x);
- '^' : IF y=1 THEN y := 25 ELSE Dec(y);
- '_' : IF y=25 THEN y := 1 ELSE Inc(y);
- '{' : x := 1;
- '}' : x := 80;
- '-' : BEGIN
- Line := TRUE;
- Double := FALSE;
- Rubber := FALSE;
- Cursor(TRUE);
- END;
- '=' : BEGIN
- Line := TRUE;
- Double := TRUE;
- Rubber := FALSE;
- Cursor(TRUE);
- END;
- '?' : BEGIN
- Line := TRUE;
- Rubber := FALSE;
- Cursor(TRUE);
- END;
- '!' : BEGIN
- HighBack := NOT HighBack;
- SetHighBack(HighBack);
- END;
- '#' : Ins := NOT Ins;
- 'X' : InsLine;
- '+' : DoubleLine;
- 'Y' : DelLine;
- 'R' : IF Ins THEN InsCr
- ELSE WriteLn;
- 'W' : IF Time THEN Delay(Trunc(5*Wait));
- 'Z' : ClrScr;
- '(' : y := 1;
- ')' : y := 25;
- '[' : Advance(-1);
- ']' : Advance(+1);
- '*' : IF Wait > 0.00009 THEN Wait := Wait / 1.1 ELSE Wait := 0.00009;
- '~' : IF Wait < 1000 THEN Wait := Wait * 1.1 ELSE Wait := 1000;
- '$' : DelCh;
- '&' : IF x > 1 THEN BEGIN
- Dec(x);
- GotoXY(x,y);
- DelCh;
- END;
- ELSE (* CASE *)
- PrintState := FALSE;
- END; (* CASE *)
- IF CH IN ['<','>','^','_','{','}','(',')','&'] THEN
- GotoXY(x,y);
- END; (* ELSE *)
- END; (* PrintCode *)
-
- END.
-
-