home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 189.img / TCS120S.ZIP / FORUMTRM.PAS < prev    next >
Pascal/Delphi Source File  |  1989-02-25  |  19KB  |  817 lines

  1. {$R-,S-,I-,D-,F+,V-,B-,N-,L+,O+ }
  2. {$M 65500,0,0 }
  3.  
  4. unit forumtrm;
  5.  
  6. interface
  7.  
  8. uses crt,printer,
  9.      gentypes,modem,configrt,gensubs,subs1,subs2,windows,mainr2,protocol;
  10.  
  11. procedure forumterm;
  12.  
  13. implementation
  14.  
  15. procedure forumterm;
  16.  
  17. var dirloaded:boolean;
  18.  
  19.   type dialrec=record
  20.        bbsname:string[35];
  21.        phonenum:string[14];
  22.        baudrate:integer;
  23.        databits:integer;
  24.        stopbits:integer;
  25.        dummy:byte;
  26.        scriptfile:string[12]
  27.      end;
  28.  
  29.      prefixtype=(plus,minus,bang,atsign,poundsign);
  30.  
  31. var directory:array [1..200] of dialrec;
  32.     dfile:file of dialrec;
  33.     prefixes:array [prefixtype] of lstr;
  34.     funckeys:array [1..10] of lstr;
  35.  
  36.   procedure loaddirectory;
  37.   var cnt:integer;
  38.       d:dialrec;
  39.   begin
  40.     assign (dfile,'TCS.Fon');
  41.     reset (dfile);
  42.     if ioresult<>0 then begin
  43.       close (dfile);
  44.       cnt:=ioresult;
  45.       rewrite (dfile);
  46.       fillchar (d,sizeof(d),0);
  47.       d.baudrate:=defbaudrate;
  48.       d.databits:=8;
  49.       d.stopbits:=1;
  50.       for cnt:=1 to 200 do begin
  51.         write (dfile,d);
  52.         directory[cnt]:=d
  53.       end
  54.     end else for cnt:=1 to 200 do read (dfile,directory[cnt])
  55.   end;
  56.  
  57.   procedure savedirectory;
  58.   var cnt:integer;
  59.   begin
  60.     seek (dfile,0);
  61.     for cnt:=1 to 200 do write (dfile,directory[cnt])
  62.   end;
  63.  
  64.   procedure writedfile (n:integer);
  65.   begin
  66.     seek (dfile,n-1);
  67.     write (dfile,directory[n])
  68.   end;
  69.  
  70.   procedure loadfunckeys;
  71.   var kfile:text;
  72.       cnt:integer;
  73.   begin
  74.     for cnt:=1 to 10 do funckeys[cnt]:='';
  75.     assign (kfile,'TCS.Key');
  76.     reset (kfile);
  77.     if ioresult<>0 then exit;
  78.     cnt:=0;
  79.     while (not eof(kfile)) and (cnt<10) do begin
  80.       cnt:=cnt+1;
  81.       readln (kfile,funckeys[cnt])
  82.     end;
  83.     close (kfile)
  84.   end;
  85.  
  86.   procedure savefunckeys;
  87.   var kfile:text;
  88.       cnt:integer;
  89.   begin
  90.     assign (kfile,'TCS.Key');
  91.     rewrite (kfile);
  92.     for cnt:=1 to 10 do writeln (kfile,funckeys[cnt]);
  93.     close (kfile)
  94.   end;
  95.  
  96.   procedure loadprefixes;
  97.   var pfile:text;
  98.       cnt:integer;
  99.       p:prefixtype;
  100.       fnd:boolean;
  101.   begin
  102.     assign (pfile,'TCS.Pre');
  103.     reset (pfile);
  104.     fnd:=ioresult=0;
  105.     for p:=plus to poundsign do
  106.       if fnd
  107.         then readln (pfile,prefixes[p])
  108.         else prefixes[p]:='';
  109.     textclose (pfile);
  110.     cnt:=ioresult
  111.   end;
  112.  
  113.   procedure saveprefixes;
  114.   var pfile:text;
  115.       p:prefixtype;
  116.       cnt:integer;
  117.   begin
  118.     assign (pfile,'TCS.Pre');
  119.     rewrite (pfile);
  120.     for p:=plus to poundsign do
  121.       writeln (pfile,prefixes[p]);
  122.     textclose (pfile);
  123.     cnt:=ioresult
  124.   end;
  125.  
  126.   procedure superprint (q:lstr; attribute:integer);
  127.   var ss,loc:integer;
  128.   begin
  129.     textcolor (attribute and 15);
  130.     textbackground (attribute shr 4);
  131.     write (q);
  132. (*****
  133.     loc:=(wherey*80+wherex-81) shl 1;
  134.     ss:=screenseg;
  135.     inline (
  136. !{! ^179. New stack conventions require that many Inlines be rewritten.}
  137. $06/                     { PUSH   ES                }
  138. $1E/                     { PUSH   DS                }
  139. $8B/$86/ss/              { MOV    AX,ss[BP]         }
  140. $8E/$C0/                 { MOV    ES,AX             }
  141. $8C/$D0/                 { MOV    AX,SS             }
  142. $8E/$D8/                 { MOV    DS,AX             }
  143. $B8/q/                   { MOV    AX,q              }
  144. $01/$E8/                 { ADD    AX,BP             }
  145. $89/$C6/                 { MOV    SI,AX             }
  146. $8B/$86/loc/             { MOV    AX,loc[BP]        }
  147. $89/$C7/                 { MOV    DI,AX             }
  148. $FC/                     { CLD                      }
  149. $AC/                     { LODSB                    }
  150. $30/$E4/                 { XOR    AH,AH             }
  151. $89/$C1/                 { MOV    CX,AX             }
  152. $8B/$86/attribute/       { MOV    AX,attribute[BP]  }
  153. $88/$C4/                 { MOV    AH,AL             }
  154. $AC/                     { LODSB                    }
  155. $AB/                     { STOSW                    }
  156. $E2/$FC/                 { LOOP   <=back to LODSB=> }
  157. $1F/                     { POP    DS                }
  158. $07                      { POP    ES                }  )
  159.  
  160. ****)
  161.  
  162.   end;
  163.  
  164.  
  165.   procedure displayentry (n,y:integer);
  166.   var q:lstr;
  167.       d:^dialrec;
  168.  
  169.     procedure put (fragment:lstr; ps:integer);
  170.     begin
  171.       move (fragment[1],q[ps],length(fragment))
  172.     end;
  173.  
  174.   var t:mstr;
  175.   begin
  176.     fillchar (q[1],80,32);
  177.     q[0]:=#80;
  178.     if n=0 then put ('No number specified',6) else begin
  179.       d:=addr(directory[n]);
  180.       str (n:3,t);
  181.       put (t+'.',1);
  182.       put (d^.bbsname,6);
  183.       t:=d^.phonenum;
  184.       while length(t)<14 do t:=' '+t;
  185.       put (t,42);
  186.       t:=strr(d^.baudrate);
  187.       if d^.databits=8 then t:=t+',N,8,' else t:=t+',E,7,';
  188.       if d^.stopbits=1 then t:=t+'1' else t:=t+'2';
  189.       put (t,57)
  190.     end;
  191.     gotoxy (1,y);
  192.     superprint (q,normtopcolor)
  193.   end;
  194.  
  195.   procedure dialdirectory;
  196.   var page:integer;
  197.       done:boolean;
  198.  
  199.     procedure refreshnums;
  200.     var cnt,x,y:integer;
  201.     begin
  202.       x:=wherex;
  203.       y:=wherey;
  204.       for cnt:=1 to 10 do displayentry (cnt+page,cnt);
  205.       gotoxy (x,y)
  206.     end;
  207.  
  208.     procedure fullrefresh;
  209.     begin
  210.       refreshnums;
  211.       gotoxy (1,13);
  212.       write (usr,'Commands:  PgUp  PgDn  D)ial  R)evise  Q)uit  E)dit-prefixes');
  213.       clreol
  214.     end;
  215.  
  216.     procedure changepage (d:integer);
  217.     begin
  218.       page:=page+d;
  219.       if page<0 then page:=page+200;
  220.       if page>199 then page:=page-200;
  221.       refreshnums
  222.     end;
  223.  
  224.     function getnumber:mstr;
  225.     var q:mstr;
  226.         p:byte absolute q;
  227.         k:char;
  228.  
  229.       procedure addchar (k:char);
  230.       begin
  231.         if p=20 then exit;
  232.         write (usr,k);
  233.         q:=q+k
  234.       end;
  235.  
  236.       procedure delchar;
  237.       begin
  238.         if p=0 then exit;
  239.         write (usr,^H' '^H);
  240.         p:=p-1
  241.       end;
  242.  
  243.     begin
  244.       gotoxy (20,14);
  245.       write (usr,'Number? ');
  246.       clreol;
  247.       p:=0;
  248.       repeat
  249.         k:=bioskey;
  250.         case k of
  251.           #201:changepage (-10);
  252.           #209:changepage (10);
  253.           '0'..'9','+','-','!','@','#',',':addchar (k);
  254.           #8:delchar
  255.         end
  256.       until k=#13;
  257.       getnumber:=q
  258.     end;
  259.  
  260.     procedure dialdirectory;
  261.     var numstrs:array [1..10] of lstr;
  262.         ns:array [1..10] of integer;
  263.         num,cnt,n,p,pn:integer;
  264.         r:longint;
  265.         d:dialrec;
  266.         dstr:lstr;
  267.         inp,temp:mstr;
  268.         k:char;
  269.  
  270.       procedure addprefix (p:prefixtype);
  271.       begin
  272.         dstr:=dstr+prefixes[p]
  273.       end;
  274.  
  275.     begin
  276.       num:=0;
  277.       gotoxy (1,13);
  278.       write (usr,
  279.         'Please choose up to 10 numbers, separate with CR, blank to end.');
  280.       clreol;
  281.       repeat
  282.         inp:=getnumber+' ';
  283.         dstr:='';
  284.         temp:='';
  285.         n:=0;
  286.         for p:=1 to length(inp) do begin
  287.           k:=inp[p];
  288.           if k in ['0'..'9']
  289.             then temp:=temp+k
  290.             else
  291.               begin
  292.                 if temp<>'' then begin
  293.                   n:=valu(temp);
  294.                   if (n<1) or (n>200)
  295.                     then dstr:=dstr+temp
  296.                     else dstr:=dstr+directory[n].phonenum;
  297.                   temp:=''
  298.                 end;
  299.                 case k of
  300.                   '+':addprefix(plus);
  301.                   '-':addprefix(minus);
  302.                   '!':addprefix(bang);
  303.                   '@':addprefix(atsign);
  304.                   '#':addprefix(poundsign)
  305.                 end
  306.               end
  307.         end;
  308.         if dstr<>'' then begin
  309.           num:=num+1;
  310.           ns[num]:=n;
  311.           numstrs[num]:=dstr
  312.         end
  313.       until (num=10) or (dstr='');
  314.       if num=0 then begin
  315.         fullrefresh;
  316.         exit
  317.       end;
  318.       for cnt:=1 to num do displayentry (ns[cnt],cnt);
  319.       for cnt:=num+1 to 10 do begin
  320.         gotoxy (1,cnt);
  321.         clreol
  322.       end;
  323.       cnt:=0;
  324.       repeat
  325.         cnt:=cnt+1;
  326.         if cnt>num then cnt:=1;
  327.         n:=ns[cnt];
  328.         displayentry (n,13);
  329.         gotoxy (1,14);
  330.         write (usr,'Dialing: ');
  331.         clreol;
  332.         if n<>0 then begin
  333.           baudrate:=directory[n].baudrate;
  334.           parity:=directory[n].databits=7;
  335.           setparam (usecom,baudrate,parity)
  336.         end;
  337.         dstr:=numstrs[cnt];
  338.         write (usr,dstr);
  339.         bottom;
  340.         break:=false;
  341.         dialnumber (dstr);
  342.         r:=now+45;
  343.         while (now<r) and (not (keyhit or carrier)) do
  344.           if numchars>0
  345.             then writecon (getchar);
  346.         top;
  347.         done:=carrier;
  348.         if (keyhit or break) and not carrier then begin
  349.           gotoxy (1,14);
  350.           write (usr,'Aborted by operator!');
  351.           clreol;
  352.           sendchar (^M);
  353.           delay (1000);
  354.           sendchar (^M);
  355.           fullrefresh;
  356.           exit
  357.         end
  358.       until carrier
  359.     end;
  360.  
  361.     procedure getitem (prompt:mstr; var q; len:integer);
  362.     var a:anystr absolute q;
  363.         t:anystr;
  364.     begin
  365.       writeln (usr,^M'  Current ',prompt,' is: ',a);
  366.         write (usr,'Enter new ',prompt,'   : ');
  367.       buflen:=len;
  368.       readline (t);
  369.       if length(t)>0 then a:=t
  370.     end;
  371.  
  372.     procedure reviseentry;
  373.  
  374.       procedure getinteger (prompt:mstr; var n:integer; r1,r2:integer);
  375.       var q:sstr;
  376.       begin
  377.         str (n,q);
  378.         repeat
  379.           getitem (prompt,q,4);
  380.           n:=valu (q);
  381.           if (n>=r1) and (n<=r2) then exit;
  382.           writeln (usr,'  Sorry!  Range is ',r1,' to ',r2,'!')
  383.         until 0=1
  384.       end;
  385.  
  386.     var n:integer;
  387.         q:^dialrec;
  388.     begin
  389.       n:=valu(getnumber);
  390.       if (n<1) or (n>200) then exit;
  391.       q:=addr(directory[n]);
  392.       clrscr;
  393.       getitem ('BBS name',q^.bbsname,35);
  394.       getitem ('phone number',q^.phonenum,14);
  395.       getinteger ('baud rate',q^.baudrate,50,9600);
  396.       getinteger ('data bits',q^.databits,7,8);
  397.       writedfile (n);
  398.       fullrefresh
  399.     end;
  400.  
  401.     procedure editprefixes;
  402.  
  403.       procedure getprefix (p:prefixtype);
  404.       begin
  405.         gotoxy (1,13);
  406.         getitem ('prefix',prefixes[p],80)
  407.       end;
  408.  
  409.     var k:char;
  410.     begin
  411.       repeat
  412.         clrscr;
  413.         writeln (usr,'Prefixes are: '^J);
  414.         writeln (usr,'  + ',prefixes[plus]);
  415.         writeln (usr,'  - ',prefixes[minus]);
  416.         writeln (usr,'  ! ',prefixes[bang]);
  417.         writeln (usr,'  @ ',prefixes[atsign]);
  418.         writeln (usr,'  # ',prefixes[poundsign],^J^J);
  419.         write (usr,'Hit prefix to change, CR when done: ');
  420.         k:=bioskey;
  421.         case k of
  422.           '+':getprefix (plus);
  423.           '-':getprefix (minus);
  424.           '!':getprefix (bang);
  425.           '@':getprefix (atsign);
  426.           '#':getprefix (poundsign)
  427.         end
  428.       until (k=#27) or (k=#13);
  429.       saveprefixes;
  430.       fullrefresh
  431.     end;
  432.  
  433.   var k:char;
  434.   begin
  435.     splitscreen (16);
  436.     top;
  437.     if not dirloaded then begin
  438.       writeln (usr,'Loading directory...');
  439.       dirloaded:=true;
  440.       loaddirectory;
  441.       loadprefixes
  442.     end;
  443.     page:=0;
  444.     fullrefresh;
  445.     done:=false;
  446.     repeat
  447.       gotoxy (1,14);
  448.       write (usr,'Your choice: ');
  449.       clreol;
  450.       k:=upcase(bioskey);
  451.       case k of
  452.         '9',#201:changepage (-10);
  453.         '3',#209:changepage (10);
  454.         'D':dialdirectory;
  455.         'R':reviseentry;
  456.         'E':editprefixes;
  457.         'Q':done:=true
  458.       end
  459.     until done;
  460.     unsplit
  461.   end;
  462.  
  463. var done,echoback,localecho,addlf,printerecho:boolean;
  464.  
  465.   procedure splitit;
  466.   begin
  467.     splitscreen (5);
  468.     top;
  469.     gotoxy (1,1)
  470.   end;
  471.  
  472.   procedure askquestion (prompt:lstr);
  473.   begin
  474.     splitit;
  475.     write (usr,prompt);
  476.     readline (input);
  477.     unsplit
  478.   end;
  479.  
  480.   function getyn (prompt:mstr):boolean;
  481.   begin
  482.     askquestion (prompt+':  Are you sure? ');
  483.     getyn:=yes
  484.   end;
  485.  
  486.   procedure ansireset;
  487.   begin
  488.     writecon (#27);
  489.     writecon ('[');
  490.     writecon ('0');
  491.     writecon ('m')
  492.   end;
  493.  
  494.   procedure help;
  495.   begin
  496.     if splitmode then begin
  497.       unsplit;
  498.       exit
  499.     end;
  500.     splitscreen (10);
  501.     top;
  502.     writeln (usr,'Alt-X: Exit');
  503.     writeln (usr,'Alt-I: Initialize ANSI');
  504.     writeln (usr,'Alt-H: Hang up');
  505.     writeln (usr,'Alt-Q: Goto DOS');
  506.     writeln (usr,'Alt-D: Dialing directory');
  507.     writeln (usr);
  508.     writeln (usr,'Alt-T: Transmit file');
  509.     writeln (usr,'Alr-R: Receive file');
  510.     window (40,1,80,10);
  511.     inuse:=-1;
  512.     gotoxy (1,1);
  513.     writeln (usr,'Alt-E: Toggle echo');
  514.     writeln (usr,'Alt-L: Toggle line feeds');
  515.     writeln (usr,'Alt-B: Set baud rate');
  516.     writeln (usr,'Alt-P: Set parity');
  517.     writeln (usr,'Alt-F: Function keys');
  518.     bottom
  519.   end;
  520.  
  521.   procedure editfunckeys;
  522.   var q:lstr;
  523.       n,cnt:integer;
  524.   begin
  525.     splitscreen (15);
  526.     top;
  527.     repeat
  528.       for cnt:=1 to 10 do begin
  529.         gotoxy (1,cnt);
  530.         write (usr,'F',cnt,':');
  531.         gotoxy (6,cnt);
  532.         write (usr,funckeys[cnt]);
  533.         clreol
  534.       end;
  535.       gotoxy (1,12);
  536.       write (usr,'Enter number to edit, CR when done: ');
  537.       clreol;
  538.       buflen:=2;
  539.       readline (q);
  540.       if length(q)=0 then begin
  541.         savefunckeys;
  542.         unsplit;
  543.         exit
  544.       end;
  545.       n:=valu(q);
  546.       if (n>0) and (n<11) then begin
  547.         gotoxy (1,12);
  548.         write (usr,'Enter new setting:');
  549.         clreol;
  550.         write (usr,^M^J'-> ');
  551.         buflen:=70;
  552.         readline (q);
  553.         if length(q)<>0 then funckeys[n]:=q
  554.       end
  555.     until 0=1
  556.   end;
  557.  
  558.   procedure setbaud;
  559.   var bd:integer;
  560.   begin
  561.     askquestion ('Enter baud rate: ');
  562.     bd:=valu(input);
  563.     if (bd>=110) and (bd<=9600) then begin
  564.       baudrate:=bd;
  565.       setparam (usecom,baudrate,parity)
  566.     end
  567.   end;
  568.  
  569.   procedure setparity;
  570.   var k:char;
  571.   begin
  572.     askquestion ('Parity E)ven or N)one: ');
  573.     if length(input)=0 then exit;
  574.     k:=upcase(input[1]);
  575.     if k='E' then parity:=true else if k='N' then parity:=false;
  576.     setparam (usecom,baudrate,parity)
  577.   end;
  578.  
  579.   procedure upload;
  580.   var fn:lstr;
  581.       f:file;
  582.       k:char;
  583.       b:integer;
  584.   begin
  585.     splitit;
  586.     write (usr,'Filename to upload: ');
  587.     readline (fn);
  588.     if length(fn)=0 then begin
  589.       unsplit;
  590.       exit
  591.     end;
  592.     assign (f,fn);
  593.     reset (f);
  594.     if ioresult<>0 then begin
  595.       writeln (usr,'File not found!  Hit a key..');
  596.       k:=bioskey;
  597.       unsplit;
  598.       exit
  599.     end;
  600.     close (f);
  601.     write (usr,'Protocol (X=Xmodem, Y=Ymodem): ');
  602.     k:=upcase(bioskey);
  603.     unsplit;
  604.     b:=protocolxfer (true,true,k='Y',fn)
  605.   end;
  606.  
  607.   procedure download;
  608.   var fn:lstr;
  609.       f:file;
  610.       k:char;
  611.       b,ymodem:boolean;
  612.       q:sstr;
  613.       ret:integer;
  614.   begin
  615.     splitit;
  616.     write (usr,'Filename to download: ');
  617.     readline (fn);
  618.     if length(fn)=0 then begin
  619.       unsplit;
  620.       exit
  621.     end;
  622.     assign (f,fn);
  623.     reset (f);
  624.     if ioresult=0 then begin
  625.       close (f);
  626.       write (usr,'Overwrite existing file? ');
  627.       readline (fn);
  628.       if (length(fn)=0) or (upcase(fn[1])<>'Y') then begin
  629.         unsplit;
  630.         exit
  631.       end
  632.     end;
  633.     write (usr,'Protocol (X=Xmodem, Y=Ymodem): ');
  634.     k:=upcase(bioskey);
  635.     ymodem:=k='Y';
  636.     if ymodem then q:='Y' else begin
  637.       write (usr,^M^J'CRC Mode? ');
  638.       q[1]:='Y';
  639.       readline (q)
  640.     end;
  641.     unsplit;
  642.     b:=upcase(q[1])='Y';
  643.     ret:=protocolxfer (false,b,ymodem,fn)
  644.   end;
  645.  
  646.   procedure writetermchar (k:char);
  647.   begin
  648.     case k of
  649.       ^J:if addlf then exit;
  650.       #255:if addlf then k:=^J
  651.     end;
  652.     case k of
  653.       ^L:begin
  654.            ansireset;
  655.            clrscr
  656.          end;
  657.       ^G:begin
  658.            nosound;
  659.            sound (50);
  660.            delay (50);
  661.            nosound
  662.          end
  663.       else writecon (k)
  664.     end;
  665.     if printerecho then write (lst,k);
  666.     case k of
  667.       ^M:if addlf then writetermchar (#255);
  668.     end
  669.   end;
  670.  
  671.   procedure received (k:char);
  672.   begin
  673.     writetermchar (k);
  674.     if echoback then sendchar (k)
  675.   end;
  676.  
  677.   procedure typed (k:char);
  678.   begin
  679.     sendchar (k);
  680.     if localecho then begin
  681.       writecon (k);
  682.       if k=#13 then write (usr,^J)
  683.     end
  684.   end;
  685.  
  686.   procedure checkwherey;
  687.   begin
  688.     if wherey>lasty then begin
  689.       gotoxy (wherex,lasty);
  690.       write (usr,^J)
  691.     end
  692.   end;
  693.  
  694.   procedure doextended (b:byte);
  695.  
  696.     procedure funckey (n:integer);
  697.     var cnt:integer;
  698.     begin
  699.       for cnt:=1 to length(funckeys[n]) do
  700.         sendchar (funckeys[n][cnt])
  701.     end;
  702.  
  703.   begin
  704.     case b of
  705.       59..68:funckey (b-58);
  706.       119:help;
  707.       72:typed (^E);
  708.       75:typed (^S);
  709.       77:typed (^D);
  710.       80:typed (^X);
  711.       115:typed (^A);
  712.       116:typed (^F);
  713.       73:typed (^R);
  714.       81:typed (^C);
  715.       71:typed (^Q);
  716.       79:typed (^W);
  717.       83:typed (^G);
  718.       82:typed (^V);
  719.       117:typed (^P);
  720.       48:setbaud;
  721.       32:dialdirectory;
  722.       18:localecho:=not localecho;
  723.       33:editfunckeys;
  724.       35:if carrier then if getyn ('Hang up') then hangupmodem;
  725.       23:ansireset;
  726.       38:addlf:=not addlf;
  727.       25:setparity;
  728.       16:if getyn ('Go to DOS') then begin
  729.            ensureclosed;
  730.            if not carrier then dontanswer;
  731.            halt (4)
  732.          end;
  733.       19:download;
  734.       20:upload;
  735.       45:done:=getyn ('Resume waiting for calls');
  736. (*
  737.         16..25:altq;
  738.         30..38:alta;
  739.         44..50:altz;
  740. *)
  741.     end
  742.   end;
  743.  
  744.   procedure showbottom;
  745.   var x,y,o:integer;
  746.   begin
  747.     o:=inuse;
  748.     usewind (0);
  749.     gotoxy (1,25);
  750.     textcolor (0);
  751.     textbackground (statlinecolor);
  752.     write (usr,'[TCS-Term] [Ctrl-Home for Help]');
  753.     if addlf then write (usr,' LF');
  754.     if localecho then write (usr,' Echo');
  755.     clreol;
  756.     textcolor (normbotcolor);
  757.     textbackground (0);
  758.     usewind (o)
  759.   end;
  760.  
  761.   function basicterm:integer;
  762.   var k:char;
  763.       e:boolean;
  764.   begin
  765.     showbottom;
  766.     e:=false;
  767.     repeat
  768.       if numchars<>0 then begin
  769.         k:=getchar;
  770.         received (k)
  771.       end;
  772.       checkwherey;
  773.       if keyhit then begin
  774.         k:=bioskey;
  775.         if ord(k)<128 then typed (k) else e:=true
  776.       end
  777.     until e;
  778.     basicterm:=ord(k)-128
  779.   end;
  780.  
  781.   procedure init;
  782.   var k:char;
  783.   begin
  784.     setparam (usecom,baudrate,parity);
  785.     done:=false;
  786.     echoback:=false;
  787.     localecho:=false;
  788.     addlf:=false;
  789.     printerecho:=false;
  790.     textcolor (normbotcolor);
  791.     window (1,1,80,25);
  792.     clrscr;
  793.     initwinds;
  794.     gotoxy (1,lasty);
  795.     bottom;
  796.     dirloaded:=false;
  797.     loadfunckeys;
  798.     while keyhit do k:=bioskey
  799.   end;
  800.  
  801. begin
  802.   init;
  803.   repeat
  804.     doextended (basicterm)
  805.   until done;
  806.   close (dfile);
  807.   window (1,1,25,80);
  808.   ansireset;
  809.   clrscr
  810. end;
  811.  
  812. begin
  813. end.
  814.  
  815.  
  816.  
  817.