INTEGER FUNCTION RPACK (LEN,NUM,XDATA) C C **************************************************************** C C KERMIT for the MODCOMP MAXIV operating system C C Compliments of: C C SETPOINT, Inc. C 10245 Brecksville Rd. C Brecksville, Ohio 44141 C C C KERMIT is a copyrighted protocol of Columbia Univ. The authors C of this version hereby grant permission to copy this software C provided that it is not used for an explicitly commercial C purpose and that proper credit be given. SETPOINT, Inc. makes C no warranty whatsoever regarding the accuracy of this package C and will assume no liability resulting from it's use. C C **************************************************************** C C Abstract: Read a packet from the other Kermit. C C MODIFICATION HISTORY C C BY DATE REASON PROGRAMS AFFECTED C C C **************************************************************** C C Author: BOB BORGESON Version: A.0 Date: Oct-86 C C Calling Parameters: C C W LEN - LENGTH OF PACKET C W NUM - PACKET SEQUENCE NUMBER C W XDATA - THE PACKET C C **************************************************************** C C Messages generated by this module : None C C **************************************************************** C C Subroutines called directly : GETLIN, UNCHAR C C **************************************************************** C C Files referenced : None C C **************************************************************** C C Local variable definitions : C C CHKSUM - CALCULATED VALUE OF CHECKSUM C GAPTRY - # OF TIMES WE'VE LOOKED FOR PACKET STARTING WIT SOH C MGAPTRY - MAXIMUM ALLOWED VALUE OF GAPTRY C XTYPE - CODE FOR TYPE OF PACKET C C **************************************************************** C C Commons referenced : KER, KERPAR C C **************************************************************** C C (*$END.DOCUMENT*) C C **************************************************************** C * * C * D I M E N S I O N S T A T E M E N T S * C * * C **************************************************************** C IMPLICIT INTEGER (A-Z) INTEGER*2 XDATA(1), BUFFER(132) C C **************************************************************** C * * C * T Y P E S T A T E M E N T S * C * * C **************************************************************** C C C **************************************************************** C * * C * C O M M O N S T A T E M E N T S * C * * C **************************************************************** C INCLUDE USL/KERCOM INCLUDE USL/KERPMC C C **************************************************************** C * * C * E Q U I V A L E N C E S T A T E M E N T S * C * * C **************************************************************** C C C **************************************************************** C * * C * D A T A S T A T E M E N T S * C * * C **************************************************************** C C C **************************************************************** C C Code starts here : C C !THIS IS THE INPUT CHANNEL TO READ C !A PACKET FROM CH=4 GAPTRY=1 MGAPTRY=2 CHKSUM=0 C C READ ME A PACKET THAT BEGINS WITH A SOH AND ENDS WITH MYEOL C 100 CONTINUE C IF(GAPTRY.GT.MGAPTRY)GO TO 9000 C !GET A PACKET WITHOUT WAITING C !FOR A PROMPT IF(IBMON .NE. YES)STATUS=GETLIN(BUFFER,CH) C C IF TIMEOUT, LOOP C IF(STATUS .EQ. BAD)GO TO 1000 C COUNT=1 C C SKIPS ALL OTHER CHARACTERS UNTIL WE SEE ONE WITH A SOH IN IT C 200 CONTINUE C IF((BUFFER(COUNT).EQ.SOH).OR.(BUFFER(COUNT).EQ.EOS))GO TO 300 C !WAIT FOR A SOH OR EOS COUNT=COUNT+1 GO TO 200 300 CONTINUE C !WE GOT THE SOH IF(BUFFER(COUNT).NE.SOH)GO TO 1000 C C WE GOT A LINE THAT BEGINS WITH A SOH C K=COUNT+1 CHKSUM=BUFFER(K) C !GET THE LENGTH OF THE PACKET LEN=UNCHAR(BUFFER(K))-3 K=K+1 CHKSUM=CHKSUM+BUFFER(K) C !GET THE SEQUENCE NUMBER OF C !THE FRAME PACKET NUM=UNCHAR(BUFFER(K)) K=K+1 C !GET THE DATA TYPE XTYPE=BUFFER(K) CHKSUM=CHKSUM+BUFFER(K) K=K+1 C C GET THE DATA C C ZERO OUT THE XDATA ARRAY DO 400 I=1,132 XDATA(I)=0 400 CONTINUE IF (LEN .LT. 1) GO TO 510 DO 500 J=1,LEN XDATA(J)=BUFFER(K) CHKSUM=CHKSUM+BUFFER(K) K=K+1 COUNT=J 500 CONTINUE 510 CONTINUE C XDATA(COUNT+1)=EOS T=BUFFER(K) C C CALCULATE THE CHECKSUM OF THE INCOMING PACKET C TV1=IAND(CHKSUM,192) TV2=TV1/64 TV3=CHKSUM+TV2 CHKSUM=IAND(TV3,63) C C DOES THE CHECKSUM MATCH? C IF(CHKSUM.EQ.UNCHAR(T))GO TO 600 C !BAD CHECKSUM RPACK=BAD RETURN 600 CONTINUE RPACK=XTYPE RETURN 1000 CONTINUE C C WE GOT THE EOS, THE PACKET HAS NO SOH, READ ANOTHER ONE C GAPTRY=GAPTRY+1 GO TO 100 9000 CONTINUE RPACK=BAD RETURN END