*DECK NP$XFER 
USETEXT AIPDEF
PROC NP$XFER(BASE); 
*IF DEF,IMS 
 #
*1DC  NP$XFER 
* 
*     1. PROC NAME         AUTHOR               DATE
*        NP$XFER           S.KRULEVITCH         77/05/23
* 
*     2. FUNCTIONAL DESCRIPTION 
*        THIS ROUTINE FORMATS A REQUEST TO MOVE THE NWL TO NIP. 
*        IT CALLS NP$OSIF TO MAKE THE ACTUAL OPERATING SYSTEM CALL. 
* 
*     3. THE SUBSYSTEM CALL IS FORMATTED AS FOLLOWS:  
*                            2         3            4 
*                            0         0            2 
*              S     S     C AUTO      SS$ID=NIP    ADDR=BASE=LOC(NWL)
*        NWL[NCTL] CONTAINS THE COMPLETE BIT,ERROR FLAGS,THE RT BITS
*        AND THE WORD COUNT OF THE NWL(MAXIMUM=64=100B).
*        RT BIT 47 SET TO ZERO MEANS THE OPERATING SYSTEM WILL HOLD A 
*        REQUEST UNTIL THE SUBSYSTEM IS ABLE TO ACCEPT IT. SET TO ONE,
*        CONTROL WILL BE RETURNED TO THE USER IF THE SUBSYSTEM IS BUSY. 
*        RT BIT 46 SET TO ONE IMPLIES THAT ERROR FLAGS WILL BE SET AND
*        CONTROL WILL BE RETURNED TO THE USER ON NONFATAL ERRORS. 
*        THE AUTO RECALL BIT WILL BE SET IF THE APPLICATION IS NOT IN 
*        PARALLEL MODE. 
*        IF IT IS A NETON WORKLIST, THE NWL WILL BE ISSUED WITH RECALL
*        (IF APPLICATION IS NOT IN PARALLEL MODE) ON NETON WORKLIST 
*        ENTRY-S COMPLETION BIT.
* 
*     4. ENTRY CONDITIONS 
*        BASE - SET TO THE ADDRESS OF EITHER NWL OR SWL 
*        BUF$LEN[1] - SET TO NUMBER OF WORDS IN WORKLIST
*        ACCEPTED - TRUE IF WORKLIST TRANSFER IS NOT A NETON
*        PARALLEL - SET TRUE IF APPLICATION WANTS TO GAIN CONTROL AS
*                   SOON AS POSSIBLE AFTER NIP HAS BEEN CALLED
* 
*     5. EXIT CONDITIONS
*        BASE - SET TO ADDRESS OF THE ARRAY WHICH CONTAINS (OR WILL 
*        CONTAIN) THE WORKLIST RESPONSE.
*        DEFER$PRO - SET TRUE IF THE COMPLETE BIT, CB[0], IS NOT SET -
*        SO SUPERVISORY MESSAGE PROCESSING WAS DEFERRED 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        AIPDEF    CRCOM     NP$DB     NP$LOF 
*        NP$MODE   NP$NWL    NP$STAT
* 
*     7. ROUTINES CALLED
*        NP$ERR - ERROR PROCESSIMG
*        NP$OSIF - ISSUE OS REQUEST 
*        NP$RCL - RECALL COMPASS ROUTINE
*        NP$SN - INCREMENTS STATISTICS COUNTER
* 
*     8. DAYFILE MESSAGES 
*        NETWORK APPLICATION ABORTED, RC = 51.
*        NP$XFER: NWL HAS OVERFLOWED. 
* 
*        NETWORK APPLICATION ABORTED, RC = 67.
*        NP$XFER: NIP NOT AVAILABLE AT SCP. 
* 
* 
 #                                                                       NAMA614
*ENDIF
   BEGIN
  
# 
      THE FOLLOWING COMMON DECKS ARE COMPILED INLINE IN 
      ORDER TO PRESET THE COMMON BLOCKS.
# 
CONTROL PRESET; 
*CALL CRCOM 
*CALL NP$MODE 
*CALL NP$NWL
*CALL NP$NWNC 
*CALL NP$STAT 
*IF,DEF,DEBUG 
*CALL NP$DB 
*CALL NP$LOF
*ENDIF
*IF DEF,XFR,4 
*CALL NX$ACBF 
*CALL NX$ACBX 
*CALL NX$MSG
*CALL NX$CHAR 
  
  
#                                                                     # 
#     FORMAL PARAMETERS:                                              # 
#                                                                     # 
      ITEM BASE         I;              #ADDRESS OF WORKLIST          # 
#                                                                     # 
#     EXTERNAL ROUTINES CALLED:                                       # 
#                                                                     # 
   XREF BEGIN 
        PROC NP$ERR;                   #ERROR PROCESSOR               # 
        PROC NP$OSIF;                  #ISSUE OS REQUEST              # 
        PROC NP$RCL;                    #RECALL                        #
*IF DEF,STAT
        PROC NP$SN;                     #INCREMENTS STATISTICS COUNTER# 
*ENDIF
        END #XREFS# 
#                                                                     # 
#     LOCAL DECLARATIONS:                                             # 
#                                                                     # 
      XREF ITEM SS$ID  U;    # NIP SCP IDENT #
      ARRAY SSCALL[0] S(1); 
        ITEM
          CTL$WD        I (0),
            SSC         C (0,0,3),
            AUTO        B (0,19,1), 
            SSCP        U(0,20,4),
            SS          U (0,30,12),
            ADDR        U (0,42,18);
      BASED ARRAY PAREA[0:63] S(1); 
        ITEM
          WORD          I (0),
          BUF$LEN       U (0,30,12),
          RSSRIN        I(0,0,36),
          WRDCNT        I(0,36,6),
          RCDC          I(0,42,4),
          RT            I(0,46,2),
          FLAGS         I(0,48,11), 
          OPCD          U(0,54,5),     # WORKLIST OPCODE               #
          CBIT          B(0,59,1);
      ITEM
        N               I;              #TEMPORARY VARIABLE           # 
  
#**********************************************************************#
#                                                                     # 
#     NP$XFER EXECUTION BEGINS HERE                                   # 
#                                                                     # 
      P<PAREA> = BASE;
      IF PARALLEL 
      THEN
        WORD[0] = X"3000";              #SET RT BITS (12 AND 13)      # 
      ELSE
        WORD[0] = X"2000";
#     BIT 12 SET TO ONE IMPLIES THAT THE O/S WILL RETURN CONTROL TO   # 
#     THE USER IF THE SUBSYSTEM IS BUSY.                              # 
      N=BUF$LEN[NHDR];
*IF DEF,DEBUG 
      IF N GR LWL+1                     #WORKLIST HAS OVERFLOWED NWL  # 
      THEN
        BEGIN 
        NP$ERR("51");                  # NAM DEBUG ERROR.              #
        END #N GR WLS#
*ENDIF
  
      WRDCNT[0] = N;
#                                                                     # 
#     SET UP SSC CALL                                                 # 
#                                                                     # 
      CTL$WD = 0; 
      SSC = "SSC";
      AUTO = NOT PARALLEL AND ACCEPTED; 
      SS = SS$ID; 
      ADDR = BASE;
      NP$OSIF(SSCALL);
#                                                                     # 
#     CHECK FLAGS                                                     # 
#                                                                     # 
      IF PARALLEL 
      THEN
  
        BEGIN 
        IF NOT CBIT[0]
        THEN
          BEGIN 
          DEFER$PRO = TRUE; 
          C$FLAG[0] = FALSE;            #OPERATION INCOMPLETE         # 
  
          IF NOT ACCEPTED 
          THEN
            BEGIN                       # IF A NETON WORKLIST TRANSFER #
            IF NWL$CB[NHDR+1] 
            THEN
              BEGIN                     # NETON OPERATION IS COMPLETED #
              DEFER$PRO = FALSE;
              C$FLAG = TRUE;
              N$FLAG = TRUE;
              END 
            END 
  
*IF DEF,STAT
#                                                                     # 
#         UPDATE STATISTICS                                           # 
#                                                                     # 
          NP$SN(TYPE"WLX");             #INCREMENT COUNTER            # 
*ENDIF
          END 
  
        ELSE
          BEGIN 
          DEFER$PRO = FALSE;
          C$FLAG[0] = TRUE;             #OPERATION COMPLETE           # 
*IF -DEF,STAT 
          N$FLAG = NOT CTL$NONAM[NCTL]; 
*ENDIF
*IF DEF,STAT
          IF CTL$NONAM[NCTL]
          THEN
            BEGIN 
            N$FLAG = FALSE;             #NAM NOT AVAILABLE            # 
            NP$SN(TYPE"WLNX");          #INCREMENT COUNTER            # 
            END #NONAM# 
*ENDIF
          IF CTL$BUSY[NCTL] 
          THEN
            BEGIN 
            C$FLAG = FALSE;             #OPERATION INCOMPLETE         # 
            DEFER$PRO = TRUE; 
*IF DEF,STAT
#                                                                     # 
#           UPDATE STATISTICS                                         # 
#                                                                     # 
            NP$SN(TYPE"WLNX");          #INCREMENT COUNTER            # 
*ENDIF
            END 
  
*IF DEF,STAT
          ELSE
            BEGIN 
#                                                                     # 
#           UPDATE STATISTICS                                         # 
#                                                                     # 
            NP$SN(TYPE"WLX");           #INCREMENT COUNTER            # 
            END #PARALLEL SUCCESSFUL WORKLIST TRANSFER# 
  
*ENDIF
          END#CB TRUE#
  
        END #PARALLEL FLAGS SET#
  
      ELSE
        IF OPCD[NHDR+1] NQ OP$OFF 
        THEN                 # THIS WAS NOT A NETOFF WORKLIST          #
          BEGIN 
          IF CTL$NONAM[NCTL]
          THEN               # NAM IS NOT AVAILABLE                    #
            BEGIN 
            IF (ACCEPTED    ) AND       # NETON COMPLETED SUCCESSFULLY #
               (NOT NOABTAPP)           # OKAY TO ABORT APPLICATION    #
            THEN             # NON-NETON WORKLIST TRANSFER HAD FAILED  #
              BEGIN          # ABORT APP SINCE NAM IS GONE             #
              N$AWL[0] = 0;             # CLEAR AWL RESPONSE FLAGS     #
*IF DEF,STAT
              NP$SN(TYPE"WLNX");
*ENDIF
              NP$ERR("67"); 
              END 
            ELSE
              N$FLAG[0] = FALSE; # NAM NOT AVAILABLE                   #
            END 
          ELSE
            BEGIN            # NAM IS AVAILABLE                        #
            IF CTL$BUSY[NCTL] 
            THEN             # NIP HAD NO BUFFER AVAILABLE FOR NWL     #
              BEGIN 
*IF,DEF,STAT
              NP$SN(TYPE"WLNX");  # INCREMENT NO OF REJECTED NWLS      #
*ENDIF
              END 
            ELSE             # NWL WORKLIST RECEIVED BY NIP            #
              BEGIN 
              IF ACCEPTED 
              THEN           # APPLICATION HAS ALREADY NETTED ON       #
                BEGIN 
*IF,DEF,STAT
                NP$SN(TYPE"WLX"); # INCREMENT NO OF SUCCESSFUL NWLS    #
*ENDIF
                END 
              ELSE           # THIS MUST BE NETON NWL ISSUED W/O RECALL#
                BEGIN 
                NP$RCL(LOC(NWL[NHDR+1]));  # WAIT FOR NIP TO PROCESS   #
                END                        #   NETON WORKLIST          #
              END 
*IF DEF,XFR 
            IF XFRWLIST 
            THEN
              BEGIN                # VALIDATING NETXFR CALL            #
              FOR N = N WHILE NOT NWL$CB[NHDR+1]
              DO
                NP$RCL(0) ;        # RECALL UNTILL RESPONSE FROM NAM   #
              END 
*ENDIF
            END 
          END 
  
      RETURN; 
  
   END #NP$XFER#
TERM
