program screen (input,output); {read from a file and display on the screen.} TYPE txtstorage = ARRAY [0..200] OF string[90]; VAR source,nat,temp: text; {source file} name: string [14]; filename: string[14]; line: string[120]; screen: txtstorage; lno,vkey,row,col,i,dstart,rlen: integer; key: char; PROCEDURE cursor(x,y: integer); BEGIN write(chr(1bh), 'Y', chr(y+20h), chr(x+20h)); END; PROCEDURE putcursor; BEGIN cursor(col-1,row-dstart); END; PROCEDURE writerow; BEGIN cursor(0,row-dstart); writeln(screen[row]); putcursor; END; PROCEDURE readscreen; VAR max: integer; BEGIN max := lno+40; WHILE (NOT eof(source)) AND (lno < max) DO BEGIN readln(source,line); screen[lno] := line; lno := lno+1; END END; PROCEDURE clearscreen; BEGIN write(chr(1bH)); write('E'); END; PROCEDURE upc; BEGIN IF row>1 THEN BEGIN row := row-1; IF row < dstart THEN BEGIN dstart := row; write(chr(1bh),'L'); writerow; END ELSE write(chr(1bH),chr(41H)); END; END; PROCEDURE testeof; FORWARD; PROCEDURE downc; BEGIN row := row+1; IF row= lno THEN testeof; IF row=(dstart+29) THEN BEGIN writeln; writeln; writeln; dstart:= dstart+1; writerow; writeln; putcursor; {does a scroll up} END ELSE write(chr(1bH),chr(42h)); END; PROCEDURE rightc; BEGIN IF (col<80) THEN BEGIN write(chr(1bh),chr(43h)); col := col+1; END; END; PROCEDURE leftc; BEGIN IF (col>0) THEN BEGIN write(chr(1bh),chr(44h)); col := col-1; END; END; PROCEDURE delc; BEGIN IF col > rlen THEN BEGIN col:=rlen+1;putcursor;END; IF col>1 THEN BEGIN leftc; write(chr(1bH),'N'); delete(screen[row],col,1); END; END; PROCEDURE cutl; VAR i,x: integer; BEGIN write(chr(1bh),'M'); IF row=lno THEN testeof; IF rowrow DO BEGIN screen[i+1] := screen[i]; i:= i-1; END; IF col>rlen THEN col:=rlen+1; line := screen[row]; ll := length(line)-col+1; IF ll=0 THEN BEGIN screen[row+1] := ''; END ELSE BEGIN screen[row+1] := copy(line, col, ll); delete(screen[row],col,ll); END; write(chr(1bh),'L'); write(chr(1bh),'K'); writerow; row:=row+1; writeln; write(chr(1bh),'K');writerow; row := row-1; putcursor; END; PROCEDURE rewritescr; VAR i,j: integer; BEGIN IF 28+dstart > 200 THEN testeof; j:=28+dstart; cursor(0,1); clearscreen; for i := dstart+1 to j DO writeln(screen[i]); putcursor; END; PROCEDURE testeof; VAR i,cut,j,fl: integer; BEGIN write(chr(7)); fl:=0; IF dstart+30 >= lno THEN BEGIN IF NOT eof(source) THEN BEGIN IF lno > 100 THEN BEGIN cut := lno-50; FOR i:= 1 to cut DO writeln(temp, screen[i]); i := 1; j := cut; WHILE j < lno DO BEGIN screen[i] := screen[j]; i := i+1; j:=j+1; END; dstart := dstart-cut; row := row-cut; lno := i; fl:=1; END; readscreen; IF fl=1 THEN rewritescr; END; END; END; BEGIN clearscreen; write('Source File:'); readln(name); filename := name; assign(source, filename); reset (source); {Now read in the first screen full} clearscreen; cursor(0,1); lno := 1; row := 1; col := 1; key:='a';dstart:=0; readscreen; rewritescr; assign(nat, 'KBD:'); reset(nat); {get at keyboard directly} assign(temp,'M:SCR.TMP'); rewrite(temp); WHILE ord(key) <> 3 DO BEGIN IF eoln(nat) THEN BEGIN donl; key := chr(0); END ELSE read(nat, key); vkey := ord(key); IF vkey <> 0 THEN BEGIN rlen := length(screen[row]); IF (vkey>31) AND (vkey<127) THEN BEGIN IF col>rlen THEN col := rlen+1; insert(key,screen[row],col); col := col+1; writerow; END ELSE BEGIN CASE vkey OF 1: leftc; 6: rightc; 18: rewritescr; 21: cutl; 30: downc; 31: upc; 127: delc; OTHERWISE write(vkey); END {case} END; END; END; FOR i := 1 to lno DO writeln(temp,screen[i]); cursor(0,0); clearscreen; writeln('File in M:SCR.TMP'); WHILE NOT eof(source) DO BEGIN readln(source, line); writeln(temp, line); END; END. ile in M:SCR.TMP'); WHILE NOT eof(source) DO BEGIN readln(source, line); writeln(temp, line); END; END.