*DECK     NVFTICR 
USETEXT          TEXTNVF
USETEXT          TXTANVF
USETEXT          TEXTSS 
  
PROC NVFTICR(SWTESS); 
# TITLE NVFTICR - ISSUE CPM REQUEST                                    #
  
      BEGIN  # NVFTICR #
# 
**    NVFTICR - ISSUE CPM REQUEST.
* 
*     E. THAVIKULWAT    81/10/13
*     C. BRION          83/02/15,83/05/05,83/09/08,83/12/08.
* 
*     THIS PROCEDURE ISSUES CPM 56B, CPM73B, DSP ROUTE FUNCTION 
*     REQUESTS, GET FILE REQUESTS AND GETLIDC/GETPIDA/SETPIDA 
*     FUNCTION CALLS AND IS CALLED INTO EXECUTION BY THE STATUS 
*     WORKLIST PROCESSOR. 
* 
*     PROC NVFTICR(SWTESS)
* 
*     ENTRY:  
*       SWTESS  = STATUS WORKLIST MONITOR ARRAY.
*       CPMRQ   = CPM REQUEST QUEUE.
* 
*     EXIT: 
*       APPROPRIATE FUNCTION REQUEST ISSUED AND PARAMETERS
*       SET DEPENDING ON WHAT EVENT IS TO RESTART THIS PROCEDURE. 
* 
*     NOTES:  
*       ONLY ONE REQUEST CAN BE OUTSTANDING AT ANY ONE TIME, THUS 
*       IF THE REQUEST IS NOT COMPLETED IMMEDIATELY, RETURN PARAMETERS
*       ARE SET UP TO WATCH FOR COMPLETE BIT AND ROUTINE EXITS.  IF THE 
*       REQUEST IS COMPLETED IMMEDIATELY, THE NEXT ENTRY IN THE *CPMRQ* 
*       QUEUE IS PROCESSED.  IF *CPMRQ* QUEUE HAS BEEN EXHAUSTED, 
*       RETURN PARAMETERS ARE SET UP TO WATCH THE INTERRUPT WORD
*       *INVTICR* ASSOCIATED WITH *CPMRQ* QUEUE.
* 
*     METHOD: 
*       IF COMPLETE BIT SET AND REQUEST IS A CPM 56B (VALID) REQUEST, 
*       ENTER THE RETURNED PARAMETER BLOCK INTO THE REQUESTED DESTINA-
*       TION QUEUE (EITHER THE T-A VDATAQ OR THE A-A AAVDATAQ). COMP- 
*       PLETED DFC, DSP ROUTE REQUESTS, AND GET REQUESTS ARE IGNORED. 
* 
*       CALL *SSTRQE* TO COPY ENTRY FROM *CPMRQ* QUEUE TO WORKING 
*       BUFFER AND ISSUE APPROPRIATE CPM REQUEST. 
# 
  
# 
****  PROC NVFTICR - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC DFC;            # DECREMENT FAMILY COUNT                  #
        FUNC GETFIL     I;   # GET FILE MACREL FUNCTION                #
        PROC GLIDC;          # MACREL GET LID CONFIGURATION            #
        PROC GPIDA;          # MACREL GET PID ATTRIBUTES               #
        PROC SPIDA;          # MACREL SET PID ATTRIBUTES               #
        PROC JROUTE;         # ROUTE MACREL ROUTINE                    #
        PROC NVFUMQE;        # TRANSFER TEXT TO QUEUE                  #
        PROC SSTRQE;         # TRANSFER QUEUE ENTRY TO FIXED BUFFER    #
        PROC VALIDU;         # VALIDATE TERMINAL USER                  #
        PROC SSTATS;         # SS - ALLOCATE TABLE SPACE               #
        PROC SSTRTS;         # SS - RELEASE TABLE SPACE                #
        END 
  
# 
****
# 
  
      DEF  LENGTH$  #(CPMSIZ$+1)*10#;  # NUMBER OF CHARACTERS          #
      DEF  SETNWST$ # 1 #;   # SET NW STATUS FUNCTION CODE             #
  
*CALL SWTESS
  
  
      ITEM I          I;     # LOOP VARIABLE                           #
      ITEM J          I;     # LOOP VARIABLE                           #
      ITEM ADDR       I;     # ADDRESSING INFORMATION FOR ABH          #
      ITEM NUMWRDS    I;     # NUMBER OF WORDS TO COPY                 #
      ITEM GETSTAT    I;     # RETURN STATUS FROM GETFIL CALL          #
      ITEM AX         I;     # ACPID TABLE INDEX WORD ORDINAL          #
      ITEM BUFSIZ     I;     # SIZE OF ACPID TABLE REQUIRED            #
      ITEM FXADDR     I;     # ADDR OF PARAMETER RECORD                #
      ITEM PTR        I;     # POINTER OF IFMC TABLE                   #
      ITEM FFN        B;     # FOUND FAMILY NAME                       #
  
# 
*     THE FOLLOWING ARRAY IS USED FOR SAVING THE INCOMING FUNCTION RE-
*     QUEST AND ASSOCIATED PARAMETERS.
# 
      ARRAY FUNCTYP[00:00] S(3);
        BEGIN 
        ITEM FCT$WORD   U(00,00,60);   # FULL WORD REFERENCE           #
        ITEM FCT$WORD1  U(01,00,60);   # FULL WORD 1 REFERENCE         #
        ITEM FCT$FC     U(00,00,06);   # CPM REQUEST FUNCTION CODE     #
        ITEM FCT$SFC    U(00,06,06);   # GET FILE SUB FX CODE          #
        ITEM FCT$VCB    U(00,24,12);   # ACN FOR CPM REQUEST           #
        ITEM FCT$QNUM   U(00,42,18);   # Q NUMBER FOR CPMDATA Q # 
        ITEM FCT$LID    C(01,00,03);   # 3 CHAR LID VALUE              #
        ITEM FCT$PID    C(01,18,03);   # 3 CHAR PID VALUE              #
        ITEM FCT$BSIZ   U(01,36,13);   # DICTATED BUFFER SIZE-LPID FX  #
        ITEM FCT$NWST   U(01,56,04);   # NETWORK STATUS                #
        ITEM FCT$WORD2  U(02,00,60);   # FULL WORD 2 REFERENCE         #
        ITEM FCT$IFCTF  B(02,58,01);   # INCREMENT FAMILY COUNT FALG   #
        END 
  
# 
*     TEMPSTOR - WORKING STORAGE BASED ARRAY. 
# 
  
      BASED ARRAY TEMPSTOR [00:00] S(1);
        BEGIN 
        ITEM DUMY     U(00,00,60);     # WORD REFERENCE # 
        END 
  
# 
**    GETPARM - ARRAY FOR THE LOCAL AND PERMANENT FILE NAMES. 
# 
      ARRAY GETPARM [00:00] S(2); 
        BEGIN 
        ITEM GET$WORD0  U(00,00,60);
        ITEM GET$WORD1  U(01,00,60);
        ITEM GET$LFN    C(00,00,07);     # LOCAL FILE NAME             #
        ITEM GET$PFIX   C(01,00,02)=["ZZ"]; # ZZ PREFIX FOR FILE NAME  #
        ITEM GET$RPFN   C(01,12,05);     # 5 CHAR APPL NAME SFIX       #
        ITEM GET$PFN    C(01,00,07);     # FULL PERM FILE NAME         #
        END 
  
# 
**  THE FOLLOWING BASED ARRAY POINTER POINTS TO THE NEW IFMC ENTRY
# 
      BASED ARRAY BIFMC[00:00] S(1);
        BEGIN 
        ITEM BFMC$WORD U(00,00,60);    # FULL WORD REFERENCE           #
        END 
      CONTROL EJECT;
  
  
  
# 
*     IF THE WAITCPM FLAG IS TRUE UPON ENTRY, THEN A FUNCTION 
*     REQUEST HAS COMPLETED. CALL INTERNAL PROCEDURE REQCOMP TO 
*     COMPLETE THE POST REQUEST RESPONSIBILITIES. 
*     IF FXACTIVE FLAG (FUNCTION ACTIVE) IS TRUE, COMPLETION
*     STATUS MUST BE CHECKED PRIOR TO ANOTHER FUNCTION REQUEST
*     BEING REMOVED FROM THE CPMRQ FOR PROCESSING.
# 
  
      IF WAITCPM
      THEN
        BEGIN 
        WAITCPM = FALSE;
        FXACTIVE = FALSE; 
        REQCOMP;
        END 
  
      IF NOT FXACTIVE 
      THEN
        BEGIN 
# 
*     PROCESS ENTRY FROM *CPMRQ* QUEUE IF ANY.
# 
        FOR I = 0 WHILE CPMLNGTH NQ 0 
        DO
          BEGIN 
# 
*       CLEAR CPM PARAMETER BLOCK.
# 
          FOR J = 0 STEP 1 UNTIL CPMSIZ$
          DO
            BEGIN 
            CPB$WORD[J] = 0;
            END 
# 
*       TRANSFER REQUEST TO WORKING BUFFER.  SET UP FUNCTION REQUEST
*       PARAMETER BLOCK AND GENERATE REQUEST. 
# 
  
          SSTRQE(P<CPMRQ>,WCBUF,ABHBUF,MSGBUF); 
          FCT$WORD[0] = MSG$WORD[0];     # SAVE FC AND ACN             #
          FCT$WORD1[0] = MSG$WORD[1];    # SAVE LID/PID INFO IF PRESENT#
          FCT$WORD2[0] = MSG$WORD[2];    # SAVE INCREMENT FAM COUNT INF#
          NUMWRDS     = WCB$WC[0] - 3;   # LESS WC,ABH, AND FC WORD    #
          FOR J = 0 STEP 1 UNTIL (NUMWRDS - 1)
          DO
            BEGIN 
            CPB$WORD[J] = MSG$WORD[J+1];
            END 
  
          IF FCT$FC[0] EQ CPM56B$ 
          THEN                           # VALIDATE REQUEST            #
            BEGIN 
            VALIDU(CPMBUF); 
            END 
          ELSE IF FCT$FC[0] EQ CPM73B$   # DECREMENT FAMILY COUNT REQ  #
          THEN
            BEGIN 
# 
*      BEFORE CALLING DFC TO DECREMENT FAMILY COUNT, SEARCH IFMC TABLE, 
*      FIND THE RIGHT ENTRY AND DECREMENT THE COUNT FIELD BY 1. 
# 
            FOR J=0 STEP 1 UNTIL (IFCLNGTH-1) 
            DO
              BEGIN 
              IF IFMC$FNAM[J] EQ CPB$FNAM[0]
              THEN
                BEGIN 
                IFMC$COUNT[J]=IFMC$COUNT[J]-1;
                IF IFMC$COUNT[J] EQ 0 
                THEN
                  SSTRTS(P<IFMC>,J,1);
                END 
              END 
            DFC(CPMBUF);
            END 
          ELSE IF FCT$FC[0] EQ DSPROUTE$ # DSP ROUTE FUNCTION          #
          THEN
            BEGIN 
# 
*     ROUTE OF FILE TO AUTO START AN APPLICATION REQUEST. 
*     MUST PERFORM GET ON ZZ FILE TO GET THE FILE FOR ROUTING.
# 
            FCT$SFC[0] = GETFC$;
            GET$WORD0[0] = 0; 
            GET$WORD1[0] = 0; 
            GET$PFIX[0] = "ZZ"; 
            GET$LFN[0] = C<0,7>CPB$WORD[0]; 
            GET$RPFN[0] = C<0,5>GET$LFN[0]; 
            GETSTAT = 0;
  
# 
*     LFN AND PFN SET. MAKE GETFIL FUNCTION CALL THAT RESULTS IN A GET
*     OF THE PERMANENT FILE WITH RECALL.
*     ON RETURN, FILE EITHER LOCAL OR FUNCTION STATUS INDICATES ERROR.
*     SIMULATE THE COMPLETE BIT BEING SET TO CONTINUE.
# 
            GETSTAT = GETFIL(GET$LFN[0],GET$PFN[0]);
            CPB$CBIT[0] = TRUE; 
            END 
          ELSE
            BEGIN 
  
# 
*     MUST BE A LID/PID FUNCTION REQUEST. 
*     SET ACPID TABLE INDEX,
*     ALLOCATE DICTATED SIZE FOR TABLE, 
*     INITIALIZE THE TABLE ENTRY WHICH ACTS AS THE PARAMETER BLOCK
*     FOR THE FUNCTION REQUEST CALL.
# 
            AX = ACPIDL;
            BUFSIZ = FCT$BSIZ[0]; 
            SSTATS(P<ACPID>,BUFSIZ);
            ACP$WORD0[AX] = 0;
            ACP$WORD1[AX] = 0;
            ACP$WORD2[AX] = 0;
            ACP$WORD3[AX] = 0;
            ACP$SMID[AX] = FCT$FC[0]; 
            ACP$ESIZ[AX] = BUFSIZ;
            ACP$VCB[AX] = FCT$VCB[0]; 
            ACP$CBIT[AX] = TRUE;
            FXADDR = LOC(ACPID[AX]) + 2;
# 
*     FUNCTION INDEPENDENT INITIALIZATION DONE. 
*     PERFORM FUCTION DEPENDENT SETUP OF PARAMETER BLOCK. 
# 
  
# 
*     IF GETLIDC REQUEST. 
*     ISSUE CALL TO MACREL ROUTINE GLIDC TO PERFORM THE GETLIDC CALL. 
# 
            IF FCT$FC[0] EQ GLIDCFC$
            THEN
              BEGIN 
              ACP$GLCWC[AX] = BUFSIZ - 2; 
              ACP$GLCLID[AX] = FCT$LID[0];
              GLIDC(FXADDR);
              END 
# 
*     IF GETPIDA REQUEST. 
*     ISSUE CALL TO MACREL ROUTINE GPIDA TO PERFORM THE GETPIDA CALL. 
# 
            ELSE IF FCT$FC[0] EQ GPIDAFC$ 
            THEN
              BEGIN 
              ACP$GPAPID[AX] = FCT$PID[0];
              GPIDA(FXADDR);
              END 
# 
*     IF SETPIDA REQUEST. 
*     ISSUE CALL TO MACREL ROUTINE SPIDA TO MAKE SETPIDA CALL.
# 
            ELSE IF FCT$FC[0] EQ SPIDAFC$ 
            THEN
              BEGIN 
              ACP$FC[AX] = SETNWST$;
              ACP$SPANP[AX] = 1;
              ACP$SPANWID[AX] = TRUE; 
              ACP$SPAPID[AX] = FCT$PID[0];
              ACP$SPAST[AX] = FCT$NWST[0];
              SPIDA(FXADDR);
              END 
# 
*     SET THE COMPLETE BIT TRUE SINCE THESE FUNCTION REQUESTS ARE 
*     ISSUED WITH AUTO RECALL (CONTROL LOST UNTIL COMPLETE).
# 
            CPB$CBIT[0] = TRUE; 
            END 
  
# 
*     IF FUNCTION REQUEST COMPLETED, ISSUE CALL TO INTERNAL PRO-
*     CEDURE REQCOMP TO PERFORM THE POST REQUEST PROCESSING.
# 
  
COMPCHECK:  
  
        IF CPB$CBIT[0]
        THEN
          BEGIN 
          CPB$CBIT[0] = FALSE;
          FXACTIVE = FALSE; 
          REQCOMP;
          END 
        ELSE
          BEGIN                        # CPM REQUEST NOT YET DONE      #
          WAITCPM = TRUE; 
          STE$ADDR1[0] = LOC(CPMBUF); 
          STE$ADDR2[0] = 0; 
          STE$RTN[0]   = LOC(NVFTICR);
          STE$INIT1[0] = CPB$WORD[0]; 
          STE$CBIT1[0] = FALSE;        # INSURE COMPLETE BIT IS CLEAR  #
          RETURN;                      # EXIT                          #
          END 
# 
*     CHECK IF FUNCTION PIGGYBACKED AND ACTIVE. 
*     IF SO, RETURN TO CHECK IMMEDIATE COMPLETION.
# 
        IF FXACTIVE 
        THEN
          GOTO COMPCHECK; 
  
        END  # END FOR I LOOP # 
  
# 
*     NO MORE ENTRIES IN *CPMRQ* QUEUE.  SET RESTART CONDITION TO WATCH 
*     INTERRUPT WORD *INVTICR* ASSOCIATED WITH *CPMRQ* QUEUE. 
# 
      INVTICR      = 0; 
      STE$ADDR1[0] = LOC(INVTICR);
      STE$ADDR2[0] = 0; 
      STE$RTN[0]   = LOC(NVFTICR);
      STE$INIT1[0] = 0; 
      CPB$CBIT[0] = TRUE; 
      RETURN; 
  
# 
*     END OF NO ACTIVE FUNCTION PROCESSING. 
# 
  
      END # IF NOT FCACTIVE # 
      ELSE
        BEGIN 
        GOTO COMPCHECK; 
        END 
  
  
      CONTROL EJECT;
  
  
PROC REQCOMP; 
# TITLE - REQCOMP - REQUEST COMPLETED PROCESSOR. #
      BEGIN # REQCOMP # 
# 
**    REQCOMP - REQUEST COMPLETED PROCESSOR.
* 
*     C. BRION      83/10/19. 
* 
*     THIS INTERNAL TO NVFTICR PROCEDURE IS RESPONSIBLE FOR THE POST
*     FUNCTION PROCESSING OF REQUESTS.
* 
*     PROC REQCOMP
* 
*     ENTRY:  
*       THE GLOBALS AS DEFINED IN NVFTICR ARE IN EFFECT.
* 
*     EXIT: 
*       IF A VALIDATE REQUEST 
*         MAKE QUEUE ENTRY CONTAINING RETURN CPM PARAMETERS TO SPECIFIED
*         / QUEUE.
* 
*       IF ROUTE REQUEST AND GET FILE FUNCTION COMPLETE 
*         ISSUE ANOTHER REQUEST FOR THE ROUTE OF FILE.
*         SET FUNCTION ACTIVE FLAG (FXACTIVE) TRUE
* 
*       IF A LID/PID FUNCTION 
*         IF NOT A SETPIDA FUNCTION 
*           MAKE QUEUE ENTRY CONTAINING COMPLETED FUNCTION REQUEST
*           / TO THE SPECIFIED QUEUE. 
*         OTHERWISE 
*           RELEASE ACPID TABLE SPACE FOR REQUEST.
  
# 
  
      CONTROL EJECT;
  
# 
*     IF VALIDATE FUNCTION COMPLETED
*       ISSUE COMPLETED PARAMETER BLOCK TO INDICATED QUEUE. 
# 
      IF FCT$FC[0] EQ CPM56B$ 
      THEN
        BEGIN 
        IF FCT$IFCTF[0] 
        THEN
          BEGIN 
# 
*      SEARCH IFMC TABLE, IF FAMILY NAME ALREADY DEFINED IN THE TABLE,
*      INCREMENT COUNT FIELD OF THAT ENTRY BY 1. IF NOT, PUT A NEW
*      ENTRY INTO THE TABLE AND SET THE COUNT FIELD TO 1. 
# 
          FFN=FALSE;
          FOR J=0 STEP 1 WHILE ((J LS IFCLNGTH) AND (NOT FFN))
          DO
            BEGIN 
            IF IFMC$FNAM[J] EQ CPB$FNAM[0]
            THEN
              BEGIN 
              IFMC$COUNT[J]=IFMC$COUNT[J]+1;
              FFN=TRUE; 
              END 
            END 
          IF NOT FFN
          THEN
            BEGIN 
            PTR=IFCLNGTH; 
            SSTATS(P<IFMC>,1);              # ALLOC SPACE FOR NEW ENTRY#
            P<BIFMC>=LOC(IFMC[PTR]);        # POINT TO NEW IFMC ENTRY  #
            BFMC$WORD[0]=0; 
            IFMC$FNAM[PTR]=CPB$FNAM[0]; 
            IFMC$COUNT[PTR]=1;
            END 
          END 
        ADDR = FCT$VCB[0];
        P<TEMPSTOR> = FCT$QNUM[0];
        NVFUMQE(TEMPSTOR,CPMBUF[0],APPTTX$,ADDR,LENGTH$); 
        END 
# 
*     CHECK IF GET FILE FUNCTION. IF SO, CHECK TERMINATION CODE.
# 
      IF FCT$FC[0] EQ DSPROUTE$ AND FCT$SFC[0] EQ GETFC$
      THEN
        BEGIN 
        FCT$SFC[0] = 0; 
        IF GETSTAT EQ 0 
        THEN
          BEGIN 
  
# 
*     TERMINATION CODE INDICATES NO ERRORS. ISSUE ROUTE FUNCTION. 
# 
          JROUTE(CPMBUF); 
  
          FXACTIVE = TRUE;
          END 
        END 
# 
*     CHECK IF COMPLETED GETLIDC OR GETPIDA REQUEST.
*     IF SO, SEND COMPLETED FUNCTION REQUEST TO AALPID QUEUE. 
# 
      IF FCT$FC[0] EQ GLIDCFC$ OR 
         FCT$FC[0] EQ GPIDAFC$
      THEN
        BEGIN 
        ADDR = FCT$VCB[0];
        P<TEMPSTOR> = FCT$QNUM[0];
        NVFUMQE(TEMPSTOR,FUNCTYP[0],APPTTX$,ADDR,LPIDLEN$); 
        END 
# 
*     CHECK IF COMPLETED SETPIDA REQUEST. 
*     IF SO, RELEASE ACPID TABLE SPACE. 
*     NO NEED TO INFORM OF COMPLETION THRU RETURN QUEUE.
# 
      IF FCT$FC[0] EQ SPIDAFC$
      THEN
        BEGIN 
        SSTRTS(P<ACPID>,AX,FCT$BSIZ[0]);
        END 
  
      END # REQCOMP # 
  
  
      END  # END NVFTICR #
  
TERM
