{********** send.inc **********} { send file } var CRC, checksum : integer; procedure calcCRC(b: byte); var carry: boolean; i: byte; begin checksum:= lo(checksum + b); for i:= 0 to 7 do begin carry:= (CRC and $8000) <> 0; CRC:= CRC shl 1; if (b and $80) <> 0 then CRC:= CRC or $0001; if carry then CRC:= CRC xor $1021; b:= lo(b shl 1); end; end; {calcCRC} procedure send_it; label loop2; var inch, ch, ch1: char; blocknum, numberofrecords, min, sec, tries: integer; Loop: byte; done, crcOn: boolean; buffer: array[1..128] of byte; function roundUp(numb: real): integer; {roundUp to next whole number if numb not whole number} begin if numb <> Trunc(numb) then numb:= numb+1; roundUp:= Trunc(numb); end; {roundUp} procedure send_time(numberofrecords: integer; var min, sec: integer); {compute file send time re. ROS32.PAS} var time: real; begin time:= 0.02075 * numberofrecords; if not hiBaud then time:= time * 4; min:= trunc(time); sec:= round(60.0 * frac(time)); if sec = 60 then begin min:= min + 1; sec:= 0; end; end; {send_time} procedure sendcalc(b: byte); begin xmit(b); calcCRC(b); end; {sendcalc} procedure acknak(var inch: char; time: integer); label lbl; var loop, loopend: integer; begin loopend:= 100 * time; loop:= 0; inch:= '0'; repeat delay(10); if keypressed then begin read(kbd, inch); if inch <> CAN then inch:= '0' else goto lbl; end; until modem_in_ready or not carrier or (loop >= loopend); inch:= modem_in; LBL: if not (inch in [ACK, NAK, CAN, 'C', 'K']) then inch:= '0'; end; {acknak} begin {send_it} openFile(sourceName); numberofrecords:= fileSize(sourceFile); send_time(numberofrecords, min, sec); write(numberofrecords, ' records (', roundUp(numberofrecords/8), 'k) '); write('[', min, ' minute'); if min <> 1 then write('s'); write(' ', sec, ' second'); if sec <> 1 then write('s'); writeln(']'); crcOn:= false; done:= false; tries:= 0; blocknum:= 1; blockread(SourceFile, buffer, 1); acknak(inch, 60); repeat if inch = 'C' then acknak(inch, 60); if inch = 'K' then write('k'); if inch in ['C', 'K'] then CrcOn:= true; if inch = 'C' then write('c'); until inch in ['C', 'K', NAK, CAN]; {now do block} repeat if inch = ACK then begin write(CR, blocknum); clrEol; if eof(SourceFile) then done := true else begin blockread(SourceFile, buffer, 1); blocknum:= blocknum +1; tries:= 0 end; end else begin write('.'); tries:= tries + 1; end; if not (inch in [CAN]) { '0'])} and carrier and not done then begin {send block number} modem_out(SOH); xmit(lo(blocknum)); xmit(not lo(blocknum)); checksum:= 0; CRC:= 0; {send block} for loop:= 1 to 128 do sendcalc(buffer[loop]); calcCRC(0); calcCRC(0); if crcOn then begin xmit(hi(CRC)); xmit(lo(CRC)); end else xmit(checksum); end; acknak(inch, 60); until (inch = CAN) or done or not carrier or (tries > 30); {wrap it up} repeat modem_out(EOT); sinp(ch1); if ch1 = ^X then goto loop2; tries:= tries + 1; until modem_in_ready {(modem_in = ACK)} or not carrier or (tries > 10); writeln(BELL); writeln('++ transfer completed ++'); LOOP2: close(sourceFile); eraseOK:= false; writeln; terminal_mode; end; {send_it} procedure send_a_file; label re_name; var sas: boolean; begin write('SEND file'); delete(line,1,1); sas:= false; if upCase(line[1]) = 'A' then begin sas:= true; writeln(' (ASCII)'); end else writeln; writeln; timein; re_name: write('Enter NAME of file to send: '); readln(temp1); upper(temp1); if temp1[1] in [^@..' '] then temp1:= ''; if length(temp1)>0 then sourceName:= temp1 else begin writeln; eraseOK:= false; terminal_mode; end; if not findfile(sourceName) then begin writeln('++ file ', sourceName, ' not found ++'); goto re_name; end; if sas = true then send_ascii else send_it; end;