home *** CD-ROM | disk | FTP | other *** search
- PROGRAM TURBO_Modem;
- {$R+}
- {$S+}
- {$V-}
- {$M 16000, 1000,1000} { 2.0q }
-
- USES Dos, Crt, Turbo3;
-
- (* --------------------------------------------------
- Written by Jack M. Wierda Chicago Illinois
- Modified by Steve Freeman
- From 6 JAN 86 mods by L.B. Neal
-
- 2-25-87 Still not complete but a improvements made
- and a core of concepts for someone to go
- further.
- l.b. Neal - Sunnyvale,CA
-
- UPGRADES:
- 1. Increase communications options.
- 3. Adjustable text mode and colors.
-
- 11-26-88 Ver: 1.1
-
- 1. Major loop restructure. - ok -
- 2. Added 2400 baud. - ok -
- 3. Added: - ok -
- a. HOME = Help
- b. PgUp = Upload
- c. PgDn = Download
- d. ALT-X = EXIT TMODEM
- e. ALT-O = Options.
- f. ALT-S = Screen Colors
- g. ALT-H = Hangup
- h. ALT-I = TMODEM Information.
- 4. Window for functions. - ok -
- 5. Adjusted XMODEM DL for longer interface time. - problems! -
- 6. Allowed TModem to receive full "IBM" ASCII char set. - ok -
- 7. TModem now recognizes <FF> for ClrScr. - ok -
- 8. Added status line on bottom of screen. - ok -
- 9. Big choice of colors - screen and status line. - ok -
-
- 11-28-88 Ver: 1.2
-
- 1. A little more speed - adjusted LiveTerminal main loop.
- 2. COM2: still refuses to receive, transmit seems ok. { Working at it. }
- 3. XMODEM receive now seems ok.
- 4. HANGUP doesn't work real well.
-
- 11-29-88 Ver: 1.3
-
- 1. Fixed exit sequence.
-
- 12-01-88 1.4
-
- 1. Added Configuration file TMODEM.CFG - colors and COMM info.
-
- 12-12-88 1.5
-
- 1. Got the dialing dir to work.
- 2. Can save phone numbers to TMODEM.PHN
- 3. Can't delete numbers from TMODEM.PHN
-
- 04-11-89 1.6
- 1. Clean up a few oops!
- 2. More work on Auto-dialing may be better now.
- 3. Tried to resolve hangup problem.
- 4. Added modem initialization. ( See PROCEDURE ResetModem )
- 5. Changed the interface when doing auto-dial.
-
- LANGUAGE: TURBO Pascal 3.01A or 3.02a.
- This program is in the public domain.
-
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 09-26-89 2.0c
- 1. Convert to TURBO Pascal 5.0!
- 2. Comm port 1,2,3,4 supported.
- 3. 300 thru 9600 baud supported.
- 4. External Protocol Support.
- 5. J)ump to DOS added.
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- 09-27-89 2.0d/2.0e
- 1. Fixed screen arrow garbage.
- 2. Fixed EXIT dial routine.
- 3. General cleanup.
- 4. More speed.
- 5. Fixed JUMPDOS.BAT.
- 6. Changed timing.
- 7. Added modem init string to TMODEM.CFG.
-
- 09-28-89 2.0f
- 1. Added verification of quit TModem.
- 2. Modified status line.
- 3. Moved windows further away from main screen.
- 4. Added SmallWindow.
- 5. Deleted ANS mode.
-
- 09-28-89 2.0g
- 1. Corrected screen change menu.
-
- 09-30-89 2.0h
- 1. Added user clearscreen option. ( For my goofs! )
- 2. Optimized Terminal loop.
- 3. Increased wait for connect time.
- 4. Faster windows.
- 5. Added abort for connect wait.
- 6. Show name calling when dialing.
- 7. Can clear or modify entry in dialing directory.
-
- 10-01-89 2.0i
- 1. Added F1-F10 macro capability - see MACRO.DOC!!
- 2. Corrected modem speed initialization.
- 3. Modem speed changes when dialing.
- 4. Adjusted Help Screen.
- 5. Change options will change baud!
-
- 10-01-89 2.0j
- 1. Added ANSI support. ANSI.SYS required!!!
- 2. Added ANSI status to statusline.
-
- 10-01-89 2.0k
- 1. Cleanup after ANSI.
-
- 10-01-89 2.0l
- 1. More ANSI side-effect cleanup.
-
- 10-02-89 2.0m
- 1. More attention to ANSI/NON-ANSI states.
- 2. Added ALT-V to View statusline.
- 3. Fixed ANSI-BBS ClrScr with help K. Burkhart.
- 4. Rearranged HELP screen.
-
- 10-03-89 2.0n
- 1. Added Dial String to TModem.cfg.
- 2. Fixed C)rcXmodem call to XMx.BAT.
-
- 10-03-89 2.0o
- 1. Improved ANSI tracking scheme for triggering on cursor color.
- 2. Better screen clear before dialing.
- 3. Deleted TMODEM.CFG from ZIP and set defaults to test for video
- card and set accordingly. Also COM1: and 1200 baud default.
-
- 10-04-89 2.0p
- 1. Better return from windows. (Finally!).
-
- 10-06-89 2.0q
- 1. Address video mode on Exit TModem.
- 2. Single "A" to abort dialing.
- 3. Isuue message and kick modem if abort.
- 4. Better tracking in ANSI mode.
- 5. Smaller memory requirements.
- 6. DirectVideo or BIOS option for screen.
-
- 10-09-89 2.0r
- 1. New protocol selection window.
- 2. Added TallWindow procedure.
- 3. Corrected problem with protocol procedure.
- 4. Changed filename winddow to smallwindow.
-
- This program was basically a re-write in TURBO Pascal of Ward Christensen's
- Modem Program which was distributed in CP/M User's Group Volume 25. Identical
- and compatible options were provided to allow this program to work directly
- with XMODEM running under CP/M.
- ----------------------------------------------------------------------- *)
-
- CONST
- Version = '2.0r(09-OCT-89)';
- MaxPhoneNums = 20; { 2.0h }
- Buffer_Max = 5121; { 2.0 }
- Buffer_End = Buffer_Max-1; {2.0}
- Dsaves : Integer = 0; {2.0}
- cr = #$0D; { ^M = CR }
-
- TYPE
- maxstr = STRING[255];
- str90 = STRING[90]; { 2.0c }
- PhoneEntry = STRING[32];
- PhoneStr = STRING[20];
- filename = STRING[20]; { 2.0c }
- Str2 = String[2]; { 1.1 }
- MacStr = String[32]; { 2.0i }
- hexstr = STRING[4];
- SmallStr = STRING[10]; { 2.Oi }
-
- VAR
- cfile, PhoneFile : Text; { 1.4 }
- PhoneList : ARRAY[1..MaxPhoneNums] OF PhoneEntry;
- option, hangup, baudrate, scrnmode : Char;
- txtcolor, backcolor : String[2]; { 1.1}
- portnum, answer : Char;
- base, N_Phones, pnumbers : Integer; { 1.5 }
- scrmode, bauds, txtclr, txtback : Integer;
- callout : Boolean;
- COMport : Integer;
- done : Boolean; { 1.1 }
- newscr, newstatus, options : Boolean; { 1.4 }
- speed, cport, cmode : String[8]; { 1.1 }
- mrow, mcol : Byte; { 2.0o }
- statclr, statbak : Integer; { 1.1 }
- RecBuf : ARRAY[1..Buffer_Max] of Char; {2.0}
- outport : Integer; {2.0}
- Buffer_head, Buffer_Tail, Buffer_Count : Word; {2.0}
- Async_Irq : Byte; { 2.0 }
- regs : Registers; {2.0}
- andwith : Byte; {2.0}
- AsyncVector : Pointer; {2.0}
- err : Integer; {2.0}
- meth,way : Char; { 2.0c }
- initstrg : Str90; { 2.0e }
- exitphone : Boolean; { 2.0e }
- phonename : Str90; { 2.0h }
- index : Integer; { 2.0h }
- MacArray : ARRAY[1..10] of MacStr; { 2.0i }
- useansi : Boolean; { 2.0j }
- ansistat : String[4]; { 2.0j }
- oldmode : Byte; { 2.0m }
- dialstrg : PhoneEntry; { 2.0n }
- junk : char; { 2.0o }
- savescrn : Boolean; { 2.0p }
- biosvideo : Boolean; { 2.0q }
- videochc : String[8]; { 2.0g }
-
- PROCEDURE set_baud(r:integer);
- VAR a : byte; rw : word;
- BEGIN
- IF (r >= 300) AND (r <= 9600) THEN
- BEGIN
- IF r = 2400 THEN rw := 48
- ELSE IF r = 1200 THEN rw := 96
- ELSE IF r = 9600 THEN rw := 6 { really 19200 baud }
- ELSE IF r = 300 THEN rw := 384;
- a := port[base+3] OR 128;
- port[base+3] := a;
- port[base] := lo(rw);
- port[base+1] := hi(rw);
- port[base+3] := a AND 127;
- END
- ELSE
- BEGIN
- Writeln('Invalid Baud Rate = ', r); { 2.0i }
- Halt(1);
- END;
- END;
-
- {$R-,S-}
- PROCEDURE async_isr; Interrupt;
- BEGIN
- Inline($FB); {STI}
- RecBuf[Buffer_Head] := Char(Port[Base]);
- IF (Buffer_Head = Buffer_End) THEN Buffer_Head := 1 ELSE INC(Buffer_Head,1);
- INC(Buffer_Count,1);
- Inline($FA); {CLI}
- Port[$20] := $20;
- END;
-
- procedure dump;
- begin
- Inline($FA); {CLI}
- buffer_head := 1;
- buffer_tail := 1;
- buffer_count := 0;
- Inline($FB); {STI}
- end;
-
- procedure remove_port;
- var i,m : Word;
- begin
- inline($FA); {CLI}
- i := port[$21];
- m := 1 SHL Async_Irq;
- port[$21] := i OR m;
- port[base+2] := 0;
- port[base+4] := port[base+4] AND 1;
- inline($FB); {STI}
- end;
-
- procedure term_ready(s:Boolean);
- var x:byte;
- begin
- x := port[base+4] and $FE;
- if s then x := x+1;
- port[base+4] := x;
- end;
-
- PROCEDURE iport1;
- BEGIN
- CASE comport OF
- 1 : begin
- base := $3f8;
- Async_Irq := 4;
- cport := 'COM1:';
- end;
- 2 : begin
- base := $2f8;
- Async_Irq := 3;
- cport := 'COM2:';
- end;
- 3 : begin
- base := $3E8;
- Async_Irq := 4;
- cport := 'COM3:';
- end;
- 4 : begin
- base := $2E8;
- Async_Irq := 3;
- cport := 'COM4:';
- end;
- END;
- outport := Base+5;
- END;
-
- procedure iport;
- var i,m:Integer;
- BEGIN
- dsaves := DSeg;
- If (Port[2+base] and $00F8) <> 0 Then
- begin
- writeln('Illegal com port number:',cport);
- halt;
- end
- else
- begin
- buffer_Head := 1;
- buffer_Tail := 1;
- buffer_Count := 0;
- port[base+3]:= $03;
- with regs do
- begin
- ah := $25; al := async_irq+8;
- ds := cseg;
- dx := ofs(async_isr); msdos(regs);
- end;
- inline($FA);
- i := port[5+base];
- i := port[base];
- i := port[$21];
- m := (1 shl Async_Irq) xor $00FF;
- port[$21] := i and m;
- port[1+base] := $01;
- i := port[4+base];
- port[4+base] := i or $08;
- term_ready(true);
- inline($FB);
- end;
- end;
-
- FUNCTION value(i:str2):integer; Forward; {2.0}
-
- PROCEDURE Sendtext(Strg : str90); Forward; { 1.6 }
-
- PROCEDURE init1;
- VAR maxbaud, stat : Integer;
- BEGIN
- val(speed,maxbaud,stat); { 2.0i }
- Set_Baud(maxbaud);
- DELAY(500);
- IF maxbaud = 9600 THEN
- sendtext('AT'+cr)
- ELSE
- IF maxbaud = 2400 THEN
- sendtext('AT'+cr)
- ELSE
- IF maxbaud = 1200 THEN
- sendtext('AT'+cr)
- ELSE
- IF maxbaud = 300 THEN
- sendtext('AT'+cr);
- Delay(1000);
- dump;
- END;
-
- function commpressed : boolean;
- begin
- commpressed := buffer_Count > 0;
- end;
-
- FUNCTION Cinkey:char;
- VAR t:char;
- BEGIN
- IF Buffer_Count = 0 THEN
- t := #0
- ELSE
- BEGIN
- inline($FA);
- t := RecBuf[buffer_Tail];
- IF Buffer_Tail < Buffer_End THEN
- INC(Buffer_Tail)
- ELSE
- Buffer_Tail := 1;
- DEC(buffer_count);
- inline($FB);
- END;
- cinkey := chr(ord(t)); { 2.0b }
- END;
- {$R+,S+}
-
- (* ------ NOT used in TModem but left as an example -------
-
- FUNCTION hex(num : Integer) : hexstr;
- VAR i, j : Integer; h : STRING[16]; Str : hexstr;
- BEGIN
- Str := '0000'; h := '0123456789ABCDEF'; j := num;
- FOR i := 4 DOWNTO 1 DO
- BEGIN
- Str[i] := h[(j AND 15)+1];
- j := j SHR 4;
- END;
- hex := Str;
- END;
- ------------------------------------------------------------ *)
-
- FUNCTION value(i:str2):integer;
- VAR n,n1:integer;
- BEGIN
- val(i,n,n1);
- IF n1 <> 0 THEN
- BEGIN
- i := copy(i,1,n1-1);
- val(i,n,n1)
- END;
- value := n;
- IF i = '' THEN value := 0;
- END;
-
- PROCEDURE statusline; Forward;
-
- PROCEDURE JUMPDOS; { 2.0c }
- BEGIN
- Window(1,1,80,25);
- ClrScr;
- writeln; { 2.0q }
- writeln('Drop to DOS!'); { 2.0h }
- writeln('CAUTION: You MUST Exit from shell in TModem home directory!');
- write('Hit a key to continue!');
- REPEAT UNTIL Keypressed;
- ClrScr;
- SwapVectors;
- EXEC(GetEnv('comspec'),'/C JUMPDOS.BAT');
- SwapVectors;
- iport;
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24); { 2.0l }
- GotoXY(1,1);
- Writeln('TMODEM Terminal Mode!');
- statusline;
- GotoXY(1,2);
- END;
-
- PROCEDURE FileShell(efn : filename; meth, way : char); { 2.0c }
- VAR theway : filename; passdata : Str90; sport : Char;
- BEGIN
- CASE meth OF
- 'K': theway := 'K';
- 'M': theway := 'ML';
- 'J': theway := 'JM';
- 'T': theway := 'TY';
- 'W': theway := 'WX';
- 'X': theway := 'XM';
- 'Y': theway := 'YM';
- 'Z': theway := 'ZM';
- 'B': theway := 'BI';
- 'L': theway := 'LM';
- 'S': theway := 'SK';
- END;
- theway := theway+way+'.BAT';
- sport := chr(comport+48);
- passdata:= theway+' '+speed+' '+sport+' '+efn;
- EXEC(GetEnv('comspec'),'/C '+passdata);
- Delay(1000);
- iport;
- ClrScr;
- GotoXY(1,1);
- END;
-
- {$R-,S-}
- PROCEDURE Largewindow; { 2.0f }
- VAR i : Byte;
- BEGIN
- Clrscr; { 1.3 }
- GotoXY(1,1);
- Write(Chr(201));
- FOR i := 1 TO 40 DO Write(chr(205));
- Write(chr(187));
- Gotoxy(1,2); Write(chr(186)); Gotoxy(42,2); Write(chr(186));
- Gotoxy(1,3); Write(chr(186)); Gotoxy(42,3); Write(chr(186));
- Gotoxy(1,4); Write(chr(186)); Gotoxy(42,4); Write(chr(186));
- Gotoxy(1,5); Write(chr(186)); Gotoxy(42,5); Write(chr(186));
- Gotoxy(1,6); Write(chr(186)); Gotoxy(42,6); Write(chr(186));
- Gotoxy(1,7); Write(chr(186)); Gotoxy(42,7); Write(chr(186));
- Gotoxy(1,8); Write(chr(186)); Gotoxy(42,8); Write(chr(186));
- Gotoxy(1,9); Write(chr(186)); Gotoxy(42,9); Write(chr(186));
- Gotoxy(1,10); Write(chr(186)); Gotoxy(42,10); Write(chr(186));
- Gotoxy(1,11); Write(chr(186)); Gotoxy(42,11); Write(chr(186));
- Gotoxy(1,12); Write(chr(186)); Gotoxy(42,12); Write(chr(186));
- Gotoxy(1,13); Write(chr(186)); Gotoxy(42,13); Write(chr(186));
- Gotoxy(1,14); Write(chr(186)); Gotoxy(42,14); Write(chr(186));
- Gotoxy(1,15); Write(chr(186)); Gotoxy(42,15); Write(chr(186));
- Gotoxy(1,16); Write(chr(186)); Gotoxy(42,16); Write(chr(186));
- Gotoxy(1,17); Write(chr(186)); Gotoxy(42,17); Write(chr(186));
- Gotoxy(1,18); Write(chr(186)); Gotoxy(42,18); Write(chr(186));
- Gotoxy(1,19); Write(chr(186)); Gotoxy(42,19); Write(chr(186));
- Gotoxy(1,20); Write(chr(186)); Gotoxy(42,20); Write(chr(186));
- Gotoxy(1,21); Write(chr(186)); Gotoxy(42,21); Write(chr(186));
- Gotoxy(1,22); Write(Chr(200));
- FOR i := 1 TO 40 DO Write(chr(205)); Write(chr(188));
- END;
-
- PROCEDURE Tallwindow; { 2.0r }
- VAR i : Byte;
- BEGIN
- Clrscr; { 1.3 }
- GotoXY(1,1);
- Write(Chr(201));
- FOR i := 1 TO 20 DO Write(chr(205)); { 2.0r }
- Write(chr(187));
- Gotoxy(1,2); Write(chr(186)); Gotoxy(22,2); Write(chr(186));
- Gotoxy(1,3); Write(chr(186)); Gotoxy(22,3); Write(chr(186));
- Gotoxy(1,4); Write(chr(186)); Gotoxy(22,4); Write(chr(186));
- Gotoxy(1,5); Write(chr(186)); Gotoxy(22,5); Write(chr(186));
- Gotoxy(1,6); Write(chr(186)); Gotoxy(22,6); Write(chr(186));
- Gotoxy(1,7); Write(chr(186)); Gotoxy(22,7); Write(chr(186));
- Gotoxy(1,8); Write(chr(186)); Gotoxy(22,8); Write(chr(186));
- Gotoxy(1,9); Write(chr(186)); Gotoxy(22,9); Write(chr(186));
- Gotoxy(1,10); Write(chr(186)); Gotoxy(22,10); Write(chr(186));
- Gotoxy(1,11); Write(chr(186)); Gotoxy(22,11); Write(chr(186));
- Gotoxy(1,12); Write(chr(186)); Gotoxy(22,12); Write(chr(186));
- Gotoxy(1,13); Write(chr(186)); Gotoxy(22,13); Write(chr(186));
- Gotoxy(1,14); Write(chr(186)); Gotoxy(22,14); Write(chr(186));
- Gotoxy(1,15); Write(chr(186)); Gotoxy(22,15); Write(chr(186));
- Gotoxy(1,16); Write(chr(186)); Gotoxy(22,16); Write(chr(186));
- Gotoxy(1,17); Write(chr(186)); Gotoxy(22,17); Write(chr(186));
- Gotoxy(1,18); Write(chr(186)); Gotoxy(22,18); Write(chr(186));
- Gotoxy(1,19); Write(chr(186)); Gotoxy(22,19); Write(chr(186));
- Gotoxy(1,20); Write(chr(186)); Gotoxy(22,20); Write(chr(186));
- Gotoxy(1,21); Write(chr(186)); Gotoxy(22,21); Write(chr(186));
- Gotoxy(1,22); Write(Chr(200));
- FOR i := 1 TO 20 DO Write(chr(205)); Write(chr(188));
- END;
-
- PROCEDURE windowframe;
- VAR i : Byte;
- BEGIN
- Clrscr; { 1.3 }
- GotoXY(1,1);
- Write(Chr(201));
- FOR i := 1 TO 38 DO Write(chr(205));
- Write(chr(187));
- Gotoxy(1,2); Write(chr(186)); Gotoxy(40,2); Write(chr(186));
- Gotoxy(1,3); Write(chr(186)); Gotoxy(40,3); Write(chr(186));
- Gotoxy(1,4); Write(chr(186)); Gotoxy(40,4); Write(chr(186));
- Gotoxy(1,5); Write(chr(186)); Gotoxy(40,5); Write(chr(186));
- Gotoxy(1,6); Write(chr(186)); Gotoxy(40,6); Write(chr(186));
- Gotoxy(1,7); Write(chr(186)); Gotoxy(40,7); Write(chr(186));
- Gotoxy(1,8); Write(chr(186)); Gotoxy(40,8); Write(chr(186));
- Gotoxy(1,9); Write(chr(186)); Gotoxy(40,9); Write(chr(186));
- Gotoxy(1,10); Write(chr(186)); Gotoxy(40,10); Write(chr(186));
- Gotoxy(1,11); Write(chr(186)); Gotoxy(40,11); Write(chr(186));
- Gotoxy(1,12); Write(Chr(200));
- FOR i := 1 TO 38 DO Write(chr(205)); Write(chr(188));
- END;
-
- PROCEDURE Smallwindow;
- VAR i : Byte;
- BEGIN
- Clrscr; { 1.3 }
- GotoXY(1,1);
- Write(Chr(201));
- FOR i := 1 TO 38 DO Write(chr(205));
- Write(chr(187));
- Gotoxy(1,2); Write(chr(186)); Gotoxy(40,2); Write(chr(186));
- Gotoxy(1,3); Write(Chr(200));
- FOR i := 1 TO 38 DO Write(chr(205)); Write(chr(188));
- END;
-
- PROCEDURE termscrn; { 2.0m }
- BEGIN
- mcol := WhereX; mrow := WhereY; { 2.0p }
- Window(40,13,80,24); { 2.0m }
- WindowFrame;
- GotoXY(3,2); Write(' -- TModem Help -- ');
- Gotoxy(3,3); Write(' ');
- GotoXY(3,4); Write(' UPLOAD = PgUp DLOAD = PgDn ');
- Gotoxy(3,5); Write(' Dial = ALT-D Hangup = ALT-H ');
- Gotoxy(3,6); Write(' Options = ALT-O Macros = F1/F10 ');
- Gotoxy(3,7); Write(' Clrscrn = ALT-C Info = ALT-I ');
- Gotoxy(3,8); Write(' ViewStat = ALT-V ScrnChg = ALT-S ');
- Gotoxy(3,9); Write(' ANSI Tgl = ALT-A JumpDos = ALT-J ');
- Gotoxy(3,10); Write(' ');
- Gotoxy(3,11); Write(' EXIT = ALT-X ');
- REPEAT UNTIL Keypressed;
- Read(kbd, junk);
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24); { 2.0l }
- GotoXY(mcol,mrow);
- END;
- {$R+,S+}
-
- PROCEDURE SetDTR;
- BEGIN
- Port[base+4] := $09; { $3FC/$2FC DTR on and INT enabled}
- END;
-
- PROCEDURE HangUpPhone; {hang up by terminating the line}
- BEGIN
- Port[base+4] := 0;
- callout := False;
- END;
-
- PROCEDURE setup(brc :Char); Forward; { 1.1 }
-
- PROCEDURE HangItUp; { 1.6 }
- BEGIN
- sendtext('+++');
- delay(2000); { 1.6 }
- sendtext('ATH'+cr); { 1.6 }
- Setup(baudrate);
- END;
-
- {$R-,S-}
- PROCEDURE send(ch : Char);
- BEGIN
- WHILE (port[outport] AND 32) = 0 DO BEGIN END;
- port[base] := ord(ch);
- END;
- {$R+,S+}
-
- PROCEDURE ResetModem;
- BEGIN
- sendtext('ATZ'+cr); { 1.6 }
- delay(1500); { 1.6 }
- sendtext(initstrg+cr); { 2.0e }
- END;
-
- PROCEDURE XlateSetup;
- BEGIN
- CASE baudrate OF
- '1' : speed := '1200'; { 2.0b }
- '2' : speed := '2400';
- '3' : speed := ' 300';
- '9' : speed := '9600';
- END;
- CASE comport OF
- 1 : cport := 'COM1:';
- 2 : cport := 'COM2:';
- 3 : cport := 'COM3:';
- 4 : cport := 'COM4:';
- END;
- IF useansi THEN ansistat := 'OFF' ELSE ansistat := ' ON'; { 2.0j }
- END;
-
- PROCEDURE setup(brc :Char); { 1.1 major changes for statusline info }
- BEGIN
- baudrate := brc;
- IF baudrate = '1' THEN
- speed := '1200' { 1.1 }
- ELSE
- IF baudrate = '2' THEN
- speed := '2400' { 1.1 }
- ELSE
- IF baudrate = '3' THEN
- speed := ' 300' { 1.1 }
- ELSE
- IF baudrate = '9' THEN
- speed := '9600'; { 2.0 }
- CASE comport OF
- 1 : cport := 'COM1:';
- 2 : cport := 'COM2:';
- 3 : cport := 'COM3:';
- 4 : cport := 'COM4:';
- END;
- init1; { 2.0i }
- END;
-
- PROCEDURE MakeConfig; { 1. 4 }
- VAR fil : Text;
- BEGIN
- Assign(fil, 'TMODEM.CFG');
- {$I-} Rewrite(fil); {$I+}
- IF IORESULT <> 0 THEN
- BEGIN
- Write('OOPS! TMODEM Error making TMODEM.CFG.');
- {$I-} Close(fil);{$I+}
- err := IORESULT;
- Halt;
- END;
- Append(fil);
- CASE comport OF
- 1 : cport := 'COM1:';
- 2 : cport := 'COM2:';
- 3 : cport := 'COM3:';
- 4 : cport := 'COM4:';
- END;
- Writeln(fil, cport);
- CASE baudrate OF
- '1' : speed := '1200';
- '2' : speed := '2400';
- '3' : speed := ' 300';
- '9' : speed := '9600';
- END;
- Writeln(fil, speed);
- Writeln(fil, scrmode);
- Writeln(fil, txtclr);
- Writeln(fil, txtback);
- Writeln(fil, statclr);
- Writeln(fil, statbak);
- Writeln(fil, initstrg); { 2.0e }
- Writeln(fil, dialstrg); { 2.0n }
- Writeln(fil, videochc); { 2.0q }
- Close(fil);
- END;
-
- PROCEDURE ReadConfig; { 1. 4 }
- VAR fil : Text;
- BEGIN
- Assign(fil, 'TMODEM.CFG');
- {$I-} Reset(fil); {$I+}
- IF IORESULT = 0 THEN
- BEGIN
- Readln(fil, cport);
- Readln(fil, speed);
- Readln(fil, scrmode);
- Readln(fil, txtclr);
- Readln(fil, txtback);
- Readln(fil, statclr);
- Readln(fil, statbak);
- Readln(fil, initstrg);
- Readln(fil, dialstrg); { 2.0n }
- Readln(fil, videochc); { 2.0q }
- Close(fil);
- IF cport = 'COM1:' THEN
- COMport := 1
- ELSE
- IF cport = 'COM2:' THEN
- COMport := 2
- ELSE
- IF cport = 'COM3:' THEN
- COMport := 3
- ELSE
- IF cport = 'COM4:' THEN
- COMport := 4;
- IF speed = '2400' THEN
- baudrate := '2'
- ELSE
- IF speed = '1200' THEN
- baudrate := '1'
- ELSE
- IF speed = '9600' THEN
- baudrate := '9'
- ELSE
- IF speed = ' 300' THEN
- baudrate := '3';
- IF videochc = 'BIOS' THEN { 2.0q }
- biosvideo := True
- ELSE biosvideo := False;
- END
- ELSE
- BEGIN
- {$I-} Close(fil); {$I+}
- err := IORESULT;
- MakeConfig;
- END;
- END;
-
- PROCEDURE Initialize; { 1.1 major changes to support window }
- VAR done : Boolean;
- BEGIN
- done := False;
- mcol := WhereX; mrow := WhereY;
- Window(40,13,80,24); { 2.0m }
- WindowFrame;
- REPEAT
- REPEAT
- GotoXY(3,2); { 2.0n }
- Write('Baud - 3)00, 1)200, 2)400, 9)600:');
- Read(Kbd, baudrate);
- UNTIL baudrate IN ['1', '2', '3', '9'];
- Writeln;
- REPEAT
- GotoXY(3,4); { 2.0n }
- Write('Port(1,2,3,4):');
- Read(Kbd, portnum);
- UNTIL portnum IN ['1'..'4']; {2.0}
-
- GotoXY(3,6); { 2.0n }
- Writeln('DialString(max 32 chars)'); { 2.0n }
- GotoXY(3,7);
- Write(':');
- Readln(dialstrg);
-
- CASE portnum OF
- '1' : COMport := 1;
- '2' : COMport := 2;
- '3' : COMport := 3;
- '4' : COMport := 4;
- END;
-
- Xlatesetup; { 1.4 }
- GotoXY(3,8); Write(cport); { 1.4 }
- GotoXY(3,9); Write('BAUD: ', speed); { 1.4 }
- GotoXY(3,10); Write('DSTR: ',dialstrg); { 2.0n }
-
- REPEAT
- GotoXY(3,11);
- Write('Is this correct [Y/N]?');
- Read(Kbd, answer);
- answer := UpCase(answer);
- UNTIL answer IN ['Y', 'N'];
-
- IF answer = 'Y' THEN done:= True;
- UNTIL done;
-
- REPEAT { 1.4 }
- answer := ' ';
- GotoXY(3,11);
- Write('Save settings to disk [Y/N]?');
- Read(Kbd, answer);
- answer := UpCase(answer);
- UNTIL answer IN ['Y', 'N'];
-
- IF answer = 'Y' THEN
- MakeConfig; { 1.4 }
- iport1;
- GetIntVec(Async_irq+8, AsyncVector);
- iport;
- Setup(baudrate);
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- NewStatus := True;
- END;
-
- PROCEDURE InfoScr;
- BEGIN
- mcol := WhereX; mrow := WhereY;
- Window(40,13,80,24); { 2.0m }
- WindowFrame;
- GotoXY(3,2); Write(' ----- TModem INFO Screen ----- ');
- Gotoxy(3,4); Write(' ');
- Gotoxy(3,5); Write(' TModem is Public Domain ');
- Gotoxy(3,6); Write(' Version ',version,' '); { 2.0g }
- Gotoxy(3,7); Write(' Mods by L.B. Neal. ');
- Gotoxy(3,8); Write(' ');
- Gotoxy(3,9); Write(' ANSI Support is Working! ');
- Gotoxy(3,10); Write(' ');
- Gotoxy(3,11); Write(' <Hit a key to return to terminal> ');
- REPEAT UNTIL Keypressed;
- Read(kbd, junk); { 2.0o }
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
-
- PROCEDURE sendtext(Strg : Str90 ); { 1.6 }
- VAR i, size : Integer;
- BEGIN
- Size := ord(strg[0]);
- FOR i := 1 TO size DO send(Strg[i]); { 2.0b }
- END;
-
- FUNCTION Dial(PhoneNumber : PhoneStr) : Char; { 1.5 major changes }
- VAR c, ch : Char; t : real; { 2.0h }
- BEGIN
- GotoXY(1,1);
- Writeln; { 1.6 }
- Writeln('Dialing: ',phonename); { 2.0h }
- Write('Number:', PhoneNumber); { 1.6 }
- Delay(250);
- SetDTR;
- Delay(250);
- sendtext(dialstrg+PhoneNumber+cr); {2.0n }
- writeln; { 1.5 }
- Delay(1000);
- c := cinkey;
- c := Chr(0);
- REPEAT
- c := cinkey
- UNTIL (c = cr) OR (c = 'C'); { 1.5 }
- IF (c <> 'C') THEN { 1.5 }
- BEGIN { timing NOT speed needed here }
- Writeln;
- Writeln('Waiting for carrier.....<Hit "A" to abort>'); { 2.0q }
- t := 180*6500; { was 120*6500 - 2.0h }
- REPEAT
- t := t-1;
- IF commpressed THEN c := cinkey;
- IF keypressed THEN read(kbd,ch) ELSE ch := ' '; { 2.0q }
- IF (ch = 'A') OR (ch = 'a') THEN
- BEGIN Writeln('Aborting!'); sendtext(cr); t := 0; END; { 2.0q }
- UNTIL (c = 'C') OR (t < 1) OR (c = 'B') OR (c = 'N') OR { 2.0d }
- (c = '1') OR (c = '5') OR (c = '7') OR (c = '3'); { 1.6 }
- END;
- CASE c OF { 1.6 }
- 'C' : BEGIN write(c); c := 'G'; END;
- 'B' : BEGIN write(c); c := 'G'; END;
- 'N' : BEGIN write(c); c := 'G'; END;
- '1' : BEGIN write('CONNECT 300 or 2400'); c := 'G'; END;
- '3' : BEGIN writeln('NO CARRIER'); c := 'G'; END;
- '5' : BEGIN writeln('CONNECT 1200'); c := 'G'; END;
- '7' : BEGIN writeln('BUSY'); c := 'G'; END;
- END;
- IF (t = 0) AND (c <> 'G') THEN c := '9'; { 1.6 }
- Dial := c
- END;
-
- PROCEDURE GetProtocol;
- VAR Protocol : String[2]; { 2.0r }
- BEGIN
- protocol := ''; meth := 'Q';
- mcol := WhereX; mrow := WhereY;
- Window(58,3,80,24); { 2.0r }
- TallWindow; { 2.0r }
- GotoXY(3,2); Write('- Protocols -');
- GotoXY(3,4); Write('S)uperk');
- GotoXY(3,5); Write('J)modem');
- GotoXY(3,6); Write('Z)modem');
- GotoXY(3,7); Write('B)imodem');
- GotoXY(3,8); Write('L)ynx');
- GotoXY(3,9); Write('M)egalink');
- GotoXY(3,10); Write('Y)modem-1k');
- GotoXY(3,11); Write('T)rueYmodem');
- GotoXY(3,12); Write('W)xmodem');
- GotoXY(3,13); Write('K)ermit');
- GotoXY(3,14); Write('C)rcXmodem');
- GotoXY(3,15); Write('X)modem');
- GotoXY(3,16); Write('A)bort');
- GotoXY(3,21); Write('Selection:');
- Readln(protocol);
- IF protocol = '' THEN protocol := 'A'; { 2.0r }
- protocol := upcase(protocol[1]); { 2.0r }
- IF protocol = 'C' THEN protocol := 'X'; { 2.0n }
- IF (protocol = '') OR (protocol = 'A') THEN
- BEGIN
- meth := 'Q'
- END
- ELSE
- Meth := protocol[1]; { 2.0r }
- END;
-
- PROCEDURE SendFile; { 2.0c }
- VAR fname : Filename;
- BEGIN
- mcol := WhereX; mrow := WhereY;
- Window(40,22,80,24); { 2.0r }
- SmallWindow; { 2.0r }
- GotoXY(3,2); Write('File to Upload:');
- ReadLn(fname);
- IF fname = '' THEN
- BEGIN { 2.0e }
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
- IF fname <> '' THEN
- BEGIN
- way := 'S';
- ClrScr; { 2.0r }
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- GetProtocol;
- IF meth <> 'Q' THEN
- BEGIN
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- ClrScr;
- GotoXY(1,1);
- FileShell(fname, meth, way);
- END
- ELSE
- BEGIN
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
- END;
- statusline;
- END;
-
- PROCEDURE RcvFile; { 2.0c }
- VAR fname : Filename;
- BEGIN
- mcol := WhereX; mrow := WhereY;
- Window(40,22,80,24); { 2.0r }
- SmallWindow; { 2.0r }
- GotoXY(3,2); Write('File to Download:');
- ReadLn(fname);
- IF fname = '' THEN
- BEGIN { 2.0e }
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
- IF fname <> '' THEN
- BEGIN
- way := 'R';
- ClrScr; { 2.0r }
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- GetProtocol;
- IF meth <> 'Q' THEN
- BEGIN
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- ClrScr;
- GoToXY(1,1);
- FileShell(fname, meth, way);
- END
- ELSE
- BEGIN
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
- END;
- Statusline;
- END;
-
- {$R-,S-}
- PROCEDURE statusline; { Changed 1.4 }
- BEGIN
- IF useansi THEN ansistat := ' ON' ELSE ansistat := 'OFF'; { 2.0j }
- Window(1,25,80,25);
- TextColor(statclr);
- TextBackground(statbak);
- Clrscr; { 1.4 }
- Write(' TModem ',version,' <HOME> for Help! ANSI:',ansistat,' Baud:'+speed+' PORT:'+cport);
- Newstatus := False;
- Window(1,1,80,24);
- TextColor(txtclr);
- TextBackground(txtback);
- GotoXY(mcol,mrow);
- END;
- {$R+,S+}
-
- PROCEDURE ChangeScr;
- VAR oldscrmode : Integer;
- BEGIN
- oldscrmode := scrmode;
- mcol := WhereX; mrow := WhereY;
- Window(40,13,80,24); { 2.0m }
- WindowFrame;
- GotoXY(3,2);
- Write('Screen Color(3), B/W(2), Mono(7):'); { 2.0d }
- REPEAT
- Read(Kbd, scrnmode);
- UNTIL scrnmode IN ['2','3','7'];
- IF scrnmode = '7' THEN
- scrmode := 7
- ELSE
- IF scrnmode = '2' THEN
- scrmode := 2
- ELSE
- IF scrnmode = '3' THEN
- scrmode := 3;
- GotoXY(3,4);
- Write('Text Color (0-15):');
- Readln(txtcolor);
- txtclr := Value(txtcolor);
- GotoXY(3,6);
- Write('Background Color (0-7): ');
- Readln(backcolor);
- txtback := Value(backcolor);
- GotoXY(3,8);
- Write('Status Text Color (0-15): ');
- Readln(txtcolor);
- statclr := Value(txtcolor);
- GotoXY(3,10);
- Write('Status Bkgrnd Color (0-7): ');
- Readln(backcolor);
- statbak := Value(backcolor);
- REPEAT { 1.4 }
- answer := ' '; { 1.6 }
- GotoXY(3,11);
- Write('Save settings to disk [Y/N]?');
- Read(Kbd, answer);
- answer := UpCase(answer);
- UNTIL answer IN ['Y', 'N'];
- IF answer = 'Y' THEN MakeConfig; { 1.4 }
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- TextColor(txtclr);
- TextBackground(txtback);
- IF NOT biosvideo THEN DirectVideo := True; CheckSnow := False;
- ClrScr;
- IF scrmode <> oldscrmode THEN
- BEGIN
- TextMode(scrmode);
- IF NOT biosvideo THEN DirectVideo := True; CheckSnow := False; { 2.0q }
- newscr := True;
- END
- ELSE
- GotoXY(mcol,mrow);
- Newstatus := True; { 1.4 }
- END;
-
- FUNCTION ReadPhoneList : Integer;
- BEGIN
- Assign(PhoneFile, 'TMODEM.PHN'); { 1.5 }
- index := 0;
- {$I-} Reset(PhoneFile); {$I+}
- IF IOResult = 0 THEN
- BEGIN
- WHILE (NOT EoF(PhoneFile)) AND (index < 21) DO { 2.0f }
- BEGIN
- index := index+1;
- ReadLn(PhoneFile, PhoneList[index]);
- END;
- Close(PhoneFile);
- END;
- ReadPhoneList := index;
- {$I-} Close(PhoneFile);{$I+}
- err := IORESULT;
- END;
-
- PROCEDURE Add2PhoneLst; { 1.5 }
- VAR index, ln : Integer; fname, fnum : PhoneStr; fspeed :Char;
- done, waslist : Boolean; phoneline : PhoneEntry;
- BEGIN
- Assign(PhoneFile, 'TMODEM.PHN'); { 1.5 }
- done := False; exitphone := False; { 2.0e }
- index := 0;
- pnumbers := index;
- waslist := False;
- {$I-} Reset(PhoneFile); {$I+}
- IF IOResult = 0 THEN
- BEGIN
- waslist := True;
- ln := 3;
- GotoXY(3,ln);
- WHILE (NOT EoF(PhoneFile)) DO
- BEGIN
- index := index+1;
- ReadLn(PhoneFile, PhoneList[index]);
- ln := ln+1;
- GotoXY(3,ln);
- Pnumbers := Index;
- END;
- Close(PhoneFile);
- END;
- BEGIN
- REPEAT
- IF (NOT waslist) THEN
- BEGIN
- GotoXY(3,3);
- ln := 3;
- END
- ELSE
- ln := whereY;
- Gotoxy(3,4); Write(' ');
- Gotoxy(3,5); Write(' ');
- Gotoxy(3,6); Write(' ');
- Gotoxy(3,7); Write(' ');
- GotoXY(3,4); ln := 4;
- Writeln('Enter information or <CR> to quit!');
- ln := ln+1;
- GotoXY(3,ln);
- Write('Name:');
- readln(fname);
- ln := ln+1;
- IF length(fname) > 1 THEN
- BEGIN
- index := index +1;
- pnumbers := index;
- phoneline := ' ';
- GotoXY(3,ln); ln := ln+1;
- Write('PHONE#:'); readln(fnum);
- GotoXY(3,ln); ln := ln+1;
- Write('3)00, 1)1200, 2)400, 9)600:'); { 2.0e }
- readln(fspeed);
- phoneline := fname;
- phoneline := phoneline+'. '+fnum;
- REPEAT
- phoneline := phoneline+' ';
- UNTIL length(phoneline) = 32;
- phoneline[32] := fspeed;
- Phonelist[index] := phoneline;
- done := True;
- END
- ELSE
- BEGIN
- done := True;
- exitphone := True; { 2.0e }
- END;
- UNTIL done;
- END;
- {$I-} Close(PhoneFile); {$I+}
- err := IORESULT;
- END;
-
- PROCEDURE SavePhoneLst; { 1.5 }
- BEGIN
- Assign(PhoneFile, 'TMODEM.PHN'); { 1.5 }
- index := 0;
-
- {$I-} Rewrite(PhoneFile); {$I+}
- err := IORESULT;
- Close(phonefile);
-
- {$I-} Reset(PhoneFile); {$I+}
- IF IOResult = 0 THEN
- BEGIN
- {$I-} Append(PhoneFile); {$I+}
- WHILE (index < pnumbers) DO
- BEGIN
- index := index+1;
- WriteLn(PhoneFile, PhoneList[index]);
- END;
- END;
- {$I-} Close(PhoneFile); {$I+}
- err := IORESULT;
- END;
-
- PROCEDURE Call;
- VAR rc : String[2]; selection, i, j, k : Integer; PhoneNo : PhoneStr;
- ans : Char; cdone : boolean; lrow, lcol : Integer; { 2.0f }
- BEGIN
- N_Phones := ReadPhoneList;
- IF N_Phones > 0 THEN
- BEGIN
- mcol := WhereX; mrow := WhereY;
- Window(38,1,80,24); { 2.0f }
- LargeWindow;
- Cdone := False;
- lcol := 3;
- lrow := 2;
- GotoXy(lcol,lrow); {2.0f}
- FOR i := 1 TO N_Phones DO
- BEGIN
- Writeln(Chr(i+64), ' - ', PhoneList[i]);
- INC(lrow); GotoXY(lcol,lrow);
- END;
- Selection := 0;
- GotoXY(lcol,21);
- Write('Item to Dial or <CR> to EXIT:'); { 2.0m }
- REPEAT
- Readln(rc);
- ans := rc[1];
- ans := UpCase(ans);
- IF (rc = '') THEN
- cdone := True { 1.5 }
- ELSE
- selection := Ord(ans)-Ord('@');
- UNTIL (selection IN [1..N_Phones]) OR cdone;
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24); { 2.0o }
- IF (NOT cdone) AND (PhoneList[selection][32] > #48) THEN { 2.0h }
- BEGIN
- ClrScr; { 2.0p }
- baudrate := PhoneList[selection][32];
- Setup(baudrate);
- StatusLine; { 2.0i }
- j := 30;
- PhoneNo := '';
- WHILE PhoneList[selection][j] <> '.' DO
- j := j-1;
- phonename := copy(phonelist[selection],1,j-1); { 2.0h }
- FOR k := j+1 TO 30 DO { 2.0f }
- PhoneNo := PhoneNo+PhoneList[selection][k];
- rc := Dial(PhoneNo);
- END
- ELSE
- BEGIN { 2.0f }
- GotoXY(mcol,mrow);
- END;
- END;
- END;
-
- PROCEDURE ChangePhoneLst; { 2.0h }
- VAR rc : String[2]; selection, i, j, k : Integer; PhoneNo : PhoneStr;
- ans : Char; cdone : boolean; lrow, lcol : Integer; { 2.0f }
- BEGIN
- N_Phones := ReadPhoneList;
- pnumbers := index; { 2.0h }
- IF N_Phones > 0 THEN
- BEGIN
- mcol := WhereX; mrow := WhereY;
- Window(38,1,80,24); { 2.0f }
- LargeWindow;
- Cdone := False;
- lcol := 3;
- lrow := 2;
- GotoXy(lcol,lrow); {2.0f}
- FOR i := 1 TO N_Phones DO
- BEGIN
- Writeln(Chr(i+64), ' - ', PhoneList[i]);
- INC(lrow);
- GotoXY(lcol,lrow);
- END;
- Selection := 0;
- GotoXY(2,21);
- FOR i := 1 TO 40 DO Write(' ');
- GotoXY(2,21);
- Write('Selection to Change or <CR> to EXIT:'); { 2.0f }
- REPEAT
- Readln(rc);
- ans := rc[1];
- ans := UpCase(ans);
- IF (rc = '') THEN
- cdone := True { 1.5 }
- ELSE
- selection := Ord(ans)-Ord('@');
- UNTIL (selection IN [1..N_Phones]) OR cdone;
-
- IF (NOT cdone) AND (PhoneList[selection][32] > #48) THEN
- BEGIN
- baudrate := PhoneList[selection][32];
- j := 30;
- PhoneNo := '';
- WHILE PhoneList[selection][j] <> '.' DO
- j := j-1;
- phonename := copy(phonelist[selection],1,j-1); { 2.0h }
- FOR k := j+1 TO 30 DO { 2.0f }
- PhoneNo := PhoneNo+PhoneList[selection][k];
- END;
-
- IF NOT cdone THEN
- BEGIN
- GotoXY(2,21);
- FOR i := 1 TO 40 DO Write(' ');
- GotoXY(3,21);
- Write('Name Or <CR> to clear:'); Readln(phonename);
- IF phonename <> '' THEN
- BEGIN
- GotoXY(2,21);
- FOR i := 1 TO 40 DO Write(' ');
- GotoXY(3,21);
- Write('Phone#:'); Readln(PhoneNo);
- GotoXY(2,21);
- FOR i := 1 TO 40 DO Write(' ');
- GotoXY(2,21);
- Write('Baud? 3)00, 1)200, 2)400, 9)600:');
- Read(baudrate);
- PhoneList[Selection] := PhoneName+'. '+PhoneNo;
- While length(phonelist[selection]) < 31 DO
- PhoneList[selection] := Phonelist[selection]+' ';
- PhoneList[selection] := Phonelist[selection]+baudrate;
- SavePhoneLst;
- END
- ELSE
- BEGIN
- PhoneList[selection] := ' ';
- While length(phonelist[selection]) < 32 DO
- PhoneList[selection] := PhoneList[selection]+' ';
- SavePhoneLst;
- END;
- END;
- END
- ELSE
- BEGIN { 2.0f }
- clrscr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
- END;
-
- PROCEDURE UsePhone; { 1.5 }
- VAR ddone : Boolean;
- BEGIN
- ddone := False;
- REPEAT
- REPEAT
- GotoXY(3,4);
- Write('D)ial, A)ddToLst, C)hangeLst, Q)uit:'); { 2.0h }
- Read(Kbd, answer); answer := upcase(answer);
- UNTIL answer IN ['D', 'A', 'C', 'Q']; { 2.0h }
- IF answer = 'D' THEN
- BEGIN
- Ddone := True;
- Callout := True;
- END
- ELSE
- IF answer = 'A'THEN
- BEGIN
- Add2PhoneLst;
- IF exitphone THEN BEGIN ddone := True; exitphone := False; END; { 2.0e }
- Callout := True; { 2.0h }
- END
- ELSE
- IF answer = 'Q' THEN
- BEGIN
- ddone := True;
- savescrn := True; { 2.0p }
- END
- ELSE
- IF answer = 'C' THEN
- BEGIN
- ChangePhoneLst; { 2.0h }
- ddone := True;
- Callout := True; { 2.0h }
- END;
- IF (NOT ddone) THEN
- BEGIN
- REPEAT { 1.4 }
- answer := ' ';
- Gotoxy(3,11); Write(' ');
- GotoXY(3,11);
- Write('Save settings to disk [Y/N]?');
- Read(Kbd, answer);
- answer := UpCase(answer);
- UNTIL answer IN ['Y', 'N'];
- IF answer = 'Y' THEN
- BEGIN
- SavePhoneLst;
- ddone := True; { 2.0e }
- END;
- ddone := True; { 2.0e }
- END;
- UNTIL ddone;
- END;
-
- PROCEDURE DialMenu; { 1.5 }
- BEGIN
- mcol := WhereX; mrow := WhereY;
- Window(40,13,80,24); { 2.0m }
- WindowFrame;
- GotoXY(3,2); Write(' ----- TModem Dialing Menu ----- ');
- Gotoxy(3,4); Write(' ');
- Gotoxy(3,5); Write(' ');
- Gotoxy(3,6); Write(' ');
- Gotoxy(3,7); Write(' ');
- Gotoxy(3,8); Write(' ');
- Gotoxy(3,9); Write(' ');
- Gotoxy(3,10); Write(' ');
- Gotoxy(3,11); Write(' ');
- UsePhone;
- Clrscr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
-
- PROCEDURE SetMacros; { 2.0i }
- VAR mfile : Text; dmac : MacStr; mnum : String[2]; index : Integer;
- BEGIN
- index := 1;
- Assign(mfile,'TMODEM.MAC');
- {$I-} Reset(mfile); {$I+}
- IF IORESULT = 0 THEN
- BEGIN
- WHILE NOT EOF(mfile) DO
- BEGIN
- Readln(mfile,dmac);
- MacArray[index] := dmac;
- INC(index);
- END;
- END
- ELSE
- BEGIN
- FOR index := 1 TO 10 DO
- BEGIN
- IF index < 10 THEN
- mnum := chr(index+48)
- ELSE
- mnum := '10';
- MacArray[index] := 'This is Macro'+mnum;
- END;
- END;
- END;
-
- (* -----------------------------------------------
- This Procedure is NOT used! Left in as example!
-
- PROCEDURE WriteDos(VAR letter : Char); { 2.0i }
- VAR regs : Registers;
- BEGIN
- WITH regs DO
- BEGIN
- AH := 2;
- DL := ord(letter);
- END;
- MSDOS(regs);
- END;
- ----------------------------------------------- *)
-
- {$R-,S-,B-}
- PROCEDURE terminal; { This is the main loop must be faaassst! }
- VAR s, cnt : integer; c, ans, tinkey : char; regs : Registers; { 2.0j }
- t, nrow : Byte; { 2.0o }
- BEGIN
- WITH regs DO AH := 2; { Make sure we call DOS function 2! 2.0j }
- IF useansi THEN Window(1,1,80,25) ELSE window(1,1,80,24); { 2.0l }
- REPEAT
- IF newstatus THEN Statusline;
- IF Callout THEN { 1.5 }
- BEGIN
- callout := False;
- call; { call the selected number }
- END;
- REPEAT { 1.2 }
- s := port[outport];
- IF buffer_Count > 0 THEN { 2.0e }
- BEGIN { changed to NOT use cinkey 2.0h }
- inline($FA);
- tinkey := RecBuf[buffer_Tail];
- IF Buffer_Tail < Buffer_End THEN
- INC(Buffer_Tail)
- ELSE
- Buffer_Tail := 1;
- DEC(buffer_count);
- inline($FB);
- t := ord(tinkey);
- IF (t = 12) THEN { 1.1 Clrscr? Is it an <FF>? 2.Oj }
- BEGIN { 2.0m }
- IF useansi THEN
- BEGIN
- Window(1,1,80,25); { 2.0q }
- nrow := WhereY; { 2.0o }
- GotoXy(1,nrow+1); { 2.0o }
- WITH regs DO
- BEGIN { read cursor attribute next row down }
- AH := 8; BH :=0;
- Intr($10,regs);
- BEGIN
- GoToXY(1,1);
- BL := AH;
- CX := 2000; AH := 9; AL := 32;
- BH := 0;
- END;
- Intr($10,regs);
- GotoXY(1,1);
- AH := 2;
- END;
- END
- ELSE
- ClrScr;
- END
- ELSE
- BEGIN { 2.0j }
- IF useansi THEN
- BEGIN { ANSI-BBS support code write characters via DOS }
- WITH regs DO DL := t;
- MSDOS(regs);
- END
- ELSE
- Write(tinkey); { write direct to screen }
- END;
- END;
- UNTIL buffer_count < 1; { 2.0h }
- mcol := WhereX; mrow := WhereY;
- IF KeyPressed AND ((s AND $20) = $20) THEN
- BEGIN
- Read(Kbd, c);
- IF c <> #27 THEN Port[base] := Ord(c); { 2.0e }
- IF (c = #27) AND KeyPressed THEN
- BEGIN
- read(kbd, c);
- DEC(mcol); { put cursor back where it belongs 2.0f }
- CASE c OF { 2.0h }
- #71 : termscrn; { 1.1 Home = Help }
- #73 : Sendfile; { 1.1 PgUp = Upload }
- #81 : Rcvfile; { 1.1 PgDn = Download }
- #35 : HangItUp; { 1.1 ALT-H = HangupPhone }
- #24 : Initialize; { 1.1 ALT-O = Options }
- #45 : BEGIN { 2.0h ALT-X = Exit Terminal }
- mcol := WhereX; mrow := WhereY; { 2.0p }
- Window(40,22,80,24); { 2.0p }
- SmallWindow;
- GotoXy(3,2); { 2.0f }
- Write('Exit TModem [Y/N]?'); { 2.0f }
- Read(Kbd, ans); ans := upcase(ans);
- IF ans = 'Y' THEN
- done := True
- ELSE
- BEGIN
- ClrScr;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- GotoXY(mcol,mrow);
- END;
- END;
- #23 : InfoScr; { ALT-I = Info Screen }
- #31 : ChangeScr; { ALT-S = Change Screen 1.1 }
- #32 : DialMenu; { ALT-D = dialing menu 1.5 }
- #36 : JumpDos; { ALT-J = JumpDos 2.0c }
- #46 : BEGIN ClrScr; StatusLine; END; { ALT-C = clearscreen 2.0J }
- #59 : SendText(MacArray[1]+cr); { F1 = Macro1 } { 2.0i }
- #60 : SendText(MacArray[2]+cr); { F2 = Macro1 }
- #61 : SendText(MacArray[3]+cr); { F3 = Macro1 }
- #62 : SendText(MacArray[4]+cr); { F4 = Macro1 }
- #63 : SendText(MacArray[5]+cr); { F5 = Macro1 }
- #64 : SendText(MacArray[6]+cr); { F6 = Macro1 }
- #65 : SendText(MacArray[7]+cr); { F7 = Macro1 }
- #66 : SendText(MacArray[8]+cr); { F8 = Macro1 }
- #67 : SendText(MacArray[9]+cr); { F9 = Macro1 }
- #68 : SendText(MacArray[10]+cr); { F10 = Macro1 }
- #30 : BEGIN { ALT-A Toggle ANSI mode 2.0l }
- UseAnsi := NOT UseAnsi;
- IF useansi THEN Window(1,1,80,25) ELSE Window(1,1,80,24);
- Clrscr; newscr := True;
- END;
- #47 : StatusLine; { ALT-V view StatusLine 2.0m }
- END;
- IF newscr THEN BEGIN GoToXY(1,1); NewScr := False; END; { 2.0h }
- END;
- END;
- UNTIL done;
- END;
- {$R+,S+,B+}
-
- BEGIN {TModem}
- IF mem[$0000:$0449] = 7 THEN
- BEGIN
- TextMode(Mono);
- oldmode := 7;
- scrmode := 7; { 2.0o }
- END
- ELSE
- BEGIN
- Textmode(CO80); oldmode := 3; scrmode := 3;
- END;
- biosvideo := True; { 2.0q }
- DirectVideo := False; CheckSnow := False; CheckBreak := False; { 2.0q }
- callout := False;
- useansi := False; { 2.0j }
- done := False; { 1.1 }
- andwith := 255; { allow full IBM ASCII set 2.0}
- Assign(cfile, 'TMODEM.CFG'); { 1.4 }
- {$I-} Reset(cfile); {$I+}
- IF IORESULT = 0 THEN
- BEGIN
- Close(cfile); { 1.5 }
- ReadConfig;
- END
- ELSE
- BEGIN
- {$I-} Close(cfile); {$I+}
- err := IORESULT;
- Writeln('TModem.cfg was NOT found! Building the file.'); { 2.0o }
- Delay(3000); { 2.0o }
- COMport := 1;
- baudrate := '1'; { 2.0o }
- txtclr := 15;
- IF scrmode = 3 THEN txtback := 1 ELSE txtback := 0; { 2.0o }
- IF scrmode = 3 THEN statbak := 4 ELSE statbak := 1; { 2.0o }
- IF scrmode = 3 THEN statclr := 14 ELSE statclr := 0; { 2.0o }
- initstrg := 'AT &C1 &D2 X4 S0=0 M0'; { 2.0e }
- dialstrg := 'ATDT'; { 2.0n }
- videochc := 'BIOS'; { 2.0q }
- MakeConfig; { 1.4 }
- END;
- Newstatus := True; { 1.1 }
- NewScr := False; { 1.4 }
- mcol := 1; { 1.6 }
- mrow := 1; { 1.6 }
- TextMode(scrmode);
- TextColor(txtclr);
- TextBackground(txtback);
- IF NOT biosvideo THEN DirectVideo := True; CheckSnow := False; { 2.0q }
- Window(1,25,80,25); { 1.1 Define status line }
- TextColor(statclr);
- TextBackground(statbak);
- Clrscr;
- Window(1,1,80,24); { 1.1 Define main screen }
- TextColor(txtclr);
- TextBackground(txtback);
- Clrscr;
- XlateSetup; { 2.0i }
- iport1;
- GetIntVec(Async_irq+8, AsyncVector);
- iport;
- init1;
- ResetModem; { 2.0b }
- SetMacros; { 2.Oi }
- Terminal; { 1.1 this is the main loop for TModem }
- remove_port; delay(500);
- SetIntVec(Async_irq+8,AsyncVector);
- MsDos(regs);
- TextColor(7);
- TextBackGround(0);
- ClrScr;
- Window(1,1,80,25); { 1.1 }
- IF oldmode = 7 THEN { 2.0q }
- textmode(mono)
- ELSE
- IF oldmode = 3 THEN
- textmode(CO80)
- ELSE
- IF oldmode = 2 THEN
- textmode(BW80);
- ClrScr;
- END.
-