home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************************)
- (* CHANGE COMMUNICATION PARAMETERS *)
- (****************************************************************************)
- procedure
- change_comm_params;
- begin
- mkwin(16,7,61,18,'Change Parameters');
- writeln;
- write(' Current Setting: ',baud:4);
- case par of
- 0 : write(' N');
- 1 : write(' E');
- 2 : write(' O');
- else
- ;
- end;
- writeln(databits:2,stopbits:2);
- writeln;
- writeln(' Enter New Parameters.');
- writeln(' ---------------------');
- write(' Baud Rate, 300, 1200 or 2400 : ');
- readln(baud_ch);
- if length(baud_ch)>0 then begin
- baud:=bval(baud_ch);
- case baud of
- 300 : ;
- 1200 : ;
- 2400 : ;
- else
- baud := default_baud;
- end;
- end;
- write(' Parity, (N)one, (E)ven, (O)dd : ');
- readln(parity_ch);
- if length(parity_ch)>0 then begin
- parity_ch := upcase(parity_ch[1]);
- case parity_ch of
- 'N' : par:=0;
- 'E' : par:=1;
- 'O' : par:=2;
- else
- par:=0;
- end;
- end;
- write(' Data Bits, 7 or 8 : ');
- readln(data_ch);
- if length(data_ch)>0 then begin
- databits := bval(data_ch);
- case databits of
- 7 : ;
- 8 : ;
- else
- databits := 8;
- end;
- end;
- write(' Stop Bits, 1 or 2 : ');
- readln(stop_ch);
- if length(stop_ch)>0 then begin
- stopbits := bval(stop_ch);
- case stopbits of
- 1 : ;
- 2 : ;
- else
- stopbits := 1;
- end;
- end;
- setserial(baud,stopbits,databits,paritytype(par));
- rmwin;
- end;
-
- (****************************************************************************)
- (* PAINT DIRECTORY SCREEN *)
- (****************************************************************************)
- procedure
- paint_directory_screen(en : integer);
- var
- i : integer;
- row : integer;
- num : integer;
- begin
- for i:=en to max_dial_entries do begin
- row := i + 3;
- num := ( dialarray_number * max_dial_entries ) + i;
- gotoxy(1,row);
- write(num:3,' ');
- clreol;
- with dial_dir do begin
- if i <= no_of_dial_entries then begin
- with dir_entries[i] do begin
- gotoxy(5,row);
- write(bbs_name);
- gotoxy(36,row);
- write(bbs_number);
- gotoxy(67,row);
- write(bbs_baud:4);
- gotoxy(72,row);
- case bbs_parity of
- 0 : write('N ');
- 1 : write('E ');
- 2 : write('O ');
- else
- ;
- end;
- write(bbs_databits,' ',bbs_stopbits);
- end;
- end;
- end;
- writeln;
- end;
- end;
-
- (****************************************************************************)
- (* GET DIRECTORY INFO *)
- (****************************************************************************)
- procedure
- get_info(i : integer);
- var
- entry_no : integer;
- begin
- entry_no := i - 3;
- with dial_dir.dir_entries[entry_no] do begin
- gotoxy(5,i);
- input(bbs_name);
- gotoxy(36,i);
- input(bbs_number);
- gotoxy(67,i);
- if bbs_baud = 0 then begin
- baud_ch := '';
- parity_ch := '';
- data_ch := '';
- stop_ch := '';
- end
- else begin
- str(bbs_baud:4,baud_ch);
- case bbs_parity of
- 0 : parity_ch := 'N';
- 1 : parity_ch := 'E';
- 2 : parity_ch := 'O';
- else
- parity_ch := ' ';
- end;
- str(bbs_databits:1,data_ch);
- str(bbs_stopbits:1,stop_ch);
- end;
- input(baud_ch);
- bbs_baud := bval(baud_ch);
- case bbs_baud of
- 300 : ;
- 1200 : ;
- 2400 : ;
- else
- bbs_baud := default_baud;
- end;
- gotoxy(72,i);
- input(parity_ch);
- parity_ch := upcase(parity_ch[1]);
- case parity_ch of
- 'N' : bbs_parity := 0;
- 'E' : bbs_parity := 1;
- 'O' : bbs_parity := 2;
- else
- bbs_parity := 0;
- end;
- gotoxy(73,i);
- write(' ');
- input(data_ch);
- bbs_databits := bval(data_ch);
- case bbs_databits of
- 7 : ;
- 8 : ;
- else
- bbs_databits := 8;
- end;
- gotoxy(76,i);
- input(stop_ch);
- bbs_stopbits := bval(stop_ch);
- case bbs_stopbits of
- 1 : ;
- 2 : ;
- else
- bbs_stopbits := 1;
- end;
- gotoxy(75,21);
- end;
- end;
-
- (****************************************************************************)
- (* ADD DIRECTORY ENTRY *)
- (****************************************************************************)
- procedure
- add_dial_entry;
- var
- row : integer;
- ch : char;
- begin
- with dial_dir do begin
- while no_of_dial_entries = max_dial_entries do begin
- dialarray_number := dialarray_number + 1;
- {$I-}
- seek(dialfile,dialarray_number);
- read(dialfile,dial_dir);
- {$I+}
- ok := (ioresult=0);
- if not ok then begin
- seek(dialfile,dialarray_number);
- no_of_dial_entries := 0;
- write(dialfile,dial_dir);
- end;
- end;
- paint_directory_screen(1);
- no_of_dial_entries := no_of_dial_entries + 1;
- row := no_of_dial_entries + 3;
- with dir_entries[no_of_dial_entries] do begin
- bbs_name := '';
- bbs_number := '';
- bbs_baud := 0;
- bbs_parity := 0;
- bbs_databits := 8;
- bbs_stopbits := 1;
- end;
- get_info(row);
- seek(dialfile,dialarray_number);
- write(dialfile,dial_dir);
- end;
- end;
-
- (****************************************************************************)
- (* CHANGE DIRECTORY ENTRY *)
- (****************************************************************************)
- procedure
- change_dial_entry;
- var
- i : integer;
- row : integer;
- begin
- mkwin(41,1,71,5,'Update');
- writeln;
- write(' Enter the # to change: ');
- readln(i);
- rmwin;
- i := i - (dialarray_number * max_dial_entries);
- if ( i > 0 ) and ( i <= max_dial_entries ) then begin
- row := i + 3;
- get_info(row);
- seek(dialfile,dialarray_number);
- write(dialfile,dial_dir);
- end;
- end;
-
- (****************************************************************************)
- (* DELETE DIRECTORY ENTRY *)
- (****************************************************************************)
- procedure
- delete_dial_entry;
- var
- i : integer;
- j : integer;
- begin
- mkwin(41,1,71,5,'Delete');
- writeln;
- write(' Enter the # to delete: ');
- readln(i);
- rmwin;
- j := i - (dialarray_number * max_dial_entries);
- i := j;
- if ( i > 0 ) and ( i <= max_dial_entries ) then begin
- with dial_dir do begin
- while i < no_of_dial_entries do begin
- dir_entries[i] := dir_entries[i+1];
- i := i + 1;
- end;
- no_of_dial_entries := no_of_dial_entries - 1;
- paint_directory_screen(j);
- seek(dialfile,dialarray_number);
- write(dialfile,dial_dir);
- end;
- end;
- gotoxy(75,21);
- end;
-
- (****************************************************************************)
- (* DIALER *)
- (****************************************************************************)
- procedure
- dialer;
- var
- i : integer;
- begin
- for i:=1 to length(dial_str) do begin
- store_sout_buffer(dial_str[i]);
- end;
- end;
-
- (****************************************************************************)
- (* MANUAL DIAL MODEM *)
- (****************************************************************************)
- procedure
- manual_dial;
- begin
- mkwin(25,1,71,5,'Manual Dial');
- writeln;
- write(' Enter Phone Number: ');
- readln(dial_str);
- dial_str := dial_pre_str + dial_str + dial_post_str;
- change_comm_params;
- dialer;
- rmwin;
- end;
-
- (****************************************************************************)
- (* AUTO DIAL MODEM *)
- (****************************************************************************)
- procedure
- auto_dial;
- var
- i : integer;
- begin
- mkwin(41,1,71,5,'Auto Dial');
- writeln;
- write(' Enter the # to dial: ');
- readln(i);
- i := i - (dialarray_number * max_dial_entries);
- if ( I > 0 ) and ( i <= max_dial_entries ) then begin
- with dial_dir.dir_entries[i] do begin
- baud := bbs_baud;
- stopbits := bbs_stopbits;
- databits := bbs_databits;
- par := bbs_parity;
- setserial(baud,stopbits,databits,paritytype(par));
- dial_str := dial_pre_str + bbs_number + dial_post_str;
- dialer;
- end;
- end
- else begin
- writeln(' Number must be on screen.');
- wait_for_key;
- end;
- rmwin;
- end;
-
- (****************************************************************************)
- (* PAGE FORWARD *)
- (****************************************************************************)
- procedure
- page_forward;
- var
- fsize : integer;
- begin
- fsize := filesize(dialfile) - 1;
- if dialarray_number = fsize then exit;
- dialarray_number := dialarray_number + 1;
- seek(dialfile,dialarray_number);
- read(dialfile,dial_dir);
- paint_directory_screen(1);
- gotoxy(75,21);
- end;
-
- (****************************************************************************)
- (* PAGE BACKWARD *)
- (****************************************************************************)
- procedure
- page_backward;
- begin
- if dialarray_number = 0 then exit;
- dialarray_number := dialarray_number - 1;
- seek(dialfile,dialarray_number);
- read(dialfile,dial_dir);
- paint_directory_screen(1);
- gotoxy(75,21);
- end;
-
- (****************************************************************************)
- (* DIRECTORY MANAGER *)
- (****************************************************************************)
- procedure
- directory_manager;
- begin
- writeln(' Phone Directory');
- writeln(' # BBS Name Phone Number Baud P D S');
- writeln(' -- ------------------------------ ------------------------------ ---- - - -');
- paint_directory_screen(1);
- writeln;
- write('A=Add, C=Chg, D=Del, M=M.Dial, G=A.Dial, S=Stop, F=PgFwd, B=PgBak, Q=Quit ');
- repeat
- repeat until keypressed;
- read(kbd,kbd_char);
- kbd_char := upcase(kbd_char);
- case kbd_char of
- 'A' : add_dial_entry;
- 'C' : change_dial_entry;
- 'D' : delete_dial_entry;
- 'M' : manual_dial;
- 'G' : auto_dial;
- 'S' : store_sout_buffer(' ');
- 'F' : page_forward;
- 'B' : page_backward;
- 'Q' : ;
- else
- ;
- end;
- until kbd_char = 'Q';
- end;
-
- (****************************************************************************)
- (* MODEM DIALER *)
- (****************************************************************************)
- procedure
- dial_modem;
- begin
- mkwin(1,1,80,23,'');
- assign(dialfile,dial_PATH+'TMODEM.DIR');
- {$I-};
- reset(dialfile);
- {$I+}
- ok := (ioresult = 0);
- dialarray_number := 0;
- with dial_dir do begin
- if ok then
- read(dialfile,dial_dir)
- else begin
- no_of_dial_entries := 0;
- rewrite(dialfile);
- write(dialfile,dial_dir);
- close(dialfile);
- assign(dialfile,dial_PATH+'TMODEM.DIR');
- reset(dialfile);
- read(dialfile,dial_dir);
- end;
- directory_manager;
- close(dialfile);
- end;
- rmwin;
- end;
-
- (****************************************************************************)
- (* HANG UP THE MODEM *)
- (****************************************************************************)
- procedure
- hang_up;
- begin
- mkwin(10,8,71,14,'');
- gotoxy(23,3);
- write('Hanging Up');
- gotoxy(60,5);
- port[int_enable_reg] := 0; { Complete reset of modem }
- port[modem_control_reg] := 0; { control circuitry and }
- port[$21] := port[$21] or turn_IRQ_off; { associated pointers. }
- sin_store_ptr := 1;
- sin_read_ptr := 1;
- sout_store_ptr := 1;
- sout_read_ptr := 1;
- ascii_mode := false;
- delay( wait_increment * 10 );
- setserial(baud,stopbits,databits,paritytype(par));
- dial_str := modem_init_str;
- dialer;
- dial_str := '';
- rmwin;
- end;
-
- (****************************************************************************)
- (* REDIAL THE MODEM *)
- (****************************************************************************)
- procedure
- redial_modem;
- begin
- mkwin(10,8,71,14,'');
- gotoxy(24,3);
- write('Redialing');
- gotoxy(60,5);
- dialer;
- delay( wait_increment * 5 );
- rmwin;
- end;
-
- (****************************************************************************)
- (* ASCII FILE TRANSMISSION *)
- (****************************************************************************)
- procedure
- ascii_transmission;
- var
- image_cnt : integer;
- begin
- mkwin(15,4,62,13,'Transmit ASCII File');
- image_cnt := 0;
- continue_transfer := true;
- repeat
- write(' Enter Filename to Transmit: ');
- readln(filename);
- if length(filename)=0 then begin
- rmwin;
- exit;
- end;
- assign(textfile,filename);
- {$I-}
- reset(textfile);
- {$I+}
- ok:=(ioresult = 0);
- if not ok then
- writeln(' Cannot find file: ',filename);
- until ok;
- ascii_mode := true;
- gotoxy(1,2);
- writeln(' ');
- writeln(' Lines Transmitted');
- writeln(' -----------------');
- writeln(' ');
- while ( not eof(textfile) ) and continue_transfer do begin
- readln(textfile,textimage);
- image_cnt := image_cnt + 1;
- gotoxy(19,5);
- writeln(image_cnt:5);
- xmit_data(textimage+CRLF);
- end;
- xmit_data(^Z^K);
- close(textfile);
- writeln;
- write(' Waiting for buffer to drain...');
- repeat until sout_store_ptr = sout_read_ptr;
- ascii_mode := false;
- sin_read_ptr := sin_store_ptr; { Flush the buffer! }
- rmwin;
- end;
-
- (****************************************************************************)
- (* VIEW FILE *)
- (****************************************************************************)
- procedure
- view_file;
- var
- cnt : byte;
- wlabel : labeltype;
- begin
- mkwin(33,4,77,10,'View File');
- writeln;
- writeln;
- repeat
- write(' Enter Filename to View: ');
- readln(filename);
- if length(filename)=0 then begin
- rmwin;
- exit;
- end;
- assign(textfile,filename);
- {$I-}
- reset(textfile);
- {$I+}
- ok:=(ioresult = 0);
- if not ok then
- writeln(' Cannot find file: ',filename);
- until ok;
- rmwin;
- wlabel := 'View File [' + filename + '], ^C To Stop.';
- mkwin(1,1,80,24,wlabel);
- cnt := -5;
- a_key := ' ';
- while ( not eof(textfile) )
- and ( a_key[1] <> ^C )
- and ( a_key[1] <> chr(27) )
- do begin
- readln(textfile,textimage);
- if length(textimage) <= 77 then
- writeln(textimage)
- else
- write(copy(textimage,1,78));
- cnt := cnt + 1;
- if cnt = 16 then begin
- cnt:=0;
- write(' <<< MORE >>> ');
- repeat
- a_key := inkey;
- until a_key <> '';
- gotoxy(1,wherey);
- clreol;
- end;
- end;
- close(textfile);
- if ( cnt > 0 )
- and ( a_key[1] <> ^C )
- and ( a_key[1] <> chr(27) )
- then begin
- writeln;
- wait_for_key;
- end;
- rmwin;
- end;
-
- (****************************************************************************)
- (* ENTER / LEAVE HALF DUPLEX *)
- (****************************************************************************)
- procedure
- toggle_duplex;
- begin
- if half_duplex then begin
- half_duplex := false;
- clear_pos(79,25);
- end
- else begin
- escape_win;
- half_duplex := true;
- gotoxy(79,25);
- write('H');
- reset_win;
- end;
- end;
-
- (****************************************************************************)
- (* CHANGE DIRECTORY AND DISK DRIVE *)
- (****************************************************************************)
- procedure
- new_directory_drive;
- var
- dd : char;
- dn : integer;
- curdir : strtype;
- dstr : string[10];
- begin
- mkwin(12,4,69,12,'Change Directory\Drive');
- dd:=default_drive;
- dn:=ord(dd)-ord('A')+1;
- getdir(dn,curdir);
- writeln;
- writeln(' Current Drive\Directory: ',curdir);
- writeln;
- write(' Enter New Drive Letter : ');
- readln(dstr);
- if length(dstr)>0 then begin
- dd:=upcase(dstr[1]);
- if ( ord(dd) < ord('A') ) or ( ord(dd) > ord('D') ) then
- dd:='A';
- change_drive(dd);
- end;
- repeat
- write(' Enter New Directory: ');
- readln(curdir);
- {$I-}
- if length(curdir)>0 then begin
- chdir(curdir);
- ok:=(ioresult = 0);
- if not ok then
- writeln(' Can''t access that directory!');
- end;
- {$I+}
- until ( ok ) or ( length(curdir) = 0 );
- rmwin;
- end;
-
- (****************************************************************************)
- (* KILL FILE *)
- (****************************************************************************)
- procedure
- kill_file;
- begin
- mkwin(33,4,77,10,'Kill File');
- repeat
- write(' Enter Filename to Kill: ');
- readln(filename);
- if length(filename)=0 then begin
- rmwin;
- exit;
- end;
- assign(textfile,filename);
- {$I-}
- erase(textfile);
- {$I+}
- ok:=(ioresult = 0);
- if not ok then
- writeln(' Cannot kill file: ',filename);
- until ok;
- rmwin;
- end;
-
- (****************************************************************************)
- (* REWRITE DIAL ENTRIES *)
- (****************************************************************************)
- procedure
- rewrite_dial_entries;
- begin
- rewrite(dialfile);
- sort_curr := sort_first;
- dial_dir.no_of_dial_entries := 0;
- while sort_curr <> nil do begin
- dial_dir.no_of_dial_entries := dial_dir.no_of_dial_entries + 1;
- dial_dir.dir_entries[dial_dir.no_of_dial_entries] := sort_curr^.sort_rec;
- if dial_dir.no_of_dial_entries = max_dial_entries then begin
- write(dialfile,dial_dir);
- dial_dir.no_of_dial_entries := 0;
- end;
- sort_first := sort_curr;
- sort_curr := sort_curr^.sort_next;
- dispose(sort_first);
- end;
- if dial_dir.no_of_dial_entries > 0 then
- write(dialfile,dial_dir);
- end;
-
- (****************************************************************************)
- (* SORT DIAL ENTRIES *)
- (****************************************************************************)
- procedure
- sort_dial_entries;
- var
- flg : boolean;
- hold_rec : dialrec;
- begin
- repeat
- flg := false;
- sort_curr := sort_first;
- sort_prev := sort_curr^.sort_next;
- while sort_prev <> nil do begin
- if sort_curr^.sort_rec.bbs_name > sort_prev^.sort_rec.bbs_name then
- begin
- flg := true;
- hold_rec := sort_prev^.sort_rec;
- sort_prev^.sort_rec := sort_curr^.sort_rec;
- sort_curr^.sort_rec := hold_rec;
- end;
- sort_curr := sort_curr^.sort_next;
- sort_prev := sort_prev^.sort_next;
- end;
- until not flg;
- end;
-
- (****************************************************************************)
- (* LOAD DIAL ENTRIES *)
- (****************************************************************************)
- procedure
- load_dial_entries( fs : integer );
- var
- i,j : integer;
- begin
- new(sort_first);
- sort_curr := sort_first;
- for i:=0 to fs do begin
- seek(dialfile,i);
- read(dialfile,dial_dir);
- for j:=1 to dial_dir.no_of_dial_entries do begin
- sort_curr^.sort_rec := dial_dir.dir_entries[j];
- new(sort_curr^.sort_next);
- sort_prev := sort_curr;
- sort_curr := sort_curr^.sort_next;
- end;
- end;
- dispose(sort_curr);
- sort_prev^.sort_next := nil;
- end;
-
- (****************************************************************************)
- (* SORT DIALING DIRECTORY *)
- (****************************************************************************)
- procedure
- sort_dialing_directory;
- var
- fsize : integer;
- begin
- mkwin(10,5,71,11,'');
- gotoxy(23,3);
- write('S O R T I N G ');
- assign(dialfile,dial_PATH+'TMODEM.DIR');
- {$I-}
- reset(dialfile);
- {$I+}
- ok := (ioresult = 0);
- if ok then begin
- fsize := filesize(dialfile);
- if fsize > 0 then begin
- load_dial_entries( fsize - 1 );
- sort_dial_entries;
- rewrite_dial_entries;
- close(dialfile);
- end;
- end;
- rmwin;
- end;
-
- (****************************************************************************)
- (* SEND FUNCTION KEY *)
- (****************************************************************************)
- procedure
- send_func_key( j : integer );
- var
- i : integer;
- end_of_key : boolean;
- begin
- i := 0;
- end_of_key := false;
- while ( i < length(func_key[j]) ) and ( not end_of_key ) do begin
- i := i + 1;
- case func_key[j][i] of
- '|' : store_sout_buffer( CR );
- '~' : delay( wait_increment * 3 );
- ';' : end_of_key := true;
- else
- store_sout_buffer( func_key[j][i] );
- end;
- end;
- end;
-
- (****************************************************************************)
- (* MACRO KEY MAINTENANCE *)
- (****************************************************************************)
- procedure
- display_keys( Fn : integer );
- var
- i : integer;
- begin
- gotoxy(1,2);
- case Fn of
- 1 : writeln(' < Unshifted >');
- 11 : writeln(' < Shifted > ');
- 21 : writeln(' < Ctrl > ');
- 31 : writeln(' < Alt > ');
- else
- ;
- end;
- writeln;
- for i:=1 to 10 do begin
- clreol;
- writeln(i:3,'. ',func_key[i+Fn-1]);
- end;
- end;
-
- procedure
- page_func_fwd(var Fn : integer);
- begin
- Fn := Fn + 10;
- if Fn > 40 then Fn := Fn - 40;
- display_keys(Fn);
- end;
-
- procedure
- page_func_bak(var Fn : integer);
- begin
- Fn := Fn - 10;
- if Fn < 1 then Fn := Fn + 40;
- display_keys(Fn);
- end;
-
- procedure
- macro_keys;
- var
- i : integer;
- flg : boolean;
- Fn : integer;
- begin
- flg := false;
- mkwin(1,3,80,20,'Function Keys. Use: | for CR, ~ for delay, ; for comment.');
- Fn := 1;
- display_keys(Fn);
- gotoxy(1,16);
- write(' Enter: C=Chg, F=PgFwd, B=PgBak, Q=Quit. ');
- repeat
- gotoxy(42,16);
- clreol;
- repeat until keypressed;
- read(kbd,kbd_char);
- kbd_char := upcase(kbd_char);
- case kbd_char of
- 'C' : begin
- write(' Which One? ');
- read(i);
- if ( i > 0 ) and ( i < 11 ) then begin
- flg := true;
- gotoxy(7,i+3);
- input(func_key[i+Fn-1]);
- end;
- end;
- 'F' : page_func_fwd(Fn);
- 'B' : page_func_bak(Fn);
- else
- ;
- end;
- until kbd_char = 'Q';
- if flg then begin
- assign(textfile,dial_PATH+'TMODEM.KEY');
- rewrite(textfile);
- for i:=1 to 40 do writeln(textfile,func_key[i]);
- close(textfile);
- end;
- rmwin;
- end;
-
- (****************************************************************************)
- (* EXECUTE KEYBOARD COMMAND *)
- (****************************************************************************)
- procedure
- exec_command;
- var
- hold_mode : boolean;
- begin
- case ch of
- #46 : toggle_capture_mode;
- #45 : exit_program := true;
- #31 : change_comm_params;
- #81 : receive_file;
- #73 : transmit_file;
- #32 : dial_modem;
- #18 : toggle_duplex;
- #113 : give_help;
- #30 : ascii_transmission;
- #16 : hang_up;
- #38 : dir_list;
- #49 : new_directory_drive;
- #47 : view_file;
- #37 : kill_file;
- #34 : redial_modem;
- #50 : macro_keys;
- #24 : sort_dialing_directory;
- #17 : clrscr;
- else
- if ( ch >= #59 ) and ( ch <= #68 ) then
- send_func_key( ord(ch) - 58 )
- else
- if ( ch >= #84 ) and ( ch <= #113 ) then
- send_func_key( ord(ch) - 73 );
- end;
- end;