home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
enterprs
/
cpm
/
terms
/
mite301.lbr
/
TEXTP.FQR
/
TEXTP.FOR
Wrap
Text File
|
1993-05-08
|
6KB
|
269 lines
C
C TEXTP - The Text Protocol
C
C This program is designed to run on a mainframe or minicomputer
C and interact with the TEXT protocol in the MITE data communications
C package. The protocol allows verified transmission of data into
C environments that ordinarily are unable to perform verified transfers
C of information.
C
C Because of the extreme variety of systems on which this program
C may be implemented, this program is only a starting point. The
C checksum routine will need extensive modification if the mainframe
C is not using ASCII representations. The input/output will need to be
C modified in most instances. What this program is intended to be is
C complete documentation for the mainframe side of the protocol and an
C aid in implementing a version in a specific environment.
C
C This version of TEXTP is written in Microsoft Fortran under CP/M-80.
C
C Developed October 1983 by:
C
C Donald Waldo
C Mycroft Labs, Inc.
C P.O. 6045
C Tallahassee, FL
C 32314
C
byte ifn(11)
5 write(1,10)
10 format(' Send (1) or Receive (2)?')
read(1,15)iopt
15 format(i1)
if((iopt.ne.1).and.(iopt.ne.2)) goto 5
write(1,20)
20 format(' Enter Filename')
read(1,25)ifn
25 format(11a1)
call open(5,ifn,0)
if(iopt.eq.1)call send
if(iopt.eq.2)call recv
endfile 5
goto 5
end
C
C
C
C
C Text file protocol - Receive
C
C This subroutine receives a file using the TEXT
C file protocol.
C
subroutine recv
integer*4 n,ick1,ick2,icksum,iconv,ick3
byte line(150)
data iE/69/ iA/65/ iN/78/ iX/88/
C
C Initialize expected message number
C
msgnum=0
C
C Main loop - read lines and verify them.
C Each line transmitted by MITE starts with a 'D'. This is followed
C by a 1 digit message number which helps improve error detection.
C Following the message number is a 3 digit count of the number of
C data characters on the line. This is followed by a 5 digit (16 bit)
C checksum. The checksum is a 16 bit sum of all characters on
C the line not including the checksum itself. It is computed
C by summing the ASCII representation of the characters and
C ignoring overflow. The checksum is followed by the data characters.
C
30 read(1,12)line
12 format(150a1)
C
C All done if 1st char = 'E'
C
if(line(1).eq.iE) goto 900
C
C Aborted if 1st char = 'X'
C
if(line(1).eq.iX) goto 900
C
C Get no. chars on line
C
n=iconv(line,3,3)
if(n.lt.0) goto 40
C
C compute checksum and verify against received value
C
ick1=iconv(line,6,5)
if(ick1.lt.0) goto 40
ick2=icksum(line,1,5)
j=n
ick3=icksum(line,11,j)
ick2=ick2+ick3
if(ick2.ne.ick1) goto 40
C
C Verify message number
C
ick3=iconv(line,2,1)
msg=ick3
if(msg.eq.msgnum)goto 34
if(msg.eq.msgnum-1)goto 36
if((msgnum.eq.0).and.(msg.eq.9)) goto 36
goto 50
C
C Line is good. Write to disk and acknowlege.
C
34 k=n+11
write(5,35)(line(i),i=11,k)
35 format(150a1)
msgnum=msgnum+1
if(msgnum.eq.10)msgnum=0
36 write(1,37)
37 format(3h RA/)
goto 30
C
C Something went wrong. Request that the line be retransmitted.
40 write(1,42)
42 format(3h RN/)
goto 30
C
C Error - abort transmission
C
50 write(1,52)
52 format(3h RX/)
C
C Transmission complete.
C
900 return
end
C
C
C
C
C
subroutine send
C
C Text file protocol send.
C
C The data lines sent to MITE follow the same format described above.
C
integer*4 icnt,ichk,iconv,icksum
byte line(80),line2(80)
data izero/48/ iblank/32/ iA/65/ iD/68/ iN/78/ iX/88/
C
C Wait for OK from micro before sending first line.
C
read(1,20)line
msgnum=-1
C
C Get line from file
C
15 read(5,20,end=50)line
20 format(80a1)
C
C Increment message number, but keep in range 0-9
C
msgnum=msgnum+1
if(msgnum.eq.10)msgnum=0
C
C determine count
C
i=80
24 if((line(i).ne.iblank).or.(i.eq.0)) goto 30
i=i-1
goto 24
30 icnt=i
C
C Blank-fill output buffer
C
do 32 i=1,80
32 line2(i)=iblank
C
C compute checksum
C
line2(1)=iD
line2(2)=msgnum+izero
call putnum(icnt,line2,3,3)
j=10+icnt
do 35 i=11,j
35 line2(i)=line(i-10)
j=icnt+5
ichk=icksum(line2,1,5)
ichk=ichk+icksum(line2,11,icnt)
call putnum(ichk,line2,6,5)
40 write(1,45)line2
45 format(1X,80a1/)
C
C Get ack or nak
C
read(1,20)line
if(line(2).eq.iN) goto 40
if(line(2).eq.iX) goto 60
if(line(2).ne.iA) goto 60
goto 15
50 write(1,55)
55 format(2h E)
return
60 write(1,65)
65 format(2h X)
return
end
C
C
C
subroutine putnum(num,ibuf,ist,ilen)
integer*4 ipwr,num,itemp
byte ibuf(150)
data izero/48/
iptr=ist
itemp=num
ipwr=1
j=ilen-1
do 5 i=1,j
5 ipwr=ipwr*10
10 j=itemp/ipwr
ibuf(iptr)=j+izero
itemp=itemp-j*ipwr
ipwr=ipwr/10
iptr=iptr+1
if(iptr.lt.ist+ilen)goto 10
return
end
C
C
C
integer*4 function icksum(ibuf,ist,len)
byte ibuf(150)
integer*4 k,maxint
C
C This function computes a checksum as described above.
C
maxint=2**16-1
k=0
j=ist+len-1
do 10 i=ist,j
k=k+ibuf(i)
if(k.gt.maxint)k=k-maxint-1
10 continue
icksum=k
return
end
C
C
C
integer*4 function iconv(ibuf,ist,len)
byte ibuf(150)
data izero/48/ iblank/32/
ipw=10**(len-1)
k=0
j=ist+len-1
do 10 i=ist,j
ich=ibuf(i)
C
C Convert blanks to zeros
C
if(ich.eq.iblank)ich=izero
n=ich-izero
if((n.lt.0).or.(n.gt.9)) goto 99
k=k+ipw*n
ipw=ipw/10
10 continue
iconv=k
return
99 iconv=-1
return
end