home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 270.img / FORUM25C.ZIP / FORUMTRM.PAS < prev    next >
Pascal/Delphi Source File  |  1988-12-27  |  19KB  |  826 lines

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