home *** CD-ROM | disk | FTP | other *** search
- UNIT ScreenLow;
- (* (c) 1991 Ralf Hensmann & toolbox *)
-
- INTERFACE
-
- USES Dos,Crt;
-
- (**************************************************************************)
- (* *)
- (* Export *)
- (* *)
- (* 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 *)
- (* SaveGroundLine - speichert die unterste Zeile *)
- (* RestoreGroundLine - restort die unterste Zeile *)
- (* Advance(i) - springt auf Wortanfang *)
- (* DelCh - löscht Zeichen aus Zeile *)
- (* *)
- (**************************************************************************)
-
- TYPE SChar = RECORD
- ch : CHAR;
- attr : BYTE;
- END;
- TScreen = ARRAY [1..25,1..80] OF SChar;
- PScreen = ^TScreen;
-
- VAR Screen : PScreen;
-
-
- PROCEDURE InsChar(Ch : CHAR);
- (* Schreibt Zeichen an Cursorposition und schiebt Rest nach rechts *)
-
- PROCEDURE NewLine(x,y,ncx,ncy : INTEGER; Double,Rubber : BOOLEAN; TCol : BYTE);
- (* Berechnet Linie an aktueller Position (x,y) - Der neue Cursor steht *)
- (* an ncx,ncy *)
-
- PROCEDURE DoubleLine;
- (* Verdoppelt die Zeile, in der der Cursor steht *)
-
- PROCEDURE InsCr;
- (* Fügt CR in Text wie im Einfügemodus des Editors ein *)
-
- PROCEDURE SetHighback(Highback : BOOLEAN);
- (* Setzt / Löscht Hintergrundattribut blink/hell *)
-
- PROCEDURE SaveGroundLine;
- (* Speichert die unterste Zeile des Bildschirms *)
-
- PROCEDURE RestoreGroundLine;
- (* Restort die unterste Bildschirmzeile *)
-
- PROCEDURE Advance(dif : INTEGER);
- (* Springt an Wortanfang *)
-
- PROCEDURE DelCh;
- (* Löscht Buchstabe aus Zeile *)
-
- PROCEDURE Cursor(Block : BOOLEAN);
-
- IMPLEMENTATION
-
- VAR GroundLine : ARRAY [1..80] OF SChar;
- LastX, LastY : BYTE;
- TextAttrOld : BYTE;
-
- PROCEDURE Cursor(Block : BOOLEAN);
- VAR R : Registers;
- BEGIN
- IF LastMode = Mono THEN R.CL := 13 ELSE R.CL := 7;
- IF Block THEN R.CH := 0 ELSE R.CH := R.CL-1;
- R.AH := 1;
- Intr($10,R);
- END;
-
-
- FUNCTION IsAlpha(Ch : CHAR) : BOOLEAN;
- BEGIN
- IsAlpha := Ch IN ['a'..'z','A'..'Z','0'..'9','ä','ö','ü','Ä','Ö','Ü'];
- END;
-
-
- PROCEDURE Advance(dif : INTEGER);
- VAR x,y : INTEGER;
- NextIs,NowIs : BOOLEAN;
- BEGIN
- x := WhereX; y := WhereY;
- IF dif < 0 THEN BEGIN
- IF x = 1 THEN BEGIN
- x := 80; DEC(y);
- END;
- NextIs := FALSE;
- IF y > 0 THEN
- REPEAT
- DEC(x);
- NowIs := NextIs;
- NextIs := IsAlpha(Screen^[y,x-1].ch);
- UNTIL (x=1) OR (NOT NextIs AND NowIs);
- IF y = 0 THEN BEGIN
- y := 1; x := 1;
- END;
- END ELSE BEGIN
- IF x = 80 THEN BEGIN
- x := 1; INC(y);
- END;
- NextIs := TRUE;
- IF y <= 25 THEN
- REPEAT
- INC(x);
- NowIs := NextIs;
- NextIs := IsAlpha(Screen^[y,x+1].ch);
- UNTIL (x=79) OR (NextIs AND NOT NowIs);
- IF NextIs AND NOT NowIs THEN
- INC(x)
- ELSE BEGIN
- x := 1; INC(y);
- END;
- IF y = 26 THEN BEGIN
- y := 1; x := 1;
- END;
- END;
- GotoXY(x,y);
- END;
-
- PROCEDURE DelCh;
- VAR x,y : INTEGER;
- BEGIN
- x := WhereX; y := WhereY;
- Move(Screen^[y,x+1],Screen^[y,x],2*(80-x));
- Screen^[y,80].ch := ' ';
- END;
-
-
- PROCEDURE SetHighback(Highback : BOOLEAN);
- CONST Value : ARRAY [FALSE..TRUE] OF BYTE = ($29,$09);
- VAR R : Registers;
- BEGIN
- IF LastMode = Mono THEN
- Port[$3B8] := Value[Highback]
- ELSE BEGIN
- (* Port[$3D8] := Value[Highback]; *)
- R.AX:=$1003; R.BL:=1-ORD(HighBack);
- Intr($10,R);
- END;
- END;
-
-
- PROCEDURE InsChar(Ch : CHAR);
- VAR x,y,i : INTEGER;
- BEGIN
- x := WhereX; y := WhereY;
- IF x < 80 THEN
- Move(Screen^[y,x],Screen^[y,x+1],2*(80-x));
- Write(Ch);
- END;
-
-
- PROCEDURE DoubleLine;
- VAR x,y,i : INTEGER;
- BEGIN
- x := WhereX; y := WhereY;
- IF y = 25 THEN BEGIN
- GotoXY(1,1);
- DelLine;
- END ELSE BEGIN
- GotoXY(1,y+1);
- InsLine;
- Move(Screen^[y,x],Screen^[y+1,1],2*(81-x));
- END;
- END;
-
-
- PROCEDURE InsCr;
- VAR x,y,i : INTEGER;
- BEGIN
- x := WhereX; y := WhereY;
- IF y = 25 THEN BEGIN
- GotoXY(1,1);
- DelLine;
- y := 24;
- END;
- GotoXY(1,y+1);
- InsLine;
- Move(Screen^[y,x],Screen^[y+1,1],2*(81-x));
- GotoXY(x,y);
- Write('':81-x);
- i := 80;
- WHILE (i>0) AND (Screen^[y+1,i].ch=' ') DO BEGIN
- Screen^[y+1,i].attr := TextAttr;
- DEC(i);
- END;
- END;
-
-
- PROCEDURE SaveGroundLine;
- BEGIN
- Move(Screen^[25,1],GroundLine,SizeOf(GroundLine));
- LastX := WhereX; LastY := WhereY;
- TextAttrOld := TextAttr; TextAttr := 7;
- END;
-
-
- PROCEDURE RestoreGroundLine;
- BEGIN
- Move(GroundLine,Screen^[25,1],SizeOf(GroundLine));
- GotoXY(LastX,LastY);
- TextAttr := TextAttrOld;
- END;
-
-
- PROCEDURE NewLine(x,y,ncx,ncy : INTEGER; Double,Rubber : BOOLEAN; TCol : BYTE);
- TYPE NumArray = ARRAY [#179..#218] OF INTEGER;
- CONST BoxFeld : ARRAY [4..12] OF STRING[12] =
- ('*** ─═│┘╛║╜╝','***──═└┴┴╙╨╨','***═══╘┴╧╚╨╩',
- '***│┐╕│┤╡║┤╡','***┌┬┬├┼┼├┼┼','***╒┬╤╞┼╪├┼╪',
- '***║╖╗║┤╡║╢╣','***╓┼╥╟┼┼╟╫╫','***╔╥╦╠┼╪╠╫╬');
- Left : NumArray =
- (1,2, 3,2,2,3,3, 1,3,3,2,3, 2,1,2,2,1, 2,2,1,1,1, 1,3,3,1,3,
- 3,3,2,3,2, 1,1,1,1,2, 3,2,1);
- Above : NumArray =
- (2,2, 2,3,1,1,3, 3,1,3,3,2, 1,2,2,1,2, 1,2,2,3,3, 1,3,1,3,1,
- 3,2,3,1,1, 3,2,1,1,3, 2,2,1);
- Right : NumArray =
- (1,1, 1,1,1,1,1, 1,1,1,1,1, 1,2,2,2,2, 2,2,3,2,3, 3,3,3,3,3,
- 3,3,2,3,2, 2,3,3,2,2, 3,1,2);
- Below : NumArray =
- (2,2, 2,3,3,2,3, 3,3,1,1,1, 2,1,1,2,2, 1,2,2,3,1, 3,1,3,3,1,
- 3,1,1,2,3, 1,1,2,3,3, 2,1,2);
-
- FUNCTION Get(VAR N : NumArray; x,y : INTEGER) : INTEGER;
- VAR Ch : CHAR;
- BEGIN
- IF (x<=0) OR (x>80) OR (y<=0) OR (y>25) THEN
- Get := 1
- ELSE IF (x=ncx) AND (y=ncy) THEN
- IF Rubber THEN Get := 1 ELSE Get := 2+ORD(Double)
- ELSE BEGIN
- Ch := Screen^[y,x].ch;
- IF (Ch < #179) OR (Ch > #218) THEN
- Get := 1
- ELSE
- Get := N[Ch];
- END;
- END;
-
- VAR h : INTEGER;
- BEGIN
- IF Rubber THEN BEGIN
- Screen^[y,x].ch := ' ';
- END;
- Screen^[y,x].ch := BoxFeld[3*Get(Above,x,y+1)+Get(Left,x+1,y)]
- [3*Get(Below,x,y-1)+Get(Right,x-1,y)];
- Screen^[y,x].Attr := Screen^[y,x].Attr AND $F0 + TCol;
- END;
-
- BEGIN
- IF LastMode = Mono THEN Screen := Ptr($B000,0)
- ELSE Screen := Ptr($B800,0);
- END.
-