PROCEDURE input_menu; BEGIN GOTORC(1,48); normvideo; WRITE('Input Text '); GOTORC( 5,1); WRITE(' '); GOTORC( 6,1); WRITE(' '); GOTORC( 7,1); WRITE(' '); GOTORC( 8,1); WRITE(' '); GOTORC( 9,1); WRITE(' '); GOTORC(10,1); WRITE(' '); GOTORC(11,1); WRITE(' '); GOTORC(12,1); WRITE(' '); GOTORC(13,1); WRITE(' '); GOTORC(14,1); WRITE(' '); GOTORC( 4,42); WRITE(' '); GOTORC( 5,42); WRITE(' '); GOTORC( 6,42); WRITE(' '); GOTORC( 7,42); WRITE(' '); GOTORC( 8,42); WRITE(' '); GOTORC( 9,42); WRITE(' '); GOTORC(10,42); WRITE(' '); GOTORC(11,42); WRITE(' '); GOTORC(12,42); WRITE(' '); GOTORC(13,42); WRITE(' '); GOTORC(14,42); WRITE(' '); GOTORC(20,1); WRITE(' ^P'); lowvideo; WRITE(': Change parameters '); normvideo; WRITE('^F,^L'); lowvideo; WRITE(': Send Formfeed to LST '); normvideo; WRITE('^X'); lowvideo; WRITE(': Restart Input'); normvideo; GOTORC(21,1); WRITE('^C,^D'); lowvideo; WRITE(': Done, quit to OS '); normvideo; WRITE('^R,^T'); lowvideo; WRITE(': Send Reverse Formfeed '); normvideo; WRITE('^H'); lowvideo; WRITE(': Backspace'); normvideo; GOTORC(22,1); WRITE(''); lowvideo; WRITE(': Process Input '); normvideo; WRITE(' ^A'); lowvideo; WRITE(': Alternate Input (HEX) '); GOTORC(19,1); WRITE('Input Text -> '); normvideo; END; PROCEDURE inp_hex; {VAR add_str : S80} VAR str : S14; num,err : INTEGER; BEGIN add_str := ''; GOTORC(19,42); lowvideo; WRITE('Enter HEX number ->'); normvideo; READLN(str); WHILE str <> '' DO BEGIN VAL('$'+str,num,err); GOTORC(18,42); IF (err <> 0) OR (num < 20) OR (num > 255) THEN BEGIN WRITE('Invalid!'^G); CLREOL END ELSE BEGIN CLREOL; WRITE('adding char #',num); add_str := add_str + CHR(num) END; GOTORC(19,42); CLREOL; lowvideo; WRITE('Enter HEX number ->'); normvideo; READLN(str) END; {while something entered} GOTORC(18,42); CLREOL; GOTORC(19,42); CLREOL END; PROCEDURE find_rec; { (fchr : CHAR); } VAR rec_number : INTEGER; rec : BIT_RECORD; i,j,count : INTEGER; BEGIN rec_number := ORD(fchr) - 32; SEEK(font_file,rec_number); READ(font_file,rec); FOR i := 1 TO font_height DO FOR j := 1 TO font_width DO char_rec.pic[i,j] := ' '; {zero transfer record} char_rec.character := rec.character; char_rec.width := rec.width; char_rec.height := rec.height; FOR i := 1 TO Max_Height DO FOR j := 1 TO Bit_Width DO BEGIN count := rec.bit_map[i,j]; IF count >= 128 THEN BEGIN char_rec.pic[i,8*j] := 'X'; count := count - 128 END; IF count >= 64 THEN BEGIN char_rec.pic[i,8*j-1] := 'X'; count := count - 64 END; IF count >= 32 THEN BEGIN char_rec.pic[i,8*j-2] := 'X'; count := count - 32 END; IF count >= 16 THEN BEGIN char_rec.pic[i,8*j-3] := 'X'; count := count - 16 END; IF count >= 8 THEN BEGIN char_rec.pic[i,8*j-4] := 'X'; count := count - 8 END; IF count >= 4 THEN BEGIN char_rec.pic[i,8*j-5] := 'X'; count := count - 4 END; IF count >= 2 THEN BEGIN char_rec.pic[i,8*j-6] := 'X'; count := count - 2 END; IF count >= 1 THEN char_rec.pic[i,8*j-7] := 'X'; END {end for} END; PROCEDURE out_char; { (ochar : CHAR; VAR chr_pos : INTEGER) } VAR add,i,os_lcv,strikes : INTEGER; find_char : CHAR; BEGIN IF ochar <> ^D THEN BEGIN {add char to out_line} chr_pos := chr_pos + 1; out_line[chr_pos] := ochar END ELSE BEGIN {output out_line} IF block_type = bit THEN BEGIN CASE bit_cnt OF 0 : add := 1; 1 : add := 2; 2 : add := 4; 3 : add := 8; 4 : add := 16; 5 : add := 32; 6 : add := 64; END; {case} FOR i := 1 TO chr_pos DO IF out_line[i] <> ' ' THEN gout_line[i] := CHR(ORD(gout_line[i]) + add); IF bit_cnt < 6 THEN bit_cnt := bit_cnt + 1 ELSE BEGIN gdump; {dump the line} FOR i := 1 TO Max_Length DO gout_line[i] := CHR(0); bit_cnt := 0 {clear graphics line} END END ELSE BEGIN IF inv_video THEN BEGIN find_char := ' '; i := 1; WHILE (find_char = ' ') AND (i <= chr_pos) DO BEGIN IF out_line[i] <> ' ' THEN find_char := out_line[i]; i := i + 1 END; {while} IF find_char = ' ' THEN find_char := block_char; FOR i := 1 TO chr_pos DO IF out_line[i] = ' ' THEN out_line[i] := find_char ELSE out_line[i] := ' '; FOR i := (chr_pos + 1) TO (avail_chars - 1) DO out_line[i] := find_char; chr_pos := avail_chars - 1 END; {if inv-video} IF block_type = block THEN FOR i := 1 TO chr_pos DO IF out_line[i] <> ' ' THEN out_line[i] := block_char; IF block_type = overstrike THEN {multiple hits?} strikes := LENGTH(Os_Strng) ELSE strikes := 1; FOR os_lcv := 1 TO strikes DO BEGIN FOR i := 1 TO chr_pos DO IF (block_type = overstrike) AND (out_line[i] <> ' ') THEN putchr(Os_Strng[os_lcv]) ELSE putchr(out_line[i]); {for each char in out_line} putchr(^M) END; {for overstrikes} putchr(^J) END; {if eol} chr_pos := 0 END {if block_type = bit} END; {procedure out_char} PROCEDURE putchr; {chr:CHAR} BEGIN CASE output_device OF printer : WRITE(lst,chr); recd_file : WRITE(out_file,chr); screen : WRITE(con,chr) END {case} END; {subprocedure putchr} PROCEDURE gdump; VAR i : INTEGER; BEGIN putchr(^C); {into graphics} FOR i := 1 TO Max_Length DO BEGIN IF gout_line[i] = ^C THEN putchr(^C); {double all ^C's} putchr(gout_line[i]) END; putchr(^C); putchr(^B); {out of graphics} putchr(^N); {cr and graphics lf} END; PROCEDURE set_up_prt; { (reset_prt : BOOLEAN) } BEGIN IF NOT dumb_prt THEN BEGIN WRITE(lst,CHR(27),'R2$'); {Draft quality print} IF reset_prt THEN BEGIN WRITE(lst,CHR(30)); {12 cpi} WRITE(lst,CHR(27),'B8$'); {6 lpi} WRITE(lst,CHR(27),'Q4$') {Black} END ELSE BEGIN CASE prt_lpi OF six : WRITE(lst,CHR(27),'B8$'); eight : WRITE(lst,CHR(27),'B6$'); twelve : WRITE(lst,CHR(27),'B4$'); ten : WRITE(lst,CHR(27),'B5$') END; {case} CASE prt_cpi OF pica : WRITE(lst,CHR(29)); squeezed : WRITE(lst,CHR(31)); elite : WRITE(lst,CHR(30)); tiny : WRITE(lst,CHR(30)) {20 cpi n/a on Prism, use 16.7} END; {case} CASE prt_color OF black : WRITE(lst,CHR(27),'Q4$'); blue : WRITE(lst,CHR(27),'Q3$'); green : WRITE(lst,CHR(27),'Q2$'); red : WRITE(lst,CHR(27),'Q1$'); END {case} END; WRITE(lst,CHR(13)) {and a final to return head} END END; PROCEDURE avail_space; LABEL skip; VAR pitch : REAL; BEGIN IF NOT disp THEN GOTO skip; {return w/o doing anything} IF given_width = 0 THEN BEGIN IF output_device = printer THEN BEGIN CASE prt_cpi OF pica : pitch := 10; elite : pitch := 12; squeezed : pitch := 16.5; {use 17 for Epson} tiny : pitch := 20; {n/a on IDS printer} END; {case} IF device_size = wide THEN avail_chars := TRUNC(pitch * 14) ELSE avail_chars := TRUNC(pitch * 8) END ELSE {output_device = screen or recd_file} IF device_size = wide THEN avail_chars := 132 ELSE avail_chars := 80; {end if} END ELSE {width WAS given} avail_chars := given_width; {end if width was not given} GOTORC(16,1); lowvideo; WRITE('Calculated width available -> '); normvideo; WRITE(avail_chars,' '); IF font_height <> 0 THEN BEGIN GOTORC(17,1); CLREOL; lowvideo; IF sign_type = sign THEN BEGIN {est based on 8+1 spaces/char} WRITE('Approx # of *input* chars allowed -> '); normvideo; WRITE((ROUND(avail_chars/(mult_w*(font_width+inter_spc-2)))):1,' ') END ELSE BEGIN WRITE('Output line must be at least -> '); normvideo; WRITE((font_height * mult_h) + given_offset); IF ((font_height * mult_h) + given_offset) > avail_chars THEN WRITE('<- Error: Output overflow!'^G) {if overflow} END {if sign output approx max input line} END; skip: END;