*DECK NETXFRC *IF DEF,XFR USETEXT AIPDEF USETEXT NP$GETS USETEXT HEADER USETEXT NP$NWL USETEXT NP$TAA USETEXT NX$ACBX USETEXT NX$ACBF USETEXT NX$MSG PROC NETXFRC; # *1DC NETXFRC * * 1.PROC NAME AUTHOR DATE * NETXFRC L.T.NGUYEN 83/03/25 * * 2.FUNCTINAL DESCRIPTION: * CONTINUE TO PROCESS FILE TRANSFER UNTIL ENCOUNTER * A NULL BLOCK. * * 3.METHOD : * SET MORETODO = TRUE * LOOP UNTIL MORETODO IS FALSE: * GET BLOCK FROM LIST 1. * IF BLOCK TYPE IS NULL * THEN SET MORETODO = FALSE. * ELSE * CALL PRDATA FOR APPROPRIATE ACTION BY STATE TABLE * PROCESSOR. * END OF LOOP * * GET CURRENT TIME. * CHECK FOR TIME EXPIRED. * IF TIME EXPIRED * THEN CALL STATE TABLE PROCESSOR WITH TIME OUT TRIGGER. * RETURN. * * 4.INPUT PARAMS: * FTTINDEX - INDEX INTO FTT TABLE ( GLOBAL ). * * 5.EXIT PARAMS: * NONE. * * 6.PROC CALLED: * NP$GET - TO GET BLOCK. * PRDATA - PROCESS DATA. * * * * # BEGIN XREF BEGIN PROC NP$MSG ; PROC NP$SMSG ; PROC NP$DATA; PROC NP$GET ; PROC NP$XLOC ; PROC NP$RCL; PROC NP$RTIM ; PROC NP$STPR ; END SWITCH ST$ORD ST$ORD0,ST$ORD1,ST$ORD2,ST$ORD3,CALL$ST,ST$ORD4 ; ITEM I ; ITEM BTRIG ; ITEM TRIGGER U ; MORETODO = TRUE ; # ASSUMING THERE IS THINGS TO DO # FOR I = I WHILE MORETODO AND (ID$FLAG NQ 0) AND (SD$FLAG EQ 0) AND (HEAD EQ FOOT) DO BEGIN # LOOP TO GET BLOCK # ACLN = XFR$LIST ; # GET ONLY FROM XFR (1) LIST # LOC$HA = LOC(DATA$WORD[0]); # APPL. BLOCK HEADER # LOC$TA = LOC(DATA$WORD[1]); # TEXT AREA # TLMX = MXIVT$SIZE ; # MAX BLOCK SIZE # OPCODE = OP$GETL ; NWL[NEXT] = 0 ; NWL$TA[NEXT] = LOC$TA ; BS = OPABHSIZ ; NP$GET ; # GO GET IT # P
= LOC$HA ; IF ABHABT[0] EQ APPNULL THEN MORETODO = FALSE ; # LIST FOR XFR IS EMPTY # ELSE BEGIN NP$XLOC(ABHADR[0]) ; # LOCATE THE FTT ENTRY # IF ABHABT[0] EQ APPCMD THEN NP$SMSG ; ELSE NP$DATA ; # CALL TO PROCESS APPROPRIATELY # END END # LOOP TO GET # FOR I = 0 STEP 1 WHILE I LS MAXFILEXFR DO BEGIN # LOOP TO FIND TIME OUT CONN. # FTTINDEX = I ; P = FTTSTATUS[I] ; IF FTTACN[I] NQ 0 AND STATUSWD LQ IN$PROG # NO ERROR FOUND YET # THEN BEGIN # ACTIVE ENTRY # NP$RTIM(TIME$WORD) ; IF (FTTTIME[I] + FTTTIMOUT[I]) LQ TIME$SEC[0] THEN BEGIN # TIMEOUT DETECTED # GOTO ST$ORD[FTTSTORD[I]] ; ST$ORD0: # SENDER/PRU # IF FTTSTATE[I] NQ NSPDATR THEN BEGIN # NOT IN DATA PHASE # TRIGGER = NRSTIMO; # TIME OUT TRIGGER # GOTO CALL$ST ; END ELSE GOTO ST$ORD4 ; ST$ORD1: # RECEIVER/PRU # IF FTTSTATE[I] NQ NRPPRDA THEN BEGIN # NOT IN DATA PHASE # TRIGGER = NRSTIMO; # TIME OUT # GOTO CALL$ST ; END ELSE GOTO ST$ORD4 ; ST$ORD2: TRIGGER = NSCTIMO; # SENDER/CHARACTER # GOTO CALL$ST; ST$ORD3: TRIGGER = NRCTIMO; # RECEIVER/CHARACTER # GOTO CALL$ST; CALL$ST: # READY TO CALL STATE TABLE # NP$STPR(FTTINDEX,TRIGGER,0) ;# CALL THE PROCESSOR # ST$ORD4: # CONTINUE THE FOR LOOP. # END # TIME OUT DETECTED # ELSE BEGIN # NO TIME OUT # IF FTTSTORD[I] EQ CHARSEND # CHAR SENDER # THEN BEGIN IF FTTSTATE[I] EQ NSCCABL # WAITING FOR WINDOW OPEN # THEN BEGIN NP$RCL(0); # TIME RECALL # END ELSE BEGIN IF FTTSTATE[I] EQ NSCDATA # IN DATA STATE # THEN BEGIN # IN SENDING DATA MODE # TRIGGER = NSCTSND ; # SEND TRIGGER TO STATE TABLE # FOR I = I WHILE TRIGGER NQ NIL DO BEGIN # LOOP UNTIL NO BACK TRIGGER # NP$STPR(FTTINDEX,TRIGGER,BTRIG) ; TRIGGER = BTRIG ; END END END END # ACTIVE ENTRY # END # LOOP TO FIND TIME OUT CONN. # END END RETURN; END TERM *ENDIF