home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Shareware - Software Farm 2
/
wosw_2.zip
/
wosw_2
/
PRINTING
/
ISIGNS50.ZIP
/
SIGNS.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1989-10-02
|
30KB
|
623 lines
{$N-} {80287 not present}
{$R+} {Range checking on}
{$S+} {Stack checking on}
{$I+} {I/O checking on}
PROGRAM Signs;
{******************************************************************************
**
** Robert W. Bloom
**
** Function: This program reads input from the terminal and creates signs
** (horizontal) or banners (vertical) in a number of formats. Output
** character fonts are read from a HP LaserJet-compatible 'soft' font file.
**
** Notes: Font files must be indexed with FontIndx.Pas before use.
** See Signs.DOC for more information
**
******************************************************************************}
Uses
Crt, {Unit found in TURBO.TPL}
Printer2; {special unit}
{$i const}
VAR
font_file : FILE OF CHAR; {the soft font file}
font_ndx_file : FILE OF CHAR_INDEX_RECORD; {index to above}
ndx_array : ARRAY [0..255] OF CHAR_INDEX_RECORD;
in_file,out_file : TEXT; {files for input and output}
avail_width : INTEGER; {width of output device}
out_line : OUT_LINE_REC; {to build output lines}
gout_1,gout_2 : OUT_GRAPHIC_REC; {output graphics lines}
gout_len : INTEGER; {to build output graphic lines}
ptr_maps : POINTER; {pointer to character maps}
map_size : INTEGER; {size of the maps}
space_needed : INTEGER; {approx width of output?}
page_offset : INTEGER; {actual indent}
bit_cnt : INTEGER; {counter for graphics output}
{************************* Procedures called *********************************}
PROCEDURE main; FORWARD;
PROCEDURE out_sign (VAR inp_line : S255); FORWARD;
PROCEDURE out_banner (VAR inp_line : S255); FORWARD;
PROCEDURE parm_menu; FORWARD;
{PROCEDURE disp_?}
PROCEDURE ask_parm; FORWARD;
{PROCEDURE ask_?}
PROCEDURE input_menu; FORWARD;
{utilities:}
PROCEDURE gotorc(R,C : INTEGER); FORWARD;
PROCEDURE sak; FORWARD;
PROCEDURE alt_inp(VAR alt_str : S14); FORWARD;
PROCEDURE putchr (chrs : S14); FORWARD;
PROCEDURE disp_fs; FORWARD;
PROCEDURE init_ff (VAR ff,ffi : S14;VAR ok : BOOLEAN); FORWARD;
PROCEDURE set_up_maps (VAR inp_line : S255); FORWARD;
PROCEDURE reset_maps (VAR ptr : POINTER); FORWARD;
{printer stuff:}
PROCEDURE avail_space; FORWARD;
PROCEDURE set_up_prt (reset_prt : BOOLEAN); FORWARD;
PROCEDURE out_char (ochar,ichar,action : CHAR); FORWARD;
PROCEDURE out_nline; FORWARD;
PROCEDURE add_gline; FORWARD;
PROCEDURE out_gl_ids; FORWARD;
PROCEDURE out_gl_hp; FORWARD;
PROCEDURE out_gl_ep; FORWARD;
{**************************** Program Start **********************************}
PROCEDURE main;
LABEL finis,restrt;
VAR ans2,ans : CHAR; {entered char}
text_input : S255; {to build line into}
alt_inp_strng : S14; {return from alt-char builder}
done : BOOLEAN; {flag}
i : INTEGER; {loop control}
output_err : BOOLEAN; {if can't output correctly}
BEGIN
done := FALSE;
text_input := '';
space_needed := 0;
parm_menu;
ask_parm;
input_menu;
WHILE NOT done DO BEGIN
restrt:
ans := READKEY;
CLREOL;
CASE ans OF
^P : BEGIN {change parameters}
ask_parm;
GOTORC(17,41); CLREOL;
input_menu;
IF sign_type = sign THEN BEGIN {recalc cause font may}
space_needed := given_offset; {have been changed}
FOR i := 1 TO LENGTH(text_input) DO
space_needed := space_needed +
(ndx_array[ORD(text_input[i])].delta_x * mult_w)
END ELSE
space_needed := (font_height * mult_h) + given_offset;
{end}
GOTORC(17,25); CLREOL; highvideo; WRITE(space_needed);
GOTORC(19,25); CLREOL; highvideo; WRITE(text_input)
END;
^D,^C : done := TRUE; {done program}
^A : BEGIN
alt_inp(alt_inp_strng);
text_input := text_input + alt_inp_strng;
GOTORC(19,25); CLREOL; highvideo; WRITE(text_input)
END;
^L,^F : BEGIN {formfeed to printer}
GOTORC(24,1);
IF output_device = printr THEN BEGIN
WRITE(lst,^L);
WRITE('Formfeed sent to printer.')
END ELSE
WRITE('Output is not directed to printer!'^G);
{end}
sak;
GOTORC(24,1); CLREOL;
GOTORC(19,25); CLREOL; highvideo; WRITE(text_input)
END;
^R,^T : BEGIN {move back to TOF (reverse formfeed)}
GOTORC(24,1);
IF output_device = printr THEN BEGIN
WRITE('Moving print-head back to TOF.');
CASE prt_type OF
ids : WRITE(lst,CHR(27),'G0$',CHR(27),'H0$');
epson : {not available?} ;
hp : WRITE(lst,CHR(27),'&a0c0R')
END {case}
END ELSE
WRITE('Output is not directed to printer!'^G);
{end}
sak;
GOTORC(24,1); CLREOL;
GOTORC(19,25); CLREOL; highvideo; WRITE(text_input)
END;
^H,#127 : BEGIN {backspace once}
IF LENGTH(text_input) > 0 THEN BEGIN
ans2 := text_input[LENGTH(text_input)];
DELETE(text_input,LENGTH(text_input),1);
IF sign_type = sign THEN space_needed :=
space_needed - (ndx_array[ORD(ans2)].delta_x * mult_w);
GOTORC(17,25); CLREOL; highvideo; WRITE(space_needed);
GOTORC(19,25); CLREOL; highvideo; WRITE(text_input)
END
END;
^X : BEGIN {cancel line, start over}
text_input := '';
IF sign_type = sign THEN
space_needed := given_offset
ELSE
space_needed := (font_height * mult_h) + given_offset;
{end}
GOTORC(17,25); CLREOL; highvideo; WRITE(space_needed);
GOTORC(19,25); CLREOL; highvideo
END;
^M : BEGIN {go ahead, process input line}
output_err := FALSE;
IF (LENGTH(text_input) = 0) AND
(input_device <> text_file) THEN BEGIN
GOTORC(24,1); CLREOL;
WRITE('Do you want to quit? (Y/N) -> '^G);
ans2 := READKEY;
GOTORC(24,1); CLREOL;
IF ans2 IN ['y','Y'] THEN
GOTO finis
ELSE BEGIN
GOTORC(19,25); CLREOL;
highvideo; WRITE(text_input);
GOTO restrt
END
END;
GOTORC(1,65); WRITE('Processing');
IF output_device = printr THEN set_up_prt(FALSE);
IF input_device = text_file THEN BEGIN
FOR i := 1 TO num_copies DO BEGIN
WHILE NOT EOF(in_file) DO BEGIN
READLN(in_file,text_input);
IF output_device <> screen THEN BEGIN
GOTORC(19,4); CLREOL; lowvideo;
WRITE('Reading from file -> ');
highvideo; WRITE(text_input)
END;
IF sign_type = sign THEN BEGIN
space_needed := given_offset;
FOR i := 1 TO LENGTH(text_input) DO
space_needed := space_needed +
(ndx_array[ORD(text_input[i])].delta_x * mult_w);
{end}
out_sign(text_input)
END ELSE
out_banner(text_input);
{end if sign}
END; {while not eof}
IF output_device = printr THEN WRITE(lst,^L);
RESET(in_file)
END {for each copy wanted}
END ELSE
IF sign_type = sign THEN
out_sign(text_input)
ELSE
out_banner(text_input);
{end if sign}
{end if input from file}
IF (output_device=screen) THEN BEGIN
sak;
parm_menu
END;
text_input := '';
IF sign_type = sign THEN
space_needed := given_offset
ELSE
space_needed := (font_height * mult_h) + given_offset;
{end}
GOTORC(17,25); CLREOL; highvideo; WRITE(space_needed);
input_menu
END {process line}
ELSE BEGIN {otherwise put entry into input line}
text_input := text_input + ans;
IF sign_type = sign THEN space_needed :=
space_needed + (ndx_array[ORD(ans)].delta_x * mult_w);
GOTORC(17,25); CLREOL; highvideo; WRITE(space_needed);
GOTORC(19,25); WRITE(text_input)
END
END {case}
END; {while not done}
finis: {all done, close appropriate files}
IF output_device = printr THEN set_up_prt(TRUE);
IF output_device = recd_file THEN CLOSE(out_file);
IF input_device = text_file THEN CLOSE(in_file);
CLOSE(font_file)
END; {PROCEDURE main}
PROCEDURE out_banner; {(VAR inp_line : S255)}
VAR chr_num,chr_pos,width_lcv,height_lcv,added,end_line_pos,top_os,bott_os,
mult_w_lcv,mult_h_lcv,out_cnt,out_cnto : INTEGER;
i,j : INTEGER; {for small for loops}
ptr8 : PTR_CHAR_MAP_8;
ptr12 : PTR_CHAR_MAP_12;
ptr18 : PTR_CHAR_MAP_18;
ptr24 : PTR_CHAR_MAP_24;
ptr30 : PTR_CHAR_MAP_30;
chr_byte,chr_bit,test_byte,test_bit : BYTE;
BEGIN
set_up_maps(inp_line);
bit_cnt := 0; {reset for graphic bits}
IF (output_device <> screen) OR (input_device = keyboard) THEN BEGIN
GOTORC(1,65); WRITE('Outputting ')
END;
GOTORC(25,1);
IF output_device <> screen THEN BEGIN
lowvideo; WRITE('Now outputting character -> '); highvideo
END;
CASE map_size OF
8 : ptr8 := ptr_maps;
12 : ptr12 := ptr_maps;
18 : ptr18 := ptr_maps;
24 : ptr24 := ptr_maps;
30 : ptr30 := ptr_maps
END; {case}
out_char(' ',' ','S'); {start w/blank line}
out_char(' ',' ','E'); {and output it}
IF inv_video THEN BEGIN {if inv_video, add one 'blank' line}
FOR i := 1 TO ((2+font_height) * mult_h) DO
out_char(' ',block_char,'A');
out_char(' ',' ','E'); {and output it}
out_char(' ',' ','C') {and clear it}
END;
out_cnt := 0;
FOR chr_pos := 1 TO LENGTH(inp_line) DO BEGIN
chr_num := ORD(inp_line[chr_pos]);
IF output_device <> screen THEN WRITE(CHR(chr_num));
out_cnto := out_cnt; {where char started for delta_x}
FOR j := 1 TO (ndx_array[chr_num].left_offset * mult_w) DO BEGIN
IF inv_video THEN {if inv_video, add a starting block}
FOR i := 1 TO mult_h DO out_char(' ',block_char,'A');
FOR i := 1 TO (font_height * mult_h) DO
out_char(' ',CHR(chr_num),'A');
IF inv_video THEN {if inv_video, add a ending block}
FOR i := 1 TO mult_h DO out_char(' ',block_char,'A');
out_char(' ',' ','E'); {add (blank) lines for left_offset}
out_char(' ',' ','C'); {clear output line}
out_cnt := out_cnt + 1 {keep track of it}
END;
FOR width_lcv := 1 TO ndx_array[chr_num].width DO BEGIN
IF inv_video THEN {if inv_video, add a starting block}
FOR i := 1 TO mult_h DO out_char(' ',block_char,'A');
bott_os := ((font_height - ndx_array[0].top_offset) -
(ndx_array[chr_num].height - ndx_array[chr_num].top_offset)) * mult_h;
FOR i := 1 TO bott_os DO out_char(' ',CHR(chr_num),'A');
FOR height_lcv := ndx_array[chr_num].height DOWNTO 1 DO BEGIN
chr_byte := TRUNC(0.99+width_lcv/8);
CASE map_size OF
8 : test_byte := ptr8^.map[height_lcv,chr_byte];
12 : test_byte := ptr12^.map[height_lcv,chr_byte];
18 : test_byte := ptr18^.map[height_lcv,chr_byte];
24 : test_byte := ptr24^.map[height_lcv,chr_byte];
30 : test_byte := ptr30^.map[height_lcv,chr_byte]
END; {case}
chr_bit := width_lcv MOD 8;
CASE chr_bit OF
1 : test_bit := test_byte AND 128;
2 : test_bit := test_byte AND 64;
3 : test_bit := test_byte AND 32;
4 : test_bit := test_byte AND 16;
5 : test_bit := test_byte AND 8;
6 : test_bit := test_byte AND 4;
7 : test_bit := test_byte AND 2;
0 : test_bit := test_byte AND 1
END; {case}
FOR mult_h_lcv := 1 TO mult_h DO
IF (test_bit = 0) THEN
out_char(' ',CHR(chr_num),'A')
ELSE
out_char(CHR(chr_num),' ','A')
{end}
{for height multiplier}
END; {for height of char}
top_os := font_height - ndx_array[chr_num].height - bott_os;
FOR i := 1 TO top_os * mult_h DO
out_char(' ',CHR(chr_num),'A'); {fill out char}
IF inv_video THEN {if inv_video, add a ending block}
FOR i := 1 TO mult_h DO out_char(' ',block_char,'A');
FOR mult_w_lcv := 1 TO mult_w DO
out_char(' ',' ','E'); {finished building line - output 'em}
{end for mult_w_lcv}
out_cnt := out_cnt + mult_w; {count output lines}
out_char(' ',' ','C') {clear output line}
END; {across width of char}
end_line_pos := out_cnto + (ndx_array[chr_num].delta_x * mult_w);
{calculate end of char}
IF (chr_pos < LENGTH(inp_line)) AND
(ndx_array[ORD(inp_line[chr_pos+1])].left_offset < 0) THEN
end_line_pos := end_line_pos +
(ndx_array[ORD(inp_line[chr_pos+1])].left_offset * mult_w);
{back up if leff_offset < 0 and not eol of inp_line}
added := end_line_pos - out_cnt; {how much to add}
FOR j := 1 TO added DO BEGIN
FOR i := 1 TO (font_height * mult_h) DO
out_char(' ',block_char,'A');
IF inv_video THEN {if inv_video, the border chars}
FOR i := 1 TO 2*mult_h DO out_char(' ',block_char,'A');
out_char(' ',' ','E'); {add (blank) lines for delta_x}
out_char(' ',' ','C'); {clear output line}
out_cnt := out_cnt + 1
END;
CASE map_size OF {point to next char map}
8 : ptr8 := ptr8^.next;
12 : ptr12 := ptr12^.next;
18 : ptr18 := ptr18^.next;
24 : ptr24 := ptr24^.next;
30 : ptr30 := ptr30^.next
END {case}
END; {for each character}
IF inv_video THEN BEGIN {if inv_video, add one 'blank' line}
FOR i := 1 TO ((2+font_height) * mult_h) DO
out_char(' ',block_char,'A');
out_char(' ',' ','E'); {and output it}
out_char(' ',' ','C') {and clear it}
END;
out_char(' ',' ','D'); {end w/blank line}
reset_maps(ptr_maps) {dispose of maps}
END; {PROCEDURE out_banner}
PROCEDURE out_sign; {(VAR inp_line : S255)}
VAR chr_num,chr_pos,width_lcv,height_lcv,added,end_char_pos,
mult_w_lcv,mult_h_lcv,out_cnto : INTEGER;
act_dot_pos : INTEGER; {position within char map}
i,j : INTEGER; {for small for loops}
left_os : INTEGER; {dist from left edge of max cell size to edge of char}
ptr8 : PTR_CHAR_MAP_8;
ptr12 : PTR_CHAR_MAP_12;
ptr18 : PTR_CHAR_MAP_18;
ptr24 : PTR_CHAR_MAP_24;
ptr30 : PTR_CHAR_MAP_30;
chr_byte,chr_bit,test_byte,test_bit : BYTE;
BEGIN
set_up_maps(inp_line);
bit_cnt := 0; {reset for graphic bits}
IF (output_device <> screen) OR (input_device = keyboard) THEN BEGIN
GOTORC(1,65); WRITE('Outputting ')
END;
GOTORC(25,1);
out_char(' ',' ','S'); {start w/blank line}
out_char(' ',' ','E'); {and output it}
IF inv_video THEN BEGIN {if inv_video, start with a solid line}
FOR i := 1 TO space_needed + mult_w - given_offset DO {space_needed is only an}
out_char(' ',block_char,'A'); {approx line length!}
out_char(' ',' ','E'); {and output it}
out_char(' ',' ','C') {and clear it}
END;
FOR height_lcv := 1 TO font_height DO BEGIN
IF output_device <> screen THEN WRITE('Outputting line ',height_lcv:3,chr(13));
IF inv_video THEN {if inv_video, add a starting block}
FOR i := 1 TO mult_w DO out_char(' ',block_char,'A');
CASE map_size OF
8 : ptr8 := ptr_maps;
12 : ptr12 := ptr_maps;
18 : ptr18 := ptr_maps;
24 : ptr24 := ptr_maps;
30 : ptr30 := ptr_maps
END; {case}
FOR chr_pos := 1 TO LENGTH(inp_line) DO BEGIN
chr_num := ORD(inp_line[chr_pos]);
out_cnto := out_line.len; {where char started for delta_x}
IF (ndx_array[chr_num].left_offset < 0) AND {back-up cursor if ok}
(out_line.len > -1 * ndx_array[chr_num].left_offset * mult_w) THEN
out_line.len := out_line.len + (ndx_array[chr_num].left_offset * mult_w)
ELSE
FOR i := 1 TO (ndx_array[chr_num].left_offset * mult_w) DO
out_char(' ',CHR(chr_num),'A'); {left offset}
{end - add or subtract to out_line for left offset}
act_dot_pos := height_lcv - (ndx_array[0].top_offset -
ndx_array[chr_num].top_offset); {baseline minus char top offset}
FOR width_lcv := 1 TO ndx_array[chr_num].width DO BEGIN
IF (act_dot_pos <= 0) OR (act_dot_pos > ndx_array[chr_num].height) THEN
FOR i := 1 TO mult_w DO
out_char(' ',CHR(chr_num),'A') {space above char}
ELSE BEGIN
chr_byte := TRUNC(0.99+width_lcv/8);
CASE map_size OF
8 : test_byte := ptr8^.map[act_dot_pos,chr_byte];
12 : test_byte := ptr12^.map[act_dot_pos,chr_byte];
18 : test_byte := ptr18^.map[act_dot_pos,chr_byte];
24 : test_byte := ptr24^.map[act_dot_pos,chr_byte];
30 : test_byte := ptr30^.map[act_dot_pos,chr_byte]
END; {case}
chr_bit := width_lcv MOD 8;
CASE chr_bit OF
1 : test_bit := test_byte AND 128;
2 : test_bit := test_byte AND 64;
3 : test_bit := test_byte AND 32;
4 : test_bit := test_byte AND 16;
5 : test_bit := test_byte AND 8;
6 : test_bit := test_byte AND 4;
7 : test_bit := test_byte AND 2;
0 : test_bit := test_byte AND 1
END; {case}
FOR mult_w_lcv := 1 TO mult_w DO
IF test_bit = 0 THEN
out_char(' ',CHR(chr_num),'A')
ELSE
out_char(CHR(chr_num),' ','A')
{end}
{end for height multiplier}
END
END; {for width of each character}
end_char_pos := out_cnto + (ndx_array[chr_num].delta_x * mult_w);
IF (end_char_pos < out_line.len) AND (chr_pos < LENGTH(inp_line)) THEN
out_line.len := end_char_pos
ELSE BEGIN
added := end_char_pos - out_line.len;
FOR i := 1 TO added DO
out_char(' ',block_char,'A');
END; {subtract or add spaces for delta_x - but not on last char}
CASE map_size OF {point to next char map}
8 : ptr8 := ptr8^.next;
12 : ptr12 := ptr12^.next;
18 : ptr18 := ptr18^.next;
24 : ptr24 := ptr24^.next;
30 : ptr30 := ptr30^.next
END {case}
END; {for each character}
IF inv_video AND ((out_line.chr[out_line.len] <> ' ') OR
(out_line.ichr[out_line.len] <> block_char)) THEN
FOR i := 1 TO mult_w DO out_char(' ',block_char,'A');
{if inv_video and delta_x did not add a space, add a ending block}
FOR mult_h_lcv := 1 TO mult_h DO
out_char(' ',' ','E'); {output line(s) }
out_char(' ',' ','C') {clear output line}
END; {for height of characters}
IF inv_video THEN BEGIN {if inv_video, end with a solid line}
FOR i := 1 TO space_needed + mult_w - given_offset DO {space_needed is only an}
out_char(' ',block_char,'A'); {approx line length!}
out_char(' ',' ','E'); {and output it}
out_char(' ',' ','C') {and clear it}
END;
out_char(' ',' ','D'); {end w/blank line}
reset_maps(ptr_maps) {dispose of maps}
END; {PROCEDURE out_sign}
{$i disp} {display parameters}
{$i ask} {ask for parameters}
{$i prt} {printer specific routines}
PROCEDURE parm_menu; {font_f_open : BOOLEAN}
BEGIN
CLRSCR; highvideo;
WRITE('Signs'); lowvideo; WRITE(' Version: ',Date);
GOTORC(1,59); WRITE('Mode:');
GOTORC(3,1);
WRITE('------------------------- ');
highvideo; WRITE('Options and I/O Parameters');
lowvideo; WRITE(' --------------------------');
disp_t; disp_b; disp_f; disp_w; disp_h; disp_v;
disp_a; disp_m; disp_g; disp_q; disp_x; disp_i;
disp_r; disp_n; disp_o; disp_s; disp_y; disp_p;
disp_l; disp_c; disp_d; disp_e; disp_fs;
GOTORC(15,1); lowvideo;
WRITE('-------------------------------------------------------------------------------');
avail_space;
GOTORC(17,41); highvideo;
TextAttr := TextAttr + Blink;
WRITE('Enter option letter');
TextAttr := TextAttr - Blink;
GOTORC(18,1); lowvideo;
WRITE('-------------------------------------------------------------------------------');
END; {Procedure parm_menu}
PROCEDURE ask_parm; { (VAR font_f_open : BOOLEAN) }
VAR ans : CHAR; {used for single char inut}
done,out_f_open : BOOLEAN; {flags}
old_ff,old_of : STRING[14]; {old filenames upon input or procedure}
BEGIN
GOTORC(1,65); highvideo; WRITE('Change Parms');
GOTORC(17,41); CLREOL; WRITE('Enter option letter');
GOTORC(20,1); CLREOL; GOTORC(21,1); CLREOL;
GOTORC(22,1); CLREOL; GOTORC(23,1); CLREOL;
disp_t; disp_b; disp_f; disp_w; disp_h; disp_v;
disp_a; disp_m; disp_g; disp_q; disp_x; disp_i;
disp_r; disp_n; disp_o; disp_s; disp_y; disp_p;
disp_l; disp_c; disp_d; disp_e; disp_fs;
IF output_device = recd_file THEN
out_f_open := TRUE
ELSE
out_f_open := FALSE;
old_of := out_fn;
old_ff := font_fn;
done := FALSE;
WHILE NOT done DO BEGIN
GOTORC(17,41); highvideo;
TextAttr := TextAttr + Blink;
WRITE('Enter option letter');
TextAttr := TextAttr - Blink;
ans := READKEY;
GOTORC(17,41); CLREOL;
GOTORC(20,1); lowvideo;
CASE ans OF
'T','t' : ask_t; {change sign type}
'B','b' : ask_b; {change block/letter type}
'F','f' : ask_f; {change font filename}
'W','w' : ask_w; {change width of output graphic characters}
'H','h' : ask_h; {change height of output graphic characters}
'V','v' : ask_v; {change inverse video on/off}
'A','a' : ask_a; {change auto-centering on/off}
'M','m' : ask_m; {enter a given left margin to use}
'G','g' : ask_g; {change the maximum width of output line in characters}
'Q','q' : ask_q; {abort exit}
^M,'x','X' : ask_x(done,ff_open,out_f_open,old_ff,old_of);
{check if done and if so, return to input}
'I','i' : ask_i; {change input device}
'R','r' : ask_r; {change read from input filename}
'N','n' : ask_n; {change number of copyies desired}
'O','o' : ask_o; {change output device}
'S','s' : ask_s; {change output device size}
'Y','y' : ask_y; {change printer type}
'P','p' : ask_p; {change printer characters/inch}
'L','l' : ask_l; {change printer lines/inch}
'C','c' : ask_c; {change printer color}
'D','d' : ask_d; {change printer graphic density}
'E','e' : ask_e {change output record filename}
ELSE BEGIN {not a menu option}
GOTORC(24,1); WRITE('Unrecognized code entered ->',ans,'<-'^G);
sak
END
END; {case}
GOTORC(20,1); CLREOL; GOTORC(21,1); CLREOL; GOTORC(22,1); CLREOL;
GOTORC(23,1); CLREOL; GOTORC(24,1); CLREOL;
GOTORC(17,41); lowvideo;
TextAttr := TextAttr + Blink;
WRITE('Enter option letter');
TextAttr := TextAttr - Blink
END; {while not done}
highvideo
END; {procedure ask_parm}
PROCEDURE input_menu;
BEGIN
GOTORC(1,65); highvideo; WRITE('Input Text ');
GOTORC( 4,1); WRITE(' '); 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,41); WRITE(' '); GOTORC( 5,41); WRITE(' '); GOTORC( 6,41); WRITE(' ');
GOTORC( 7,41); WRITE(' '); GOTORC( 8,41); WRITE(' '); GOTORC( 9,41); WRITE(' ');
GOTORC(10,41); WRITE(' '); GOTORC(11,41); WRITE(' '); GOTORC(12,41); WRITE(' ');
GOTORC(13,41); WRITE(' '); GOTORC(14,41); WRITE(' ');
GOTORC(17,1); CLREOL; lowvideo; WRITE(' Output width needed -> ');
highvideo; WRITE(space_needed);
GOTORC(19,1); CLREOL; WRITE(' Input Text -> ');
GOTORC(20,1); CLREOL;
GOTORC(21,1); CLREOL;
WRITE(' ^P'); lowvideo; WRITE(': Change parameters '); highvideo;
WRITE('^F,^L'); lowvideo; WRITE(': Send Formfeed to LST '); highvideo;
WRITE('^X'); lowvideo; WRITELN(': Restart Input'); highvideo;
WRITE('^C,^D'); lowvideo; WRITE(': Done, quit to OS '); highvideo;
WRITE('^R,^T'); lowvideo; WRITE(': Send Reverse Formfeed '); highvideo;
WRITE('^H'); lowvideo; WRITELN(': Backspace'); highvideo;
WRITE('<ret>'); lowvideo; WRITE(': Process Input '); highvideo;
WRITE(' ^A'); lowvideo; WRITE(': Alternate Input ');
GOTORC(25,1); CLREOL; GOTORC(19,25);
END;
{$i util}
BEGIN
main;
GOTORC(25,1); WRITE('<<< Signs completed >>>')
END.