home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TMODM20R.ZIP / TMODEM.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-10-09  |  47.9 KB  |  1,680 lines

  1. PROGRAM TURBO_Modem;
  2. {$R+}
  3. {$S+}
  4. {$V-}
  5. {$M 16000, 1000,1000}      { 2.0q }
  6.  
  7. USES Dos, Crt, Turbo3;
  8.  
  9. (* --------------------------------------------------
  10.   Written by Jack M. Wierda  Chicago Illinois
  11.   Modified by Steve Freeman
  12.   From 6 JAN 86 mods by L.B. Neal
  13.  
  14.   2-25-87 Still not complete but a improvements made
  15.   and a core of concepts for someone to go
  16.   further.
  17.   l.b. Neal - Sunnyvale,CA
  18.  
  19.   UPGRADES:
  20.   1.  Increase communications options.
  21.   3.  Adjustable text mode and colors.
  22.  
  23.   11-26-88 Ver: 1.1
  24.  
  25.   1. Major loop restructure. - ok -
  26.   2. Added 2400 baud.        - ok -
  27.   3. Added:                  - ok -
  28.      a. HOME = Help
  29.      b. PgUp = Upload
  30.      c. PgDn = Download
  31.      d. ALT-X = EXIT TMODEM
  32.      e. ALT-O = Options.
  33.      f. ALT-S = Screen Colors
  34.      g. ALT-H = Hangup
  35.      h. ALT-I = TMODEM Information.
  36.   4. Window for functions.     - ok -
  37.   5. Adjusted XMODEM DL for longer interface time.  - problems! -
  38.   6. Allowed TModem to receive full "IBM" ASCII char set. - ok -
  39.   7. TModem now recognizes <FF> for ClrScr.         - ok -
  40.   8. Added status line on bottom of screen.         - ok -
  41.   9. Big choice of colors - screen and status line. - ok -
  42.  
  43.   11-28-88 Ver: 1.2
  44.  
  45.   1. A little more speed  -  adjusted LiveTerminal main loop.
  46.   2. COM2: still refuses to receive, transmit seems ok. { Working at it. }
  47.   3. XMODEM receive now seems ok.
  48.   4. HANGUP doesn't work real well.
  49.  
  50.   11-29-88 Ver: 1.3
  51.  
  52.   1. Fixed exit sequence.
  53.  
  54.   12-01-88 1.4
  55.  
  56.   1. Added Configuration file TMODEM.CFG - colors and COMM info.
  57.  
  58.   12-12-88 1.5
  59.  
  60.   1. Got the dialing dir to work.
  61.   2. Can save phone numbers to TMODEM.PHN
  62.   3. Can't delete numbers from TMODEM.PHN
  63.  
  64.   04-11-89 1.6
  65.   1. Clean up a few oops!
  66.   2. More work on Auto-dialing may be better now.
  67.   3. Tried to resolve hangup problem.
  68.   4. Added modem initialization. ( See PROCEDURE ResetModem )
  69.   5. Changed the interface when doing auto-dial.
  70.  
  71.   LANGUAGE: TURBO Pascal 3.01A or 3.02a.
  72.   This program is in the public domain.
  73.  
  74. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  75.   09-26-89 2.0c
  76.   1. Convert to TURBO Pascal 5.0!
  77.   2. Comm port 1,2,3,4 supported.
  78.   3. 300 thru 9600 baud supported.
  79.   4. External Protocol Support.
  80.   5. J)ump to DOS added.
  81. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  82.  
  83.   09-27-89 2.0d/2.0e
  84.    1. Fixed screen arrow garbage.
  85.    2. Fixed EXIT dial routine.
  86.    3. General cleanup.
  87.    4. More speed.
  88.    5. Fixed JUMPDOS.BAT.
  89.    6. Changed timing.
  90.    7. Added modem init string to TMODEM.CFG.
  91.  
  92.   09-28-89 2.0f
  93.    1. Added verification of quit TModem.
  94.    2. Modified status line.
  95.    3. Moved windows further away from main screen.
  96.    4. Added SmallWindow.
  97.    5. Deleted ANS mode.
  98.  
  99.   09-28-89 2.0g
  100.    1. Corrected screen change menu.
  101.  
  102.   09-30-89 2.0h
  103.    1. Added user clearscreen option. ( For my goofs! )
  104.    2. Optimized Terminal loop.
  105.    3. Increased wait for connect time.
  106.    4. Faster windows.
  107.    5. Added abort for connect wait.
  108.    6. Show name calling when dialing.
  109.    7. Can clear or modify entry in dialing directory.
  110.  
  111.   10-01-89 2.0i
  112.    1. Added F1-F10 macro capability - see MACRO.DOC!!
  113.    2. Corrected modem speed initialization.
  114.    3. Modem speed changes when dialing.
  115.    4. Adjusted Help Screen.
  116.    5. Change options will change baud!
  117.  
  118.   10-01-89 2.0j
  119.    1. Added ANSI support. ANSI.SYS required!!!
  120.    2. Added ANSI status to statusline.
  121.  
  122.   10-01-89 2.0k
  123.    1. Cleanup after ANSI.
  124.  
  125.   10-01-89 2.0l
  126.    1. More ANSI side-effect cleanup.
  127.  
  128.   10-02-89 2.0m
  129.    1. More attention to ANSI/NON-ANSI states.
  130.    2. Added ALT-V to View statusline.
  131.    3. Fixed ANSI-BBS ClrScr with help K. Burkhart.
  132.    4. Rearranged HELP screen.
  133.  
  134.   10-03-89 2.0n
  135.    1. Added Dial String to TModem.cfg.
  136.    2. Fixed C)rcXmodem call to XMx.BAT.
  137.  
  138.   10-03-89 2.0o
  139.    1. Improved ANSI tracking scheme for triggering on cursor color.
  140.    2. Better screen clear before dialing.
  141.    3. Deleted TMODEM.CFG from ZIP and set defaults to test for video
  142.       card and set accordingly. Also COM1: and 1200 baud default.
  143.  
  144.   10-04-89 2.0p
  145.    1. Better return from windows. (Finally!).
  146.  
  147.   10-06-89 2.0q
  148.    1. Address video mode on Exit TModem.
  149.    2. Single "A" to abort dialing.
  150.    3. Isuue message and kick modem if abort.
  151.    4. Better tracking in ANSI mode.
  152.    5. Smaller memory requirements.
  153.    6. DirectVideo or BIOS option for screen.
  154.  
  155.   10-09-89 2.0r
  156.    1. New protocol selection window.
  157.    2. Added TallWindow procedure.
  158.    3. Corrected problem with protocol procedure.
  159.    4. Changed filename winddow to smallwindow.
  160.  
  161.   This program was basically a re-write in TURBO Pascal of Ward Christensen's
  162.   Modem Program which was distributed in CP/M User's Group Volume 25. Identical
  163.   and compatible options were provided to allow this program to work directly
  164.   with XMODEM running under CP/M.
  165.  ----------------------------------------------------------------------- *)
  166.  
  167. CONST
  168.   Version = '2.0r(09-OCT-89)';
  169.   MaxPhoneNums = 20; { 2.0h }
  170.   Buffer_Max = 5121; { 2.0 }
  171.   Buffer_End = Buffer_Max-1; {2.0}
  172.   Dsaves : Integer = 0; {2.0}
  173.   cr = #$0D;     { ^M = CR }
  174.  
  175. TYPE
  176.   maxstr      = STRING[255];
  177.   str90       = STRING[90]; { 2.0c }
  178.   PhoneEntry  = STRING[32];
  179.   PhoneStr    = STRING[20];
  180.   filename    = STRING[20]; { 2.0c }
  181.   Str2        = String[2];   { 1.1 }
  182.   MacStr      = String[32]; { 2.0i }
  183.   hexstr      = STRING[4];
  184.   SmallStr    = STRING[10];  { 2.Oi }
  185.  
  186. VAR
  187.   cfile, PhoneFile : Text; { 1.4 }
  188.   PhoneList : ARRAY[1..MaxPhoneNums] OF PhoneEntry;
  189.   option, hangup, baudrate, scrnmode : Char;
  190.   txtcolor, backcolor : String[2];       { 1.1}
  191.   portnum, answer : Char;
  192.   base, N_Phones, pnumbers : Integer;    { 1.5 }
  193.   scrmode, bauds, txtclr, txtback : Integer;
  194.   callout : Boolean;
  195.   COMport : Integer;
  196.   done : Boolean;                  { 1.1 }
  197.   newscr, newstatus, options : Boolean;    { 1.4 }
  198.   speed, cport, cmode : String[8]; { 1.1 }
  199.   mrow, mcol : Byte; { 2.0o }
  200.   statclr, statbak : Integer;      { 1.1 }
  201.   RecBuf : ARRAY[1..Buffer_Max] of Char; {2.0}
  202.   outport : Integer; {2.0}
  203.   Buffer_head, Buffer_Tail, Buffer_Count : Word; {2.0}
  204.   Async_Irq : Byte; { 2.0 }
  205.   regs : Registers; {2.0}
  206.   andwith : Byte; {2.0}
  207.   AsyncVector : Pointer; {2.0}
  208.   err : Integer; {2.0}
  209.   meth,way : Char; { 2.0c }
  210.   initstrg : Str90; { 2.0e }
  211.   exitphone : Boolean; { 2.0e }
  212.   phonename : Str90; { 2.0h }
  213.   index : Integer; { 2.0h }
  214.   MacArray : ARRAY[1..10] of MacStr; { 2.0i }
  215.   useansi : Boolean; { 2.0j }
  216.   ansistat : String[4]; { 2.0j }
  217.   oldmode : Byte; { 2.0m }
  218.   dialstrg : PhoneEntry; { 2.0n }
  219.   junk : char; { 2.0o }
  220.   savescrn : Boolean; { 2.0p }
  221.   biosvideo : Boolean; { 2.0q }
  222.   videochc : String[8]; { 2.0g }
  223.  
  224.  PROCEDURE set_baud(r:integer);
  225.  VAR a : byte; rw : word;
  226.  BEGIN
  227.   IF (r >= 300) AND (r <= 9600) THEN
  228.    BEGIN
  229.     IF r = 2400 THEN rw := 48
  230.      ELSE IF r = 1200 THEN rw := 96
  231.       ELSE IF r = 9600 THEN rw := 6 { really 19200 baud }
  232.        ELSE IF r = 300 THEN rw := 384;
  233.     a := port[base+3] OR 128;
  234.     port[base+3] := a;
  235.     port[base] := lo(rw);
  236.     port[base+1] := hi(rw);
  237.     port[base+3] := a AND 127;
  238.    END
  239.   ELSE
  240.    BEGIN
  241.     Writeln('Invalid Baud Rate = ', r); { 2.0i }
  242.     Halt(1);
  243.    END;
  244.  END;
  245.  
  246.  {$R-,S-}
  247.  PROCEDURE async_isr; Interrupt;
  248.   BEGIN
  249.    Inline($FB); {STI}
  250.    RecBuf[Buffer_Head] := Char(Port[Base]);
  251.    IF (Buffer_Head = Buffer_End) THEN Buffer_Head := 1 ELSE INC(Buffer_Head,1);
  252.    INC(Buffer_Count,1);
  253.    Inline($FA); {CLI}
  254.    Port[$20] := $20;
  255.   END;
  256.  
  257. procedure dump;
  258. begin
  259.   Inline($FA); {CLI}
  260.   buffer_head := 1;
  261.   buffer_tail := 1;
  262.   buffer_count := 0;
  263.   Inline($FB); {STI}
  264. end;
  265.  
  266.  procedure remove_port;
  267.  var i,m : Word;
  268.  begin
  269.   inline($FA); {CLI}
  270.   i := port[$21];
  271.   m := 1 SHL Async_Irq;
  272.   port[$21] := i OR m;
  273.   port[base+2] := 0;
  274.   port[base+4] := port[base+4] AND 1;
  275.   inline($FB); {STI}
  276.  end;
  277.  
  278. procedure term_ready(s:Boolean);
  279. var x:byte;
  280. begin
  281.   x := port[base+4] and $FE;
  282.   if s then x := x+1;
  283.   port[base+4] := x;
  284. end;
  285.  
  286.  PROCEDURE iport1;
  287.   BEGIN
  288.    CASE comport OF
  289.    1 : begin
  290.         base := $3f8;
  291.         Async_Irq  := 4;
  292.         cport := 'COM1:';
  293.        end;
  294.    2 : begin
  295.         base := $2f8;
  296.         Async_Irq  := 3;
  297.         cport := 'COM2:';
  298.        end;
  299.    3 : begin
  300.         base := $3E8;
  301.         Async_Irq  := 4;
  302.         cport := 'COM3:';
  303.        end;
  304.    4 : begin
  305.         base := $2E8;
  306.         Async_Irq  := 3;
  307.         cport := 'COM4:';
  308.        end;
  309.    END;
  310.    outport := Base+5;
  311.   END;
  312.  
  313.  procedure iport;
  314.  var i,m:Integer;
  315.  BEGIN
  316.   dsaves := DSeg;
  317.   If (Port[2+base] and $00F8) <> 0 Then
  318.    begin
  319.     writeln('Illegal com port number:',cport);
  320.     halt;
  321.    end
  322.   else
  323.    begin
  324.     buffer_Head := 1;
  325.     buffer_Tail := 1;
  326.     buffer_Count := 0;
  327.     port[base+3]:= $03;
  328.     with regs do
  329.      begin
  330.       ah := $25; al := async_irq+8;
  331.       ds := cseg;
  332.       dx := ofs(async_isr); msdos(regs);
  333.      end;
  334.     inline($FA);
  335.     i := port[5+base];
  336.     i := port[base];
  337.     i := port[$21];
  338.     m := (1 shl Async_Irq) xor $00FF;
  339.     port[$21] := i and m;
  340.     port[1+base] := $01;
  341.     i := port[4+base];
  342.     port[4+base] := i or $08;
  343.     term_ready(true);
  344.     inline($FB);
  345.    end;
  346.  end;
  347.  
  348.   FUNCTION value(i:str2):integer; Forward; {2.0}
  349.  
  350.   PROCEDURE Sendtext(Strg : str90); Forward; { 1.6 }
  351.  
  352.   PROCEDURE init1;
  353.   VAR maxbaud, stat : Integer;
  354.   BEGIN
  355.    val(speed,maxbaud,stat); { 2.0i }
  356.    Set_Baud(maxbaud);
  357.    DELAY(500);
  358.      IF maxbaud = 9600 THEN
  359.         sendtext('AT'+cr)
  360.      ELSE
  361.       IF maxbaud = 2400 THEN
  362.         sendtext('AT'+cr)
  363.       ELSE
  364.        IF maxbaud = 1200 THEN
  365.          sendtext('AT'+cr)
  366.        ELSE
  367.        IF maxbaud = 300 THEN
  368.          sendtext('AT'+cr);
  369.      Delay(1000);
  370.      dump;
  371.   END;
  372.  
  373. function commpressed : boolean;
  374. begin
  375.  commpressed := buffer_Count > 0;
  376. end;
  377.  
  378.  FUNCTION Cinkey:char;
  379.  VAR t:char;
  380.  BEGIN
  381.   IF Buffer_Count = 0 THEN
  382.     t := #0
  383.   ELSE
  384.    BEGIN
  385.     inline($FA);
  386.     t := RecBuf[buffer_Tail];
  387.     IF Buffer_Tail < Buffer_End THEN
  388.      INC(Buffer_Tail)
  389.     ELSE
  390.      Buffer_Tail := 1;
  391.     DEC(buffer_count);
  392.     inline($FB);
  393.    END;
  394.   cinkey := chr(ord(t)); { 2.0b }
  395. END;
  396.  {$R+,S+}
  397.  
  398. (* ------ NOT used in TModem but left as an example -------
  399.  
  400.   FUNCTION hex(num : Integer) : hexstr;
  401.   VAR i, j : Integer; h : STRING[16]; Str : hexstr;
  402.   BEGIN
  403.    Str := '0000'; h := '0123456789ABCDEF'; j := num;
  404.    FOR i := 4 DOWNTO 1 DO
  405.     BEGIN
  406.      Str[i] := h[(j AND 15)+1];
  407.      j := j SHR 4;
  408.     END;
  409.    hex := Str;
  410.   END;
  411. ------------------------------------------------------------ *)
  412.  
  413.   FUNCTION value(i:str2):integer;
  414.   VAR n,n1:integer;
  415.   BEGIN
  416.    val(i,n,n1);
  417.    IF n1 <> 0 THEN
  418.     BEGIN
  419.      i := copy(i,1,n1-1);
  420.      val(i,n,n1)
  421.     END;
  422.    value := n;
  423.    IF i = '' THEN value := 0;
  424.   END;
  425.  
  426.   PROCEDURE statusline;  Forward;
  427.  
  428.    PROCEDURE JUMPDOS; { 2.0c }
  429.     BEGIN
  430.      Window(1,1,80,25);
  431.      ClrScr;
  432.      writeln;  { 2.0q }
  433.      writeln('Drop to DOS!'); { 2.0h }
  434.      writeln('CAUTION: You MUST Exit from shell in TModem home directory!');
  435.      write('Hit a key to continue!');
  436.      REPEAT UNTIL Keypressed;
  437.      ClrScr;
  438.      SwapVectors;
  439.      EXEC(GetEnv('comspec'),'/C JUMPDOS.BAT');
  440.      SwapVectors;
  441.      iport;
  442.      ClrScr;
  443.      IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24); { 2.0l }
  444.      GotoXY(1,1);
  445.      Writeln('TMODEM Terminal Mode!');
  446.      statusline;
  447.      GotoXY(1,2);
  448.     END;
  449.  
  450.   PROCEDURE FileShell(efn : filename; meth, way : char); { 2.0c }
  451.    VAR theway : filename; passdata : Str90; sport : Char;
  452.    BEGIN
  453.     CASE meth OF
  454.      'K': theway := 'K';
  455.      'M': theway := 'ML';
  456.      'J': theway := 'JM';
  457.      'T': theway := 'TY';
  458.      'W': theway := 'WX';
  459.      'X': theway := 'XM';
  460.      'Y': theway := 'YM';
  461.      'Z': theway := 'ZM';
  462.      'B': theway := 'BI';
  463.      'L': theway := 'LM';
  464.      'S': theway := 'SK';
  465.     END;
  466.     theway := theway+way+'.BAT';
  467.     sport := chr(comport+48);
  468.     passdata:= theway+' '+speed+' '+sport+' '+efn;
  469.     EXEC(GetEnv('comspec'),'/C '+passdata);
  470.     Delay(1000);
  471.     iport;
  472.     ClrScr;
  473.     GotoXY(1,1);
  474.    END;
  475.  
  476.   {$R-,S-}
  477.   PROCEDURE Largewindow; { 2.0f }
  478.   VAR i : Byte;
  479.    BEGIN
  480.     Clrscr; { 1.3 }
  481.     GotoXY(1,1);
  482.     Write(Chr(201));
  483.     FOR i := 1 TO 40 DO Write(chr(205));
  484.     Write(chr(187));
  485.     Gotoxy(1,2); Write(chr(186)); Gotoxy(42,2); Write(chr(186));
  486.     Gotoxy(1,3); Write(chr(186)); Gotoxy(42,3); Write(chr(186));
  487.     Gotoxy(1,4); Write(chr(186)); Gotoxy(42,4); Write(chr(186));
  488.     Gotoxy(1,5); Write(chr(186)); Gotoxy(42,5); Write(chr(186));
  489.     Gotoxy(1,6); Write(chr(186)); Gotoxy(42,6); Write(chr(186));
  490.     Gotoxy(1,7); Write(chr(186)); Gotoxy(42,7); Write(chr(186));
  491.     Gotoxy(1,8); Write(chr(186)); Gotoxy(42,8); Write(chr(186));
  492.     Gotoxy(1,9); Write(chr(186)); Gotoxy(42,9); Write(chr(186));
  493.     Gotoxy(1,10); Write(chr(186)); Gotoxy(42,10); Write(chr(186));
  494.     Gotoxy(1,11); Write(chr(186)); Gotoxy(42,11); Write(chr(186));
  495.     Gotoxy(1,12); Write(chr(186)); Gotoxy(42,12); Write(chr(186));
  496.     Gotoxy(1,13); Write(chr(186)); Gotoxy(42,13); Write(chr(186));
  497.     Gotoxy(1,14); Write(chr(186)); Gotoxy(42,14); Write(chr(186));
  498.     Gotoxy(1,15); Write(chr(186)); Gotoxy(42,15); Write(chr(186));
  499.     Gotoxy(1,16); Write(chr(186)); Gotoxy(42,16); Write(chr(186));
  500.     Gotoxy(1,17); Write(chr(186)); Gotoxy(42,17); Write(chr(186));
  501.     Gotoxy(1,18); Write(chr(186)); Gotoxy(42,18); Write(chr(186));
  502.     Gotoxy(1,19); Write(chr(186)); Gotoxy(42,19); Write(chr(186));
  503.     Gotoxy(1,20); Write(chr(186)); Gotoxy(42,20); Write(chr(186));
  504.     Gotoxy(1,21); Write(chr(186)); Gotoxy(42,21); Write(chr(186));
  505.     Gotoxy(1,22); Write(Chr(200));
  506.     FOR i := 1 TO 40 DO Write(chr(205)); Write(chr(188));
  507.    END;
  508.  
  509.   PROCEDURE Tallwindow; { 2.0r }
  510.   VAR i : Byte;
  511.    BEGIN
  512.     Clrscr; { 1.3 }
  513.     GotoXY(1,1);
  514.     Write(Chr(201));
  515.     FOR i := 1 TO 20 DO Write(chr(205)); { 2.0r }
  516.     Write(chr(187));
  517.     Gotoxy(1,2); Write(chr(186)); Gotoxy(22,2); Write(chr(186));
  518.     Gotoxy(1,3); Write(chr(186)); Gotoxy(22,3); Write(chr(186));
  519.     Gotoxy(1,4); Write(chr(186)); Gotoxy(22,4); Write(chr(186));
  520.     Gotoxy(1,5); Write(chr(186)); Gotoxy(22,5); Write(chr(186));
  521.     Gotoxy(1,6); Write(chr(186)); Gotoxy(22,6); Write(chr(186));
  522.     Gotoxy(1,7); Write(chr(186)); Gotoxy(22,7); Write(chr(186));
  523.     Gotoxy(1,8); Write(chr(186)); Gotoxy(22,8); Write(chr(186));
  524.     Gotoxy(1,9); Write(chr(186)); Gotoxy(22,9); Write(chr(186));
  525.     Gotoxy(1,10); Write(chr(186)); Gotoxy(22,10); Write(chr(186));
  526.     Gotoxy(1,11); Write(chr(186)); Gotoxy(22,11); Write(chr(186));
  527.     Gotoxy(1,12); Write(chr(186)); Gotoxy(22,12); Write(chr(186));
  528.     Gotoxy(1,13); Write(chr(186)); Gotoxy(22,13); Write(chr(186));
  529.     Gotoxy(1,14); Write(chr(186)); Gotoxy(22,14); Write(chr(186));
  530.     Gotoxy(1,15); Write(chr(186)); Gotoxy(22,15); Write(chr(186));
  531.     Gotoxy(1,16); Write(chr(186)); Gotoxy(22,16); Write(chr(186));
  532.     Gotoxy(1,17); Write(chr(186)); Gotoxy(22,17); Write(chr(186));
  533.     Gotoxy(1,18); Write(chr(186)); Gotoxy(22,18); Write(chr(186));
  534.     Gotoxy(1,19); Write(chr(186)); Gotoxy(22,19); Write(chr(186));
  535.     Gotoxy(1,20); Write(chr(186)); Gotoxy(22,20); Write(chr(186));
  536.     Gotoxy(1,21); Write(chr(186)); Gotoxy(22,21); Write(chr(186));
  537.     Gotoxy(1,22); Write(Chr(200));
  538.     FOR i := 1 TO 20 DO Write(chr(205)); Write(chr(188));
  539.    END;
  540.  
  541.   PROCEDURE windowframe;
  542.   VAR i : Byte;
  543.    BEGIN
  544.     Clrscr; { 1.3 }
  545.     GotoXY(1,1);
  546.     Write(Chr(201));
  547.     FOR i := 1 TO 38 DO Write(chr(205));
  548.     Write(chr(187));
  549.     Gotoxy(1,2); Write(chr(186)); Gotoxy(40,2); Write(chr(186));
  550.     Gotoxy(1,3); Write(chr(186)); Gotoxy(40,3); Write(chr(186));
  551.     Gotoxy(1,4); Write(chr(186)); Gotoxy(40,4); Write(chr(186));
  552.     Gotoxy(1,5); Write(chr(186)); Gotoxy(40,5); Write(chr(186));
  553.     Gotoxy(1,6); Write(chr(186)); Gotoxy(40,6); Write(chr(186));
  554.     Gotoxy(1,7); Write(chr(186)); Gotoxy(40,7); Write(chr(186));
  555.     Gotoxy(1,8); Write(chr(186)); Gotoxy(40,8); Write(chr(186));
  556.     Gotoxy(1,9); Write(chr(186)); Gotoxy(40,9); Write(chr(186));
  557.     Gotoxy(1,10); Write(chr(186)); Gotoxy(40,10); Write(chr(186));
  558.     Gotoxy(1,11); Write(chr(186)); Gotoxy(40,11); Write(chr(186));
  559.     Gotoxy(1,12); Write(Chr(200));
  560.     FOR i := 1 TO 38 DO Write(chr(205)); Write(chr(188));
  561.    END;
  562.  
  563.   PROCEDURE Smallwindow;
  564.   VAR i : Byte;
  565.    BEGIN
  566.     Clrscr; { 1.3 }
  567.     GotoXY(1,1);
  568.     Write(Chr(201));
  569.     FOR i := 1 TO 38 DO Write(chr(205));
  570.     Write(chr(187));
  571.     Gotoxy(1,2); Write(chr(186)); Gotoxy(40,2); Write(chr(186));
  572.     Gotoxy(1,3); Write(Chr(200));
  573.     FOR i := 1 TO 38 DO Write(chr(205)); Write(chr(188));
  574.    END;
  575.  
  576.   PROCEDURE termscrn;  { 2.0m }
  577.   BEGIN
  578.    mcol := WhereX; mrow := WhereY; { 2.0p }
  579.    Window(40,13,80,24); { 2.0m }
  580.    WindowFrame;
  581.    GotoXY(3,2);  Write('         -- TModem Help --          ');
  582.    Gotoxy(3,3);  Write('                                    ');
  583.    GotoXY(3,4);  Write(' UPLOAD   = PgUp   DLOAD   = PgDn   ');
  584.    Gotoxy(3,5);  Write(' Dial     = ALT-D  Hangup  = ALT-H  ');
  585.    Gotoxy(3,6);  Write(' Options  = ALT-O  Macros  = F1/F10 ');
  586.    Gotoxy(3,7);  Write(' Clrscrn  = ALT-C  Info    = ALT-I  ');
  587.    Gotoxy(3,8);  Write(' ViewStat = ALT-V  ScrnChg = ALT-S  ');
  588.    Gotoxy(3,9);  Write(' ANSI Tgl = ALT-A  JumpDos = ALT-J  ');
  589.    Gotoxy(3,10); Write('                                    ');
  590.    Gotoxy(3,11); Write('                   EXIT    = ALT-X  ');
  591.    REPEAT UNTIL Keypressed;
  592.    Read(kbd, junk);
  593.    ClrScr;
  594.    IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24); { 2.0l }
  595.    GotoXY(mcol,mrow);
  596.   END;
  597.   {$R+,S+}
  598.  
  599.   PROCEDURE SetDTR;
  600.   BEGIN
  601.    Port[base+4] := $09;      { $3FC/$2FC DTR on and INT enabled}
  602.   END;
  603.  
  604.   PROCEDURE HangUpPhone;      {hang up by terminating the line}
  605.   BEGIN
  606.    Port[base+4] := 0;
  607.    callout := False;
  608.   END;
  609.  
  610.   PROCEDURE setup(brc :Char); Forward;   { 1.1 }
  611.  
  612.   PROCEDURE HangItUp;      { 1.6 }
  613.   BEGIN
  614.    sendtext('+++');
  615.    delay(2000);            { 1.6 }
  616.    sendtext('ATH'+cr);     { 1.6 }
  617.    Setup(baudrate);
  618.   END;
  619.  
  620.  {$R-,S-}
  621.   PROCEDURE send(ch : Char);
  622.   BEGIN
  623.    WHILE (port[outport] AND 32) = 0 DO BEGIN END;
  624.    port[base] := ord(ch);
  625.   END;
  626.  {$R+,S+}
  627.  
  628.   PROCEDURE ResetModem;
  629.    BEGIN
  630.     sendtext('ATZ'+cr);                { 1.6 }
  631.     delay(1500);                       { 1.6 }
  632.     sendtext(initstrg+cr); { 2.0e }
  633.    END;
  634.  
  635.   PROCEDURE XlateSetup;
  636.    BEGIN
  637.     CASE baudrate OF
  638.       '1' : speed := '1200'; { 2.0b }
  639.       '2' : speed := '2400';
  640.       '3' : speed := ' 300';
  641.       '9' : speed := '9600';
  642.     END;
  643.     CASE comport OF
  644.       1 : cport := 'COM1:';
  645.       2 : cport := 'COM2:';
  646.       3 : cport := 'COM3:';
  647.       4 : cport := 'COM4:';
  648.     END;
  649.     IF useansi THEN ansistat := 'OFF' ELSE ansistat := ' ON'; { 2.0j }
  650.    END;
  651.  
  652.   PROCEDURE setup(brc :Char); { 1.1 major changes for statusline info }
  653.   BEGIN
  654.     baudrate := brc;
  655.     IF baudrate = '1' THEN
  656.       speed := '1200'       { 1.1 }
  657.     ELSE
  658.      IF baudrate = '2' THEN
  659.        speed := '2400'       { 1.1 }
  660.      ELSE
  661.       IF baudrate = '3' THEN
  662.         speed := ' 300'      { 1.1 }
  663.       ELSE
  664.        IF baudrate = '9' THEN
  665.          speed := '9600';    { 2.0 }
  666.     CASE comport OF
  667.       1 : cport := 'COM1:';
  668.       2 : cport := 'COM2:';
  669.       3 : cport := 'COM3:';
  670.       4 : cport := 'COM4:';
  671.     END;
  672.    init1; { 2.0i }
  673.   END;
  674.  
  675.   PROCEDURE MakeConfig;    { 1. 4 }
  676.   VAR fil : Text;
  677.    BEGIN
  678.     Assign(fil, 'TMODEM.CFG');
  679.     {$I-} Rewrite(fil); {$I+}
  680.     IF IORESULT <> 0 THEN
  681.      BEGIN
  682.       Write('OOPS! TMODEM Error making TMODEM.CFG.');
  683.       {$I-} Close(fil);{$I+}
  684.       err := IORESULT;
  685.       Halt;
  686.      END;
  687.     Append(fil);
  688.     CASE comport OF
  689.       1 : cport := 'COM1:';
  690.       2 : cport := 'COM2:';
  691.       3 : cport := 'COM3:';
  692.       4 : cport := 'COM4:';
  693.     END;
  694.     Writeln(fil, cport);
  695.     CASE baudrate OF
  696.       '1' : speed := '1200';
  697.       '2' : speed := '2400';
  698.       '3' : speed := ' 300';
  699.       '9' : speed := '9600';
  700.     END;
  701.     Writeln(fil, speed);
  702.     Writeln(fil, scrmode);
  703.     Writeln(fil, txtclr);
  704.     Writeln(fil, txtback);
  705.     Writeln(fil, statclr);
  706.     Writeln(fil, statbak);
  707.     Writeln(fil, initstrg); { 2.0e }
  708.     Writeln(fil, dialstrg); { 2.0n }
  709.     Writeln(fil, videochc); { 2.0q }
  710.     Close(fil);
  711.   END;
  712.  
  713.   PROCEDURE ReadConfig;    { 1. 4 }
  714.   VAR fil : Text;
  715.    BEGIN
  716.     Assign(fil, 'TMODEM.CFG');
  717.     {$I-} Reset(fil); {$I+}
  718.     IF IORESULT = 0 THEN
  719.      BEGIN
  720.       Readln(fil, cport);
  721.       Readln(fil, speed);
  722.       Readln(fil, scrmode);
  723.       Readln(fil, txtclr);
  724.       Readln(fil, txtback);
  725.       Readln(fil, statclr);
  726.       Readln(fil, statbak);
  727.       Readln(fil, initstrg);
  728.       Readln(fil, dialstrg);    { 2.0n }
  729.       Readln(fil, videochc); { 2.0q }
  730.       Close(fil);
  731.       IF cport = 'COM1:' THEN
  732.        COMport := 1
  733.       ELSE
  734.        IF cport = 'COM2:' THEN
  735.         COMport := 2
  736.        ELSE
  737.         IF cport = 'COM3:' THEN
  738.          COMport := 3
  739.         ELSE
  740.          IF cport = 'COM4:' THEN
  741.           COMport := 4;
  742.       IF speed = '2400' THEN
  743.        baudrate := '2'
  744.       ELSE
  745.        IF speed = '1200' THEN
  746.         baudrate := '1'
  747.        ELSE
  748.         IF speed = '9600' THEN
  749.          baudrate := '9'
  750.         ELSE
  751.          IF speed = ' 300' THEN
  752.           baudrate := '3';
  753.       IF videochc = 'BIOS' THEN { 2.0q }
  754.        biosvideo := True
  755.       ELSE biosvideo := False;
  756.      END
  757.     ELSE
  758.      BEGIN
  759.       {$I-} Close(fil); {$I+}
  760.       err := IORESULT;
  761.       MakeConfig;
  762.      END;
  763.   END;
  764.  
  765.   PROCEDURE Initialize;          { 1.1  major changes to support window }
  766.   VAR done : Boolean;
  767.   BEGIN
  768.    done := False;
  769.    mcol := WhereX; mrow := WhereY;
  770.    Window(40,13,80,24); { 2.0m }
  771.    WindowFrame;
  772.    REPEAT
  773.     REPEAT
  774.       GotoXY(3,2); { 2.0n }
  775.       Write('Baud - 3)00, 1)200, 2)400, 9)600:');
  776.       Read(Kbd, baudrate);
  777.     UNTIL baudrate IN ['1', '2', '3', '9'];
  778.     Writeln;
  779.     REPEAT
  780.       GotoXY(3,4); { 2.0n }
  781.       Write('Port(1,2,3,4):');
  782.       Read(Kbd, portnum);
  783.     UNTIL portnum IN ['1'..'4']; {2.0}
  784.  
  785.     GotoXY(3,6); { 2.0n }
  786.     Writeln('DialString(max 32 chars)'); { 2.0n }
  787.     GotoXY(3,7);
  788.     Write(':');
  789.     Readln(dialstrg);
  790.  
  791.     CASE portnum OF
  792.      '1' : COMport := 1;
  793.      '2' : COMport := 2;
  794.      '3' : COMport := 3;
  795.      '4' : COMport := 4;
  796.     END;
  797.  
  798.     Xlatesetup;                              { 1.4 }
  799.     GotoXY(3,8);  Write(cport);              { 1.4 }
  800.     GotoXY(3,9);  Write('BAUD: ', speed);    { 1.4 }
  801.     GotoXY(3,10); Write('DSTR: ',dialstrg);  { 2.0n }
  802.  
  803.     REPEAT
  804.      GotoXY(3,11);
  805.      Write('Is this correct [Y/N]?');
  806.      Read(Kbd, answer);
  807.      answer := UpCase(answer);
  808.     UNTIL answer IN ['Y', 'N'];
  809.  
  810.     IF answer = 'Y' THEN done:= True;
  811.    UNTIL done;
  812.  
  813.    REPEAT                          { 1.4 }
  814.     answer := ' ';
  815.     GotoXY(3,11);
  816.     Write('Save settings to disk [Y/N]?');
  817.     Read(Kbd, answer);
  818.     answer := UpCase(answer);
  819.    UNTIL answer IN ['Y', 'N'];
  820.  
  821.    IF answer = 'Y' THEN
  822.     MakeConfig;                    { 1.4 }
  823.    iport1;
  824.    GetIntVec(Async_irq+8, AsyncVector);
  825.    iport;
  826.    Setup(baudrate);
  827.    ClrScr;
  828.    IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  829.    GotoXY(mcol,mrow);
  830.    NewStatus := True;
  831.   END;
  832.  
  833.   PROCEDURE InfoScr;
  834.   BEGIN
  835.    mcol := WhereX; mrow := WhereY;
  836.    Window(40,13,80,24); { 2.0m }
  837.    WindowFrame;
  838.    GotoXY(3,2);  Write('   ----- TModem INFO Screen -----   ');
  839.    Gotoxy(3,4);  Write('                                    ');
  840.    Gotoxy(3,5);  Write('      TModem is Public Domain       ');
  841.    Gotoxy(3,6);  Write('      Version ',version,'     ');       { 2.0g }
  842.    Gotoxy(3,7);  Write('        Mods by L.B. Neal.          ');
  843.    Gotoxy(3,8);  Write('                                    ');
  844.    Gotoxy(3,9);  Write('      ANSI Support is Working!      ');
  845.    Gotoxy(3,10); Write('                                    ');
  846.    Gotoxy(3,11); Write(' <Hit a key to return to terminal>  ');
  847.    REPEAT UNTIL Keypressed;
  848.    Read(kbd, junk); { 2.0o }
  849.    ClrScr;
  850.    IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  851.    GotoXY(mcol,mrow);
  852.   END;
  853.  
  854.   PROCEDURE sendtext(Strg : Str90 ); { 1.6 }
  855.   VAR i, size : Integer;
  856.   BEGIN
  857.     Size := ord(strg[0]);
  858.     FOR i := 1 TO size DO send(Strg[i]); { 2.0b }
  859.   END;
  860.  
  861.   FUNCTION Dial(PhoneNumber : PhoneStr) : Char;   { 1.5 major changes }
  862.   VAR c, ch : Char; t : real; { 2.0h }
  863.   BEGIN
  864.     GotoXY(1,1);
  865.     Writeln;   { 1.6 }
  866.     Writeln('Dialing: ',phonename); { 2.0h }
  867.     Write('Number:', PhoneNumber); { 1.6 }
  868.     Delay(250);
  869.     SetDTR;
  870.     Delay(250);
  871.     sendtext(dialstrg+PhoneNumber+cr); {2.0n }
  872.     writeln;                           { 1.5 }
  873.     Delay(1000);
  874.     c := cinkey;
  875.     c := Chr(0);
  876.     REPEAT
  877.      c := cinkey
  878.     UNTIL (c = cr) OR (c = 'C');          { 1.5 }
  879.     IF (c <> 'C') THEN                    { 1.5 }
  880.      BEGIN        { timing NOT speed needed here }
  881.       Writeln;
  882.       Writeln('Waiting for carrier.....<Hit "A" to abort>'); { 2.0q }
  883.       t := 180*6500; { was 120*6500 - 2.0h }
  884.       REPEAT
  885.        t := t-1;
  886.        IF commpressed THEN c := cinkey;
  887.        IF keypressed THEN read(kbd,ch) ELSE ch := ' '; { 2.0q }
  888.        IF (ch = 'A') OR (ch = 'a') THEN
  889.         BEGIN Writeln('Aborting!'); sendtext(cr); t := 0; END;       { 2.0q }
  890.       UNTIL (c = 'C') OR (t < 1) OR (c = 'B') OR (c = 'N') OR { 2.0d }
  891.             (c = '1') OR (c = '5') OR (c = '7') OR (c = '3');  { 1.6 }
  892.      END;
  893.     CASE c OF  { 1.6 }
  894.      'C' : BEGIN write(c); c := 'G'; END;
  895.      'B' : BEGIN write(c); c := 'G'; END;
  896.      'N' : BEGIN write(c); c := 'G'; END;
  897.      '1' : BEGIN write('CONNECT 300 or 2400'); c := 'G'; END;
  898.      '3' : BEGIN writeln('NO CARRIER'); c := 'G'; END;
  899.      '5' : BEGIN writeln('CONNECT 1200'); c := 'G'; END;
  900.      '7' : BEGIN writeln('BUSY'); c := 'G'; END;
  901.     END;
  902.     IF (t = 0) AND (c <> 'G') THEN c := '9'; { 1.6 }
  903.     Dial := c
  904.   END;
  905.  
  906.   PROCEDURE GetProtocol;
  907.   VAR Protocol : String[2]; { 2.0r }
  908.    BEGIN
  909.     protocol := ''; meth := 'Q';
  910.     mcol := WhereX; mrow := WhereY;
  911.     Window(58,3,80,24); { 2.0r }
  912.     TallWindow; { 2.0r }
  913.     GotoXY(3,2);  Write('- Protocols -');
  914.     GotoXY(3,4);  Write('S)uperk');
  915.     GotoXY(3,5);  Write('J)modem');
  916.     GotoXY(3,6);  Write('Z)modem');
  917.     GotoXY(3,7);  Write('B)imodem');
  918.     GotoXY(3,8);  Write('L)ynx');
  919.     GotoXY(3,9);  Write('M)egalink');
  920.     GotoXY(3,10);  Write('Y)modem-1k');
  921.     GotoXY(3,11);  Write('T)rueYmodem');
  922.     GotoXY(3,12);  Write('W)xmodem');
  923.     GotoXY(3,13);  Write('K)ermit');
  924.     GotoXY(3,14); Write('C)rcXmodem');
  925.     GotoXY(3,15); Write('X)modem');
  926.     GotoXY(3,16); Write('A)bort');
  927.     GotoXY(3,21); Write('Selection:');
  928.     Readln(protocol);
  929.     IF protocol = '' THEN protocol := 'A'; { 2.0r }
  930.     protocol := upcase(protocol[1]); { 2.0r }
  931.     IF protocol = 'C' THEN protocol := 'X'; { 2.0n }
  932.     IF (protocol = '') OR (protocol = 'A') THEN
  933.      BEGIN
  934.       meth := 'Q'
  935.      END
  936.     ELSE
  937.      Meth := protocol[1]; { 2.0r }
  938.    END;
  939.  
  940.   PROCEDURE SendFile; { 2.0c }
  941.   VAR fname : Filename;
  942.    BEGIN
  943.     mcol := WhereX; mrow := WhereY;
  944.     Window(40,22,80,24); { 2.0r }
  945.     SmallWindow; { 2.0r }
  946.     GotoXY(3,2);  Write('File to Upload:');
  947.     ReadLn(fname);
  948.     IF fname = '' THEN
  949.      BEGIN { 2.0e }
  950.       ClrScr;
  951.       IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  952.       GotoXY(mcol,mrow);
  953.      END;
  954.     IF fname <> '' THEN
  955.      BEGIN
  956.       way := 'S';
  957.       ClrScr; { 2.0r }
  958.       IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  959.       GotoXY(mcol,mrow);
  960.       GetProtocol;
  961.       IF  meth <> 'Q' THEN
  962.        BEGIN
  963.         ClrScr;
  964.         IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  965.         ClrScr;
  966.         GotoXY(1,1);
  967.         FileShell(fname, meth, way);
  968.        END
  969.       ELSE
  970.        BEGIN
  971.         ClrScr;
  972.         IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  973.         GotoXY(mcol,mrow);
  974.        END;
  975.      END;
  976.    statusline;
  977.   END;
  978.  
  979.   PROCEDURE RcvFile; { 2.0c }
  980.    VAR fname : Filename;
  981.    BEGIN
  982.     mcol := WhereX; mrow := WhereY;
  983.     Window(40,22,80,24); { 2.0r }
  984.     SmallWindow; { 2.0r }
  985.     GotoXY(3,2);  Write('File to Download:');
  986.     ReadLn(fname);
  987.     IF fname = '' THEN
  988.      BEGIN { 2.0e }
  989.       ClrScr;
  990.       IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  991.       GotoXY(mcol,mrow);
  992.      END;
  993.     IF fname <> '' THEN
  994.      BEGIN
  995.       way := 'R';
  996.       ClrScr; { 2.0r }
  997.       IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  998.       GotoXY(mcol,mrow);
  999.       GetProtocol;
  1000.       IF  meth <> 'Q' THEN
  1001.        BEGIN
  1002.         ClrScr;
  1003.         IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  1004.         ClrScr;
  1005.         GoToXY(1,1);
  1006.         FileShell(fname, meth, way);
  1007.        END
  1008.       ELSE
  1009.        BEGIN
  1010.         ClrScr;
  1011.         IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  1012.         GotoXY(mcol,mrow);
  1013.        END;
  1014.      END;
  1015.     Statusline;
  1016.    END;
  1017.  
  1018.  {$R-,S-}
  1019.   PROCEDURE statusline;      {     Changed  1.4 }
  1020.   BEGIN
  1021.    IF useansi THEN ansistat := ' ON' ELSE ansistat := 'OFF'; { 2.0j }
  1022.    Window(1,25,80,25);
  1023.    TextColor(statclr);
  1024.    TextBackground(statbak);
  1025.    Clrscr; { 1.4 }
  1026.    Write(' TModem ',version,' <HOME> for Help!          ANSI:',ansistat,' Baud:'+speed+' PORT:'+cport);
  1027.    Newstatus := False;
  1028.    Window(1,1,80,24);
  1029.    TextColor(txtclr);
  1030.    TextBackground(txtback);
  1031.    GotoXY(mcol,mrow);
  1032.   END;
  1033.  {$R+,S+}
  1034.  
  1035.   PROCEDURE ChangeScr;
  1036.   VAR oldscrmode : Integer;
  1037.   BEGIN
  1038.    oldscrmode := scrmode;
  1039.    mcol := WhereX; mrow := WhereY;
  1040.    Window(40,13,80,24); { 2.0m }
  1041.    WindowFrame;
  1042.    GotoXY(3,2);
  1043.    Write('Screen Color(3), B/W(2), Mono(7):'); { 2.0d }
  1044.    REPEAT
  1045.     Read(Kbd, scrnmode);
  1046.    UNTIL scrnmode IN ['2','3','7'];
  1047.    IF scrnmode = '7' THEN
  1048.     scrmode := 7
  1049.    ELSE
  1050.     IF scrnmode = '2' THEN
  1051.      scrmode := 2
  1052.     ELSE
  1053.      IF scrnmode = '3' THEN
  1054.       scrmode := 3;
  1055.    GotoXY(3,4);
  1056.    Write('Text Color (0-15):');
  1057.    Readln(txtcolor);
  1058.    txtclr := Value(txtcolor);
  1059.    GotoXY(3,6);
  1060.    Write('Background Color (0-7): ');
  1061.    Readln(backcolor);
  1062.    txtback := Value(backcolor);
  1063.    GotoXY(3,8);
  1064.    Write('Status Text Color (0-15): ');
  1065.    Readln(txtcolor);
  1066.    statclr := Value(txtcolor);
  1067.    GotoXY(3,10);
  1068.    Write('Status Bkgrnd Color (0-7): ');
  1069.    Readln(backcolor);
  1070.    statbak := Value(backcolor);
  1071.    REPEAT           { 1.4 }
  1072.     answer := ' ';  { 1.6 }
  1073.     GotoXY(3,11);
  1074.     Write('Save settings to disk [Y/N]?');
  1075.     Read(Kbd, answer);
  1076.       answer := UpCase(answer);
  1077.    UNTIL answer IN ['Y', 'N'];
  1078.    IF answer = 'Y' THEN MakeConfig;     { 1.4 }
  1079.    ClrScr;
  1080.    IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  1081.    TextColor(txtclr);
  1082.    TextBackground(txtback);
  1083.    IF NOT biosvideo THEN DirectVideo := True; CheckSnow := False;
  1084.    ClrScr;
  1085.    IF scrmode <> oldscrmode THEN
  1086.     BEGIN
  1087.      TextMode(scrmode);
  1088.      IF NOT biosvideo THEN DirectVideo := True; CheckSnow := False; { 2.0q }
  1089.      newscr := True;
  1090.     END
  1091.    ELSE
  1092.     GotoXY(mcol,mrow);
  1093.    Newstatus := True;          { 1.4 }
  1094.   END;
  1095.  
  1096.   FUNCTION ReadPhoneList : Integer;
  1097.   BEGIN
  1098.     Assign(PhoneFile, 'TMODEM.PHN');       { 1.5 }
  1099.     index := 0;
  1100.     {$I-} Reset(PhoneFile); {$I+}
  1101.     IF IOResult = 0 THEN
  1102.      BEGIN
  1103.       WHILE (NOT EoF(PhoneFile)) AND (index < 21) DO { 2.0f }
  1104.        BEGIN
  1105.         index := index+1;
  1106.         ReadLn(PhoneFile, PhoneList[index]);
  1107.        END;
  1108.       Close(PhoneFile);
  1109.      END;
  1110.     ReadPhoneList := index;
  1111.    {$I-} Close(PhoneFile);{$I+}
  1112.    err := IORESULT;
  1113.   END;
  1114.  
  1115.   PROCEDURE Add2PhoneLst;                 { 1.5 }
  1116.   VAR index, ln : Integer;  fname, fnum : PhoneStr; fspeed :Char;
  1117.       done, waslist : Boolean; phoneline : PhoneEntry;
  1118.   BEGIN
  1119.    Assign(PhoneFile, 'TMODEM.PHN');       { 1.5 }
  1120.    done := False; exitphone := False; { 2.0e }
  1121.    index := 0;
  1122.    pnumbers := index;
  1123.    waslist := False;
  1124.    {$I-} Reset(PhoneFile); {$I+}
  1125.    IF IOResult = 0 THEN
  1126.     BEGIN
  1127.      waslist := True;
  1128.      ln := 3;
  1129.      GotoXY(3,ln);
  1130.      WHILE (NOT EoF(PhoneFile))  DO
  1131.       BEGIN
  1132.        index := index+1;
  1133.        ReadLn(PhoneFile, PhoneList[index]);
  1134.        ln := ln+1;
  1135.        GotoXY(3,ln);
  1136.        Pnumbers := Index;
  1137.       END;
  1138.      Close(PhoneFile);
  1139.     END;
  1140.     BEGIN
  1141.      REPEAT
  1142.       IF (NOT waslist) THEN
  1143.        BEGIN
  1144.         GotoXY(3,3);
  1145.         ln := 3;
  1146.        END
  1147.       ELSE
  1148.        ln := whereY;
  1149.       Gotoxy(3,4);  Write('                                    ');
  1150.       Gotoxy(3,5);  Write('                                    ');
  1151.       Gotoxy(3,6);  Write('                                    ');
  1152.       Gotoxy(3,7);  Write('                                    ');
  1153.       GotoXY(3,4);  ln := 4;
  1154.       Writeln('Enter information or <CR> to quit!');
  1155.       ln := ln+1;
  1156.       GotoXY(3,ln);
  1157.       Write('Name:');
  1158.       readln(fname);
  1159.       ln := ln+1;
  1160.       IF length(fname) > 1 THEN
  1161.        BEGIN
  1162.         index := index +1;
  1163.         pnumbers := index;
  1164.         phoneline := ' ';
  1165.         GotoXY(3,ln);  ln := ln+1;
  1166.         Write('PHONE#:'); readln(fnum);
  1167.         GotoXY(3,ln); ln := ln+1;
  1168.         Write('3)00, 1)1200, 2)400, 9)600:'); { 2.0e }
  1169.         readln(fspeed);
  1170.         phoneline := fname;
  1171.         phoneline := phoneline+'. '+fnum;
  1172.         REPEAT
  1173.           phoneline := phoneline+' ';
  1174.         UNTIL length(phoneline) = 32;
  1175.         phoneline[32] := fspeed;
  1176.         Phonelist[index] := phoneline;
  1177.         done := True;
  1178.        END
  1179.       ELSE
  1180.        BEGIN
  1181.         done := True;
  1182.         exitphone := True; { 2.0e }
  1183.        END;
  1184.      UNTIL done;
  1185.     END;
  1186.    {$I-} Close(PhoneFile); {$I+}
  1187.    err := IORESULT;
  1188.   END;
  1189.  
  1190.   PROCEDURE SavePhoneLst;                 { 1.5 }
  1191.   BEGIN
  1192.    Assign(PhoneFile, 'TMODEM.PHN');       { 1.5 }
  1193.    index := 0;
  1194.  
  1195.    {$I-} Rewrite(PhoneFile); {$I+}
  1196.    err := IORESULT;
  1197.    Close(phonefile);
  1198.  
  1199.    {$I-} Reset(PhoneFile); {$I+}
  1200.    IF IOResult = 0 THEN
  1201.     BEGIN
  1202.    {$I-} Append(PhoneFile); {$I+}
  1203.      WHILE (index < pnumbers) DO
  1204.       BEGIN
  1205.        index := index+1;
  1206.        WriteLn(PhoneFile, PhoneList[index]);
  1207.       END;
  1208.     END;
  1209.    {$I-} Close(PhoneFile); {$I+}
  1210.    err := IORESULT;
  1211.   END;
  1212.  
  1213.   PROCEDURE Call;
  1214.   VAR rc : String[2]; selection, i, j, k : Integer; PhoneNo : PhoneStr;
  1215.       ans : Char; cdone : boolean; lrow, lcol : Integer; { 2.0f }
  1216.   BEGIN
  1217.     N_Phones := ReadPhoneList;
  1218.     IF N_Phones > 0 THEN
  1219.      BEGIN
  1220.       mcol := WhereX; mrow := WhereY;
  1221.       Window(38,1,80,24); { 2.0f }
  1222.       LargeWindow;
  1223.       Cdone := False;
  1224.       lcol := 3;
  1225.       lrow := 2;
  1226.       GotoXy(lcol,lrow); {2.0f}
  1227.       FOR i := 1 TO N_Phones DO
  1228.       BEGIN
  1229.        Writeln(Chr(i+64), ' - ', PhoneList[i]);
  1230.        INC(lrow); GotoXY(lcol,lrow);
  1231.       END;
  1232.       Selection := 0;
  1233.       GotoXY(lcol,21);
  1234.       Write('Item to Dial or <CR> to EXIT:'); { 2.0m }
  1235.       REPEAT
  1236.        Readln(rc);
  1237.        ans := rc[1];
  1238.        ans := UpCase(ans);
  1239.        IF (rc = '') THEN
  1240.         cdone := True        { 1.5 }
  1241.        ELSE
  1242.         selection := Ord(ans)-Ord('@');
  1243.       UNTIL (selection IN [1..N_Phones]) OR cdone;
  1244.       ClrScr;
  1245.       IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24); { 2.0o }
  1246.       IF (NOT cdone) AND (PhoneList[selection][32] > #48) THEN { 2.0h }
  1247.        BEGIN
  1248.         ClrScr; { 2.0p }
  1249.         baudrate := PhoneList[selection][32];
  1250.         Setup(baudrate);
  1251.         StatusLine; { 2.0i }
  1252.         j := 30;
  1253.         PhoneNo := '';
  1254.         WHILE PhoneList[selection][j] <> '.' DO
  1255.          j := j-1;
  1256.         phonename := copy(phonelist[selection],1,j-1); { 2.0h }
  1257.         FOR k := j+1 TO 30 DO { 2.0f }
  1258.         PhoneNo := PhoneNo+PhoneList[selection][k];
  1259.         rc := Dial(PhoneNo);
  1260.        END
  1261.       ELSE
  1262.        BEGIN { 2.0f }
  1263.         GotoXY(mcol,mrow);
  1264.        END;
  1265.      END;
  1266.   END;
  1267.  
  1268.   PROCEDURE ChangePhoneLst; { 2.0h }
  1269.   VAR rc : String[2]; selection, i, j, k : Integer; PhoneNo : PhoneStr;
  1270.       ans : Char; cdone : boolean; lrow, lcol : Integer; { 2.0f }
  1271.   BEGIN
  1272.     N_Phones := ReadPhoneList;
  1273.     pnumbers := index; { 2.0h }
  1274.     IF N_Phones > 0 THEN
  1275.      BEGIN
  1276.       mcol := WhereX; mrow := WhereY;
  1277.       Window(38,1,80,24); { 2.0f }
  1278.       LargeWindow;
  1279.       Cdone := False;
  1280.       lcol := 3;
  1281.       lrow := 2;
  1282.       GotoXy(lcol,lrow); {2.0f}
  1283.       FOR i := 1 TO N_Phones DO
  1284.       BEGIN
  1285.        Writeln(Chr(i+64), ' - ', PhoneList[i]);
  1286.        INC(lrow);
  1287.        GotoXY(lcol,lrow);
  1288.       END;
  1289.       Selection := 0;
  1290.       GotoXY(2,21);
  1291.       FOR i := 1 TO 40 DO Write(' ');
  1292.       GotoXY(2,21);
  1293.       Write('Selection to Change or <CR> to EXIT:'); { 2.0f }
  1294.       REPEAT
  1295.        Readln(rc);
  1296.        ans := rc[1];
  1297.        ans := UpCase(ans);
  1298.        IF (rc = '') THEN
  1299.         cdone := True        { 1.5 }
  1300.        ELSE
  1301.         selection := Ord(ans)-Ord('@');
  1302.       UNTIL (selection IN [1..N_Phones]) OR cdone;
  1303.  
  1304.       IF (NOT cdone) AND (PhoneList[selection][32] > #48) THEN
  1305.        BEGIN
  1306.         baudrate := PhoneList[selection][32];
  1307.         j := 30;
  1308.         PhoneNo := '';
  1309.         WHILE PhoneList[selection][j] <> '.' DO
  1310.          j := j-1;
  1311.         phonename := copy(phonelist[selection],1,j-1); { 2.0h }
  1312.         FOR k := j+1 TO 30 DO { 2.0f }
  1313.          PhoneNo := PhoneNo+PhoneList[selection][k];
  1314.        END;
  1315.  
  1316.       IF NOT cdone THEN
  1317.        BEGIN
  1318.         GotoXY(2,21);
  1319.         FOR i := 1 TO 40 DO Write(' ');
  1320.         GotoXY(3,21);
  1321.         Write('Name Or <CR> to clear:'); Readln(phonename);
  1322.         IF phonename <> '' THEN
  1323.          BEGIN
  1324.           GotoXY(2,21);
  1325.           FOR i := 1 TO 40 DO Write(' ');
  1326.           GotoXY(3,21);
  1327.           Write('Phone#:'); Readln(PhoneNo);
  1328.           GotoXY(2,21);
  1329.           FOR i := 1 TO 40 DO Write(' ');
  1330.           GotoXY(2,21);
  1331.           Write('Baud? 3)00, 1)200, 2)400, 9)600:');
  1332.           Read(baudrate);
  1333.           PhoneList[Selection] := PhoneName+'. '+PhoneNo;
  1334.           While length(phonelist[selection]) < 31 DO
  1335.            PhoneList[selection] := Phonelist[selection]+' ';
  1336.           PhoneList[selection] := Phonelist[selection]+baudrate;
  1337.           SavePhoneLst;
  1338.          END
  1339.         ELSE
  1340.          BEGIN
  1341.           PhoneList[selection] := ' ';
  1342.            While length(phonelist[selection]) < 32 DO
  1343.           PhoneList[selection] := PhoneList[selection]+' ';
  1344.           SavePhoneLst;
  1345.          END;
  1346.        END;
  1347.      END
  1348.     ELSE
  1349.       BEGIN { 2.0f }
  1350.        clrscr;
  1351.        IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  1352.        GotoXY(mcol,mrow);
  1353.       END;
  1354.   END;
  1355.  
  1356.   PROCEDURE UsePhone;          { 1.5 }
  1357.   VAR ddone : Boolean;
  1358.   BEGIN
  1359.    ddone := False;
  1360.    REPEAT
  1361.     REPEAT
  1362.      GotoXY(3,4);
  1363.      Write('D)ial, A)ddToLst, C)hangeLst, Q)uit:'); { 2.0h }
  1364.      Read(Kbd, answer); answer := upcase(answer);
  1365.     UNTIL answer IN ['D', 'A', 'C', 'Q']; { 2.0h }
  1366.     IF answer = 'D' THEN
  1367.      BEGIN
  1368.       Ddone := True;
  1369.       Callout := True;
  1370.      END
  1371.     ELSE
  1372.      IF answer = 'A'THEN
  1373.       BEGIN
  1374.        Add2PhoneLst;
  1375.        IF exitphone THEN BEGIN ddone := True; exitphone := False; END; { 2.0e }
  1376.        Callout := True; { 2.0h }
  1377.       END
  1378.      ELSE
  1379.       IF answer = 'Q' THEN
  1380.        BEGIN
  1381.         ddone := True;
  1382.         savescrn := True;  { 2.0p }
  1383.        END
  1384.       ELSE
  1385.        IF answer = 'C' THEN
  1386.         BEGIN
  1387.          ChangePhoneLst; { 2.0h }
  1388.          ddone := True;
  1389.          Callout := True; { 2.0h }
  1390.         END;
  1391.     IF (NOT ddone) THEN
  1392.      BEGIN
  1393.       REPEAT                          { 1.4 }
  1394.        answer := ' ';
  1395.        Gotoxy(3,11); Write('                                    ');
  1396.        GotoXY(3,11);
  1397.        Write('Save settings to disk [Y/N]?');
  1398.        Read(Kbd, answer);
  1399.        answer := UpCase(answer);
  1400.       UNTIL answer IN ['Y', 'N'];
  1401.       IF answer = 'Y' THEN
  1402.        BEGIN
  1403.         SavePhoneLst;
  1404.         ddone := True; { 2.0e }
  1405.        END;
  1406.       ddone := True; { 2.0e }
  1407.      END;
  1408.    UNTIL ddone;
  1409.   END;
  1410.  
  1411.   PROCEDURE DialMenu;       { 1.5 }
  1412.   BEGIN
  1413.    mcol := WhereX; mrow := WhereY;
  1414.    Window(40,13,80,24); { 2.0m }
  1415.    WindowFrame;
  1416.    GotoXY(3,2);  Write('   ----- TModem Dialing Menu -----  ');
  1417.    Gotoxy(3,4);  Write('                                    ');
  1418.    Gotoxy(3,5);  Write('                                    ');
  1419.    Gotoxy(3,6);  Write('                                    ');
  1420.    Gotoxy(3,7);  Write('                                    ');
  1421.    Gotoxy(3,8);  Write('                                    ');
  1422.    Gotoxy(3,9);  Write('                                    ');
  1423.    Gotoxy(3,10); Write('                                    ');
  1424.    Gotoxy(3,11); Write('                                    ');
  1425.    UsePhone;
  1426.    Clrscr;
  1427.    IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  1428.    GotoXY(mcol,mrow);
  1429.   END;
  1430.  
  1431.  PROCEDURE SetMacros; { 2.0i }
  1432.  VAR mfile : Text; dmac : MacStr; mnum : String[2]; index : Integer;
  1433.   BEGIN
  1434.    index := 1;
  1435.    Assign(mfile,'TMODEM.MAC');
  1436.    {$I-} Reset(mfile); {$I+}
  1437.    IF IORESULT = 0 THEN
  1438.     BEGIN
  1439.      WHILE NOT EOF(mfile) DO
  1440.       BEGIN
  1441.        Readln(mfile,dmac);
  1442.        MacArray[index] := dmac;
  1443.        INC(index);
  1444.       END;
  1445.     END
  1446.    ELSE
  1447.     BEGIN
  1448.      FOR index := 1 TO 10 DO
  1449.       BEGIN
  1450.        IF index < 10 THEN
  1451.         mnum := chr(index+48)
  1452.        ELSE
  1453.         mnum := '10';
  1454.        MacArray[index] := 'This is Macro'+mnum;
  1455.       END;
  1456.     END;
  1457.   END;
  1458.  
  1459. (* -----------------------------------------------
  1460.    This Procedure is NOT used! Left in as example!
  1461.  
  1462.  PROCEDURE WriteDos(VAR letter : Char); { 2.0i }
  1463.  VAR regs : Registers;
  1464.   BEGIN
  1465.    WITH regs DO
  1466.     BEGIN
  1467.      AH  := 2;
  1468.      DL := ord(letter);
  1469.     END;
  1470.    MSDOS(regs);
  1471.   END;
  1472.  ----------------------------------------------- *)
  1473.  
  1474.  {$R-,S-,B-}
  1475.   PROCEDURE terminal;  { This is the main loop must be faaassst! }
  1476.   VAR s, cnt : integer; c, ans, tinkey : char; regs : Registers; { 2.0j }
  1477.       t, nrow : Byte; { 2.0o }
  1478.   BEGIN
  1479.    WITH regs DO AH := 2; { Make sure we call DOS function 2! 2.0j }
  1480.    IF useansi THEN Window(1,1,80,25) ELSE window(1,1,80,24); { 2.0l }
  1481.    REPEAT
  1482.     IF newstatus THEN Statusline;
  1483.     IF Callout THEN                { 1.5 }
  1484.      BEGIN
  1485.       callout := False;
  1486.       call;                        { call the selected number }
  1487.      END;
  1488.     REPEAT                         { 1.2 }
  1489.      s := port[outport];
  1490.      IF buffer_Count > 0 THEN  { 2.0e }
  1491.       BEGIN           { changed to NOT use cinkey 2.0h }
  1492.        inline($FA);
  1493.        tinkey := RecBuf[buffer_Tail];
  1494.        IF Buffer_Tail < Buffer_End THEN
  1495.         INC(Buffer_Tail)
  1496.        ELSE
  1497.         Buffer_Tail := 1;
  1498.        DEC(buffer_count);
  1499.        inline($FB);
  1500.        t := ord(tinkey);
  1501.        IF (t = 12) THEN   { 1.1 Clrscr? Is it an <FF>? 2.Oj }
  1502.         BEGIN { 2.0m }
  1503.          IF useansi THEN
  1504.           BEGIN
  1505.            Window(1,1,80,25);  { 2.0q }
  1506.            nrow := WhereY; { 2.0o }
  1507.            GotoXy(1,nrow+1); { 2.0o }
  1508.            WITH regs DO   
  1509.             BEGIN  { read cursor attribute next row down }
  1510.              AH := 8; BH :=0;
  1511.              Intr($10,regs);
  1512.              BEGIN
  1513.               GoToXY(1,1);
  1514.               BL := AH;
  1515.               CX := 2000; AH := 9; AL := 32;
  1516.               BH := 0;
  1517.              END;
  1518.              Intr($10,regs);
  1519.              GotoXY(1,1);
  1520.              AH := 2;
  1521.             END;
  1522.           END
  1523.          ELSE
  1524.          ClrScr;
  1525.         END
  1526.        ELSE
  1527.         BEGIN   { 2.0j }
  1528.          IF useansi THEN
  1529.           BEGIN { ANSI-BBS support code write characters via DOS }
  1530.            WITH regs DO DL := t;
  1531.            MSDOS(regs);
  1532.           END
  1533.          ELSE
  1534.           Write(tinkey); { write direct to screen }
  1535.         END;
  1536.       END;
  1537.     UNTIL buffer_count < 1;   { 2.0h }
  1538.     mcol := WhereX; mrow := WhereY;
  1539.     IF KeyPressed AND ((s AND $20) = $20) THEN
  1540.      BEGIN
  1541.       Read(Kbd, c);
  1542.       IF c <> #27 THEN Port[base] := Ord(c); { 2.0e }
  1543.       IF (c = #27) AND KeyPressed THEN
  1544.        BEGIN
  1545.         read(kbd, c);
  1546.         DEC(mcol); { put cursor back where it belongs 2.0f }
  1547.         CASE c OF  { 2.0h }
  1548.          #71 : termscrn;   { 1.1 Home = Help }
  1549.          #73 : Sendfile;   { 1.1 PgUp = Upload }
  1550.          #81 : Rcvfile;    { 1.1 PgDn = Download }
  1551.          #35 : HangItUp;   { 1.1 ALT-H = HangupPhone }
  1552.          #24 : Initialize; { 1.1 ALT-O = Options }
  1553.          #45 : BEGIN       { 2.0h ALT-X = Exit Terminal }
  1554.                 mcol := WhereX; mrow := WhereY; { 2.0p }
  1555.                 Window(40,22,80,24); { 2.0p }
  1556.                 SmallWindow;
  1557.                 GotoXy(3,2); { 2.0f }
  1558.                 Write('Exit TModem [Y/N]?'); { 2.0f }
  1559.                 Read(Kbd, ans); ans := upcase(ans);
  1560.                 IF ans = 'Y' THEN
  1561.                  done := True
  1562.                 ELSE
  1563.                  BEGIN
  1564.                   ClrScr;
  1565.                   IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  1566.                   GotoXY(mcol,mrow);
  1567.                  END;
  1568.                END;
  1569.          #23 : InfoScr;    { ALT-I = Info Screen }
  1570.          #31 : ChangeScr;  { ALT-S = Change Screen  1.1 }
  1571.          #32 : DialMenu;   { ALT-D = dialing menu 1.5 }
  1572.          #36 : JumpDos;    { ALT-J = JumpDos 2.0c }
  1573.          #46 : BEGIN ClrScr; StatusLine; END; { ALT-C = clearscreen 2.0J }
  1574.          #59 : SendText(MacArray[1]+cr); { F1 = Macro1 } { 2.0i }
  1575.          #60 : SendText(MacArray[2]+cr); { F2 = Macro1 }
  1576.          #61 : SendText(MacArray[3]+cr); { F3 = Macro1 }
  1577.          #62 : SendText(MacArray[4]+cr); { F4 = Macro1 }
  1578.          #63 : SendText(MacArray[5]+cr); { F5 = Macro1 }
  1579.          #64 : SendText(MacArray[6]+cr); { F6 = Macro1 }
  1580.          #65 : SendText(MacArray[7]+cr); { F7 = Macro1 }
  1581.          #66 : SendText(MacArray[8]+cr); { F8 = Macro1 }
  1582.          #67 : SendText(MacArray[9]+cr); { F9 = Macro1 }
  1583.          #68 : SendText(MacArray[10]+cr); { F10 = Macro1 }
  1584.          #30 : BEGIN { ALT-A Toggle ANSI mode 2.0l }
  1585.                 UseAnsi := NOT UseAnsi;
  1586.                 IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
  1587.                 Clrscr; newscr := True;
  1588.                END;
  1589.          #47 : StatusLine; { ALT-V view StatusLine 2.0m }
  1590.         END;
  1591.         IF newscr THEN BEGIN GoToXY(1,1); NewScr := False; END; { 2.0h }
  1592.        END;
  1593.      END;
  1594.    UNTIL done;
  1595.   END;
  1596.  {$R+,S+,B+}
  1597.  
  1598.  BEGIN  {TModem}
  1599.   IF mem[$0000:$0449] = 7 THEN
  1600.    BEGIN
  1601.     TextMode(Mono);
  1602.     oldmode := 7;
  1603.     scrmode := 7; { 2.0o }
  1604.    END
  1605.   ELSE
  1606.    BEGIN
  1607.     Textmode(CO80); oldmode := 3;  scrmode := 3;
  1608.    END;
  1609.   biosvideo := True; { 2.0q }
  1610.   DirectVideo := False; CheckSnow := False; CheckBreak := False; { 2.0q }
  1611.   callout := False;
  1612.   useansi := False; { 2.0j }
  1613.   done := False;      { 1.1 }
  1614.   andwith := 255; { allow full IBM ASCII set 2.0}
  1615.   Assign(cfile, 'TMODEM.CFG');       { 1.4 }
  1616.   {$I-} Reset(cfile); {$I+}
  1617.   IF IORESULT = 0 THEN
  1618.    BEGIN
  1619.     Close(cfile);           { 1.5 }
  1620.     ReadConfig;
  1621.    END
  1622.   ELSE
  1623.    BEGIN
  1624.     {$I-} Close(cfile); {$I+}
  1625.     err := IORESULT;
  1626.     Writeln('TModem.cfg was NOT found! Building the file.'); { 2.0o }
  1627.     Delay(3000); { 2.0o }
  1628.     COMport := 1;
  1629.     baudrate := '1'; { 2.0o }
  1630.     txtclr := 15;
  1631.     IF scrmode = 3 THEN txtback := 1 ELSE txtback := 0; { 2.0o }
  1632.     IF scrmode = 3 THEN statbak := 4 ELSE statbak := 1; { 2.0o }
  1633.     IF scrmode = 3 THEN statclr := 14 ELSE statclr := 0; { 2.0o }
  1634.     initstrg := 'AT &C1 &D2 X4 S0=0 M0'; { 2.0e }
  1635.     dialstrg := 'ATDT';                   { 2.0n }
  1636.     videochc := 'BIOS';  { 2.0q }
  1637.     MakeConfig;          { 1.4 }
  1638.    END;
  1639.   Newstatus := True;   { 1.1 }
  1640.   NewScr := False;     { 1.4 }
  1641.   mcol := 1;           { 1.6 }
  1642.   mrow := 1;           { 1.6 }
  1643.   TextMode(scrmode);
  1644.   TextColor(txtclr);
  1645.   TextBackground(txtback);
  1646.   IF NOT biosvideo THEN DirectVideo := True; CheckSnow := False; { 2.0q }
  1647.   Window(1,25,80,25);         { 1.1 Define status line }
  1648.   TextColor(statclr);
  1649.   TextBackground(statbak);
  1650.   Clrscr;
  1651.   Window(1,1,80,24);         { 1.1 Define main screen }
  1652.   TextColor(txtclr);
  1653.   TextBackground(txtback);
  1654.   Clrscr;
  1655.   XlateSetup; { 2.0i }
  1656.   iport1;
  1657.   GetIntVec(Async_irq+8, AsyncVector);
  1658.   iport;
  1659.   init1;
  1660.   ResetModem;  { 2.0b }
  1661.   SetMacros;   { 2.Oi }
  1662.   Terminal;    { 1.1  this is the main loop for TModem }
  1663.   remove_port; delay(500);
  1664.   SetIntVec(Async_irq+8,AsyncVector);
  1665.   MsDos(regs);
  1666.   TextColor(7);
  1667.   TextBackGround(0);
  1668.   ClrScr;
  1669.   Window(1,1,80,25);    { 1.1 }
  1670.   IF oldmode = 7 THEN  { 2.0q }
  1671.    textmode(mono)
  1672.   ELSE
  1673.    IF oldmode = 3 THEN
  1674.     textmode(CO80)
  1675.    ELSE
  1676.     IF oldmode = 2 THEN
  1677.      textmode(BW80);
  1678.   ClrScr;
  1679.  END.
  1680.