home *** CD-ROM | disk | FTP | other *** search
- {$C-,V-,K-}
- (****************************************************************************)
- (* *)
- (* Author: Paul Meiners *)
- (* P & M Software Company *)
- (* 9350 Country Creek #30 *)
- (* Houston, Texas 77036 *)
- (* *)
- (* Phone: (713) 772-2090 *)
- (* *)
- (* Date: March 3, 1985 *)
- (* *)
- (* Language: Turbo PASCAL version 3.00B *)
- (* *)
- (* Remarks: This program provides basic terminal emulation with capture *)
- (* to disk and XMODEM file transfer. Uses interrupt driven *)
- (* serial I/O with circular queues. Uses a removable window *)
- (* system. *)
- (* *)
- (****************************************************************************)
-
- program
- TMODEM17;
-
- type
- strtype = string[255];
-
- const
- sin_buf_size = 5120;
- sout_buf_size = 512;
- max_xmodem_buffers = 64;
- max_dial_entries = 16;
- default_stopbits : integer = 1;
- default_databits : integer = 8;
- default_parity : integer = 0; { 0=none, 1=even, 2=odd }
- default_baud : integer = 1200;
- datasegment : integer = 0;
- wait_increment : integer = 333; { 1/3 of a second. }
- XON = 17; { XON is a DC1 character. }
- XOFF = 19; { XOFF is a DC3 character. }
- SOH = ^A;
- CAN = ^X;
- NAK = ^U;
- ACK = ^F;
- EOT = ^D;
- CR = ^M;
- LF = ^J;
- CRLF = ^M^J;
- ESC = #27;
- NUL = #00;
- FF = #12;
- BS = #08;
- dial_pre_str : strtype = 'ATDT ';
- dial_post_str : strtype = '|'; { | is replaced by CR }
- modem_init_str : strtype = 'AT S0=0|';
-
- type
- string30 = string[30];
- string128 = string[128];
- paritytype = (none,even,odd);
- capture_ptr_type = ^capture_record;
- capture_record = record
- capture_store_ptr : integer;
- capture_buffer : array[1..1024] of char;
- capture_next : capture_ptr_type;
- end;
- xmodem_buf = array[1..128] of char;
- registerset = record
- AX,BX,CX,DX,BP,DI,SE,DS,ES,Flags : integer;
- end;
- dialrec = record
- bbs_name : string30;
- bbs_number : string30;
- bbs_baud : integer;
- bbs_parity : integer;
- bbs_databits : integer;
- bbs_stopbits : integer;
- end;
- dialarray = record
- no_of_dial_entries : integer;
- dir_entries :
- array[1..max_dial_entries] of dialrec;
- end;
- sort_ptr_type = ^dialsort;
- dialsort = record
- sort_rec : dialrec;
- sort_next : sort_ptr_type;
- end;
- var
- rand : real;
- sin_buffer : array[1..sin_buf_size] of byte;
- sin_store_ptr : integer;
- sin_read_ptr : integer;
- sout_buffer : array[1..sout_buf_size] of byte;
- sout_store_ptr : integer;
- sout_read_ptr : integer;
- sout_int_off : boolean;
- turn_IRQ_on : byte;
- turn_IRQ_off : byte;
- IRQ_vector_ofs : integer;
- IRQ_vector_seg : integer;
- hold_vector_ofs : integer;
- hold_vector_seg : integer;
- base_com_addr : integer absolute $0000:$0400;
- int_enable_reg : integer;
- int_ident_reg : integer;
- int_ident : byte;
- modem_control_reg : integer;
- line_status_reg : integer;
- line_status : byte;
- sync_time : integer;
- xmodem_table : array[1..max_xmodem_buffers] of xmodem_buf;
- xmodem_buf_cnt : integer;
- xmodem_ptr : integer;
- xmodem_rd : integer;
- continue_transfer : boolean;
- capture_flag : boolean;
- capture_warning : boolean;
- capture_first : capture_ptr_type;
- capture_curr : capture_ptr_type;
- sort_curr : sort_ptr_type;
- sort_first : sort_ptr_type;
- sort_prev : sort_ptr_type;
- exit_program : boolean;
- func_key : array[1..40] of string128;
- keyfile : text;
- block_count : integer;
- error_count : integer;
- filename : strtype;
- recv_file : file;
- xmit_file : file;
- textfile : text;
- textimage : strtype;
- dial_drive : integer;
- dial_PATH : strtype;
- dialfile : file of dialarray;
- dial_dir : dialarray;
- dialarray_number : integer;
- dial_str : strtype;
- baud : integer;
- stopbits : integer;
- databits : integer;
- par : integer;
- kbd_char : char;
- a_key : string[2];
- regs : registerset;
- half_duplex : boolean;
- ascii_mode : boolean;
- escape_mode : boolean;
- escape_number : byte;
- escape_register : array[1..50] of byte;
- escape_str : strtype;
- ok : boolean;
- parity_ch : string[10];
- baud_ch : string[10];
- stop_ch : string[10];
- data_ch : string[10];
- FGcolor : integer;
- BGcolor : integer;
-
- {$I BASIC.INC}
- {$I RWINDOW.INC}
- (****************************************************************************)
- (* COMMAND DISTRIBUTOR *)
- (****************************************************************************)
- procedure
- exec_command(ch : char); FORWARD;
-
- (****************************************************************************)
- (* WAIT FOR A KEY *)
- (****************************************************************************)
- procedure
- wait_for_key;
- begin
- write(' Press ANY key to continue...');
- repeat
- repeat
- a_key := inkey;
- until a_key <> '';
- if length(a_key) = 2 then begin
- exec_command(a_key[2]);
- a_key := '';
- end;
- until length(a_key) = 1;
- end;
-
- {$I DIRECT.INC}
- {$I TMODEM.IN1}
- {$I TMODEM.IN2}
- (****************************************************************************)
- (* KEYBOARD HANDLER *)
- (****************************************************************************)
- procedure
- keyboard;
- begin
- if length(a_key) = 1 then begin
- if half_duplex then scrwrite(a_key[1]);
- store_sout_buffer(a_key[1]);
- end
- else
- exec_command(a_key[2]);
- end;
-
- (****************************************************************************)
- (* TERMINAL PROCESSOR *)
- (****************************************************************************)
- procedure
- terminal_processor;
- begin
- if sin_store_ptr <> sin_read_ptr then begin
- kbd_char := read_sin_buffer;
- scrwrite(kbd_char);
- end;
- a_key := inkey;
- if a_key <> '' then keyboard;
- end;
-
- (****************************************************************************)
- (* INITIALIZE FUNCTION KEYS *)
- (****************************************************************************)
- procedure
- initialize_function_keys;
- var
- i : integer;
- begin
- for i:=1 to 40 do func_key[i]:='';
- assign(keyfile,'TMODEM.KEY');
- {$I-}
- reset(keyfile);
- {$I+}
- ok:=(ioresult = 0);
- if not ok then begin
- rewrite(keyfile);
- for i:=1 to 40 do
- writeln(keyfile,func_key[i]);
- end
- else begin
- i :=0;
- while ( not eof(keyfile) ) and ( i < 40 ) do begin
- i := i + 1;
- readln(keyfile,func_key[i]);
- end;
- end;
- close(keyfile);
- end;
-
- (****************************************************************************)
- (* READ CONFIG FILE *)
- (****************************************************************************)
- procedure
- cr_replace(var s : strtype );
- var
- i : integer;
- begin
- for i:=1 to length( s ) do begin
- if s[i]='|' then s[i]:=CR;
- end;
- end;
-
- procedure
- read_config_file;
- var
- teststr : string[2];
- dataval : integer;
- begin
- assign(textfile,'TMODEM.CNF');
- {$I-}
- reset(textfile);
- {$I+}
- ok:=(ioresult = 0);
- if not ok then begin
- rewrite(textfile);
- writeln(textfile,'ST=',default_stopbits);
- writeln(textfile,'DA=',default_databits);
- writeln(textfile,'PA=',default_parity);
- writeln(textfile,'BA=',default_baud);
- writeln(textfile,'WA=',wait_increment);
- writeln(textfile,'PR=',dial_pre_str);
- writeln(textfile,'PO=',dial_post_str);
- writeln(textfile,'MI=',modem_init_str);
- end
- else begin
- while not eof(textfile) do begin
- readln(textfile,textimage);
- teststr := copy(textimage+' ',1,2);
- upstring(teststr);
- dataval := bval(copy(textimage+' ',4,9));
- if teststr = 'ST' then
- default_stopbits := dataval;
- if teststr = 'DA' then
- default_databits := dataval;
- if teststr = 'PA' then
- default_parity := dataval;
- if teststr = 'BA' then
- default_baud := dataval;
- if teststr = 'WA' then
- wait_increment := dataval;
- if teststr = 'PR' then begin
- delete(textimage,1,3);
- dial_pre_str := textimage;
- end;
- if teststr = 'MI' then begin
- delete(textimage,1,3);
- modem_init_str := textimage;
- end;
- if teststr = 'PO' then begin
- delete(textimage,1,3);
- dial_post_str := textimage;
- end;
- end;
- end;
- close(textfile);
- cr_replace( dial_post_str );
- cr_replace( modem_init_str );
- end;
-
- (****************************************************************************)
- (* MAIN LINE CODE *)
- (****************************************************************************)
- begin
- randomize;
- FGcolor := white;
- BGcolor := black;
- textcolor( FGcolor );
- textbackground( BGcolor );
- window(1,1,80,25);
- clrscr;
- initwin;
- capture_flag := false;
- ascii_mode := false;
- escape_mode := false;
-
- if base_com_addr = $3F8 then { Setup vectors and port addresses. }
- begin
- turn_IRQ_on := $EF;
- turn_IRQ_off := $10;
- IRQ_vector_ofs := $0030;
- IRQ_vector_seg := $0032;
- end
- else
- begin
- turn_IRQ_on := $F7;
- turn_IRQ_off := $08;
- IRQ_vector_ofs := $002C;
- IRQ_vector_seg := $002E;
- end;
-
- sin_store_ptr := 1;
- sin_read_ptr := 1;
- sout_store_ptr := 1;
- sout_read_ptr := 1;
- hold_vector_ofs := memw[$0000:IRQ_vector_ofs];
- hold_vector_seg := memw[$0000:IRQ_vector_seg];
- memw[$0000:IRQ_vector_ofs] := ofs(async_intr_handler);
- memw[$0000:IRQ_vector_seg] := CSeg;
- datasegment := DSeg;
- int_enable_reg := base_com_addr + 1;
- int_ident_reg := base_com_addr + 2;
- modem_control_reg := base_com_addr + 4;
- line_status_reg := base_com_addr + 5;
-
- read_config_file;
-
- baud := default_baud; { Inialize the serial port. }
- stopbits := default_stopbits;
- databits := default_databits;
- par := default_parity;
- setserial(baud,stopbits,databits,paritytype(par));
- exit_program := false;
- half_duplex := false;
-
- dial_str := modem_init_str;
- dialer;
- dial_str := '';
- dial_drive := ord(default_drive) - ord('A') + 1;
- getdir(dial_drive,dial_PATH);
- if dial_PATH[length(dial_PATH)] <> '\' then
- dial_PATH := dial_PATH + '\';
- initialize_function_keys;
-
- mkwin(2,2,79,22,'TMODEM, ver 1.7');
- writeln;
- writeln;
- writeln;
- writeln;
- writeln;
- writeln(' Falcon Software Co.');
- writeln(' 2222 E. Beardsley Rd.');
- writeln(' Phoenix, Arizona 85027');
- writeln;
- writeln;
- writeln;
- writeln;
- writeln;
- writeln;
- writeln;
- writeln;
- writeln;
- escape_win;
- gotoxy(19,23);
- write('Copyright (c) 1987 by: Falcon Software Co.');
- reset_win;
-
- write('Press a Key ');
- repeat
- until keypressed;
- read(kbd,kbd_char);
- display_prompts;
- sin_store_ptr := sin_read_ptr;
- rmwin;
- repeat
- terminal_processor;
- until exit_program;
-
- port[int_enable_reg] := 0; { Turn off modem and reset }
- port[modem_control_reg] := 0; { vectors. }
- port[$21] := port[$21] or turn_IRQ_off;
- memw[$0000:IRQ_vector_ofs] := hold_vector_ofs;
- memw[$0000:IRQ_vector_seg] := hold_vector_seg;
-
- if capture_flag then toggle_capture_mode;
- window(1,1,80,25);
- normvideo;
- gotoxy(1,25);
- clreol;
- write('End of Program.');
- end.