*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