*DECK     NVFTDSP 
USETEXT          TEXTNVF
USETEXT          TEXTSS 
USETEXT          TXSMNVF
USETEXT          TXTANVF
USETEXT          TXTAPSS
USETEXT          TXTSUSS
  
PROC NVFTDSP((PT),(PD));
# TITLE NVFTDSP - DETERMINE SWITCH POSSIBILITY                         #
  
      BEGIN  # NVFTDSP #
# 
**    NVFTDSP - DETERMINE SWITCH POSSIBILITY. 
* 
*     E. THAVIKULWAT    81/10/02
*     C. BRION          83/04/16, 83/05/10, 83/06/23. 
* 
*     THIS PROCEDURE DETERMINES IF A SWITCH TO THE REQUESTED
*     APPLICATION IS POSSIBLE.  IF SO, A CR/SWH SM IS ISSUED.  IT MAY 
*     HAPPEN THAT A REQUEST STARTABLE APPLICATION HAS BEEN REQUESTED. 
*     IN THIS CASE, THE PTAC IS SET TO A NETON PENDING STATE, A TIMER 
*     REQUEST IS ISSUED AND A "WAITING FOR APPLICATION" MESSAGE SENT TO 
*     THE TERMINAL. 
* 
*     PROC NVFTDSP((PT),(PD)) 
* 
*     ENTRY:  
*       PT  =  POINTER TO PTAC ENTRY. 
*       PD  =  POINTER TO PDCT ENTRY(ONLY FOR PASSIVE DEVICE).
* 
*     EXIT: 
*       ONE OF THE FOLLOWING: 
*         1) CR/SWH SM ISSUED.
*         2) APPROPRIATE MESSAGE SENT TO CONSOLE IF SWITCH NOT POSSIBLE.
*         3) PASSIVE DEVICE PUT INTO WAIT STATE IF SWITCH NOT POSSIBLE. 
*         4) THE APPLICATION STARTUP INITIATED AND THE PTAC PUT IN NETON
*            PENDING STATE. 
*         5) IF A LOAN CONNECTION REQUEST, A CR/RCN/N FOLLOWED BY THE 
*            CR/SWH/R SM IS ISSUED. 
*         6) IF A LOAN CONNECTION REQUEST AND THE CONNECTION SWITCH NOT 
*            POSSIBLE, A CR/RCN/A SM IS ISSUED IN ORDER TO RETURN THE 
*            CONNECTION BACK TO THE PRIMARY APPLICATION.
* 
*     NOTES:  
*       1) SWITCH FOR CONSOLE IS POSSIBLE IF APPLICATION IS NETON, IS 
*          ENABLED, NOT DOWN, HAS NOT REACHED THE MAXIMUM CONNECTION
*          IT CAN ACCEPT, AND HAS NO DUPLICATE USER FOR THAT
*          APPLICATION IF DUPLICATE USER NOT ALLOWED.  IF SWITCH NOT
*          POSSIBLE, EITHER AN APPROPRIATE MESSAGE IS ISSUED TO THE 
*          TERMINAL AND APPLICATION PROMPT MAY BE REISSUED OR IF A
*          LOAN REQUEST A CR/RCN/A SM IS ISSUED.
*       2) SWITCH FOR PASSIVE DEVICE IS POSSIBLE IF APPLICATION HAS NOT 
*          REACHED THE MAXIMUM CONNECTION IT CAN ACCEPT.  IF SWITCH NOT 
*          POSSIBLE AND NOT A LOAN REQUEST RECONNECT, THE DEVICE STAYS
*          CONNECTED TO NVF UNTIL THE CONSOLE HAS COME BACK AND HAS 
*          MADE ANOTHER SUCCESSFUL APPLICATION SELECTION OR UNTIL THE 
*          NPU TERMINATES THE CONNECTION. IF SWITCH NOT POSSIBLE AND
*          A LOAN REQUEST RECONNECT THEN A CR/RCN/A SM IS ISSUED TO 
*          RETURN THE CONNECTION BACK TO THE PRIMARY APPLICATION. 
* 
# 
  
# 
****  PROC NVFTDSP - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC ABORT;          # ABORT NVF                               #
        PROC MESSAGE;        # ISSUE DAYFILE MESSAGE                   #
        PROC MOVE;           # MACREL MOVE CM WORDS                    #
        PROC NVFSCAD;        # COMPLETE APPLICATION DEPARTURE          #
        PROC NVFTDAD;        # DETERMINE ADDITIONAL DIALOGUE           #
        PROC NVFTILP;        # ISSUE LOGIN PROMPT                      #
        PROC NVFTRLC;        # REFUSE LOAN REQUEST CONNECTION          #
        PROC NVFUCRS;        # CHECK REQUEST STARTABLE                 #
        PROC NVFUMQE;        # TRANSFER SM TO QUEUE                    #
        PROC SSCATR;         # SS-ACCEPT TIMER REQUEST                 #
        PROC SSTETS;         # ENLARGE TABLE SPACE                     #
        PROC SSTRTS;         # SS-RELEASE TABLE SPACE                  #
        FUNC EDATE C(10);    # CONVERT PACKED DATE TO DISPLAY CODE     #
        FUNC XSFW  C(10);    # SPACE FILL WORD                         #
        END 
  
# 
****
# 
  
  
      ITEM ADDR       I;     # ADDRESS VARIABLE FOR CR/RCN/N           #
      ITEM ANUM       I;     # APPLICATION NUMBER VARIABLE             #
      ITEM AS         I;     # SUBSCRIPT FOR ARRAY AST                 #
      ITEM ASENTRY    I;     # NUMBER OF AST ENTRIES                   #
      ITEM ASTORD     I;     # LOCAL AST ORDINAL                       #
      ITEM CTYP       I;     # CONNECTION TYPE FOR NVFUCRS CALL        #
      ITEM ERRCOD     I;     # ERROR CODE FOR PROC *NVFTDAD*           #
      ITEM ERRKOD     I;     # ERROR CODE FOR RCN/A AND/OR CR/SWH      #
      ITEM I          I;     # LOOP VARIABLE                           #
      ITEM IDX        I;     # INDEX FOR 2ND HALF OF *MSGBUF*          #
      ITEM NOSPTAC    B;     # SPTAC SEARCH FLAG                       #
      ITEM PASTMATCH  B;     # PRIMARY AST MATCH ID                    #
      ITEM PD         I;     # SUBSCRIPT FOR ARRAY PDCT                #
      ITEM PORD       I;     # LOCAL LOOP AND PRIMARY AST ORD          #
      ITEM PRIORD     I;     # PRIMARY AST ORDINAL                     #
      ITEM PT         I;     # SUBSCRIPT FOR ARRAY PTAC                #
      ITEM PTDT       I;     # SUBSCRIPT FOR GOTO SWITCH               #
      ITEM RA         I;     # SUBSCRIPT FOR ARRAY RAU                 #
      ITEM RAU$ENTRY  I;     # NUMBER OF ENTRIES IN RAU TABLE          #
      ITEM RETORD     I;     # RETURN AST ORDINAL FOR NVFUCRS          #
      ITEM RETSTAT    U;     # RETURN RETSTAT FOR NVFUCRS              #
      ITEM SAS        I;     # SPTAC LOOP COUNTER, ENTRY ORDINAL       #
      ITEM SIZEA      I;     # SPTAC SIZE                              #
      ITEM SIZEB      I;     # SPTAC AND SM SIZES                      #
      ITEM SMOUT      B;     # SM TYPE, TRUE=CR/RCN/A, FALSE=CR/SWH/R  #
      ITEM TOTALCN    I;     # TOTAL NUMBER OF CONNECTIONS             #
  
      SWITCH DTYPSWT:DTSTAT 
            LLINT  : SCON,   # LABEL FOR CONSOLE DEVICE TYPE           #
            LLPASV : SCR,    # LABEL FOR CARD READER DEVICE            #
            LLPASV : SLP,    # LABEL FOR LINE PRINTER DEVICE           #
            LLPASV : SCP,    # LABEL FOR CARD PUNCH DEVICE             #
            LLPASV : SPL,    # LABEL FOR PLOTTER DEVICE                #
            LLINT  : SCLP,   # LABEL FOR CDCNET LINE PRINTER (PSU)     #
            LLINT  : SUSER;  # LABEL FOR USER DEVICE TYPE              #
  
# 
**    TMBBUF - TIMER REQUEST BUFFER.
* 
*     BUFFER CONTAINING THE TIMER INFO. SET UP TO CONTAIN THE 
*     FC/INACT SM WHICH IS RETURNED TO THE TAINPQ WHEN THE TIMER EXPIRES. 
# 
      ARRAY TMBBUF[00:00] S(TMBSIZ$); 
        BEGIN 
        ITEM TMB$SMID   S:CTQSTAT(00,00,12) = [S"SINA"];
        ITEM TMB$WC     U(00,48,12) = [TMBSIZ$];
        ITEM TMB$ABT    U(01,00,06) = [APPCMD]; 
        ITEM TMB$CNUM   U(01,18,18);
        ITEM TMB$PFCSFC U(02,00,16) = [FCINA];
        ITEM TMB$ACN    U(02,24,12);
        ITEM TMB$DELAY  U(03,24,18) = [NETPTIME$];
        ITEM TMB$QNUM   U(03,42,18);
        END 
  
  
# 
**    EXPBUF - PASSSWORD EXPIRATION WARNING.
# 
      ARRAY EXPBUF[00:00] S(5); 
        BEGIN 
        ITEM EXP$MSG  C(00,00,30) = [".YOUR PASSWORD EXPIRES AT 00.0"]; 
        ITEM EXP$MSG1 C(03,00,07) = ["0.00 ON"];
        ITEM EXP$DATE C(03,42,10);  # DATE IN YY/MM/DD FORMAT          #
        ITEM EXP$ZERO U(04,42,18) = [0];
        END 
  
# 
*     EXPDATE - DATE AS IT APPEARS IN MSG$BUF 
# 
      ARRAY EXPDATE[00:00] S(1);
        BEGIN 
        ITEM EXWORD   U(00,00,60);  # FULL WORD OF DATA                #
        ITEM EXLOW18  U(00,42,18);  # LOWER 18 BITS OF WORD            #
        ITEM EXYEAR   U(00,42,06);  # YEAR - 1970                      #
        ITEM EXMONTH  U(00,48,06);  # MONTH                            #
        ITEM EXDATE   U(00,54,06);  # DATE                             #
        END 
  
# 
**    NOAST - NO AST ENTRY WAS FOUND MESSAGE. 
# 
      $BEGIN
      ARRAY NOAST [00:00] S(5); 
        BEGIN 
        ITEM NO$MSG    C(00,00,36) =
                       ["NVFTDSP - CANNOT FIND AST ENTRY FOR "];
        ITEM NO$ANAM   C(03,36,07); 
        ITEM NO$ZERO   U(04,18,42) = [0]; 
        END 
  
# 
**    NOPRI - NO PRIMARY AST ENTRY WAS FOUND MESSAGE. 
# 
      ARRAY NOPRI [00:00] S(5); 
        BEGIN 
        ITEM NOP$MSG   C(00,00,40) =
                       ["NVFTDSP - CANNOT FIND PRIMARY AST ENTRY."];
        ITEM NOP$ZERO  U(04,00,60) = [0]; 
        END 
      $END
  
# 
*     TEMPORARY BASED ARRAYS FOR USE WHEN CALLING THE *MOVE* ROUTINE. 
# 
      BASED ARRAY TEMPFROM [00:00] S(1);
        BEGIN 
        ITEM FROMWRD  U(00,00,60);
        END 
  
      BASED ARRAY TEMPTO [00:00] S(1);
        BEGIN 
        ITEM TOWRD    U(00,00,60);
        END 
  
      CONTROL EJECT;
  
# 
*     NVFTDSP MAIN LINE STARTS HERE.
* 
*     DETERMINE NUMBER AST ENTRIES. 
# 
      ASENTRY = ASTLNGTH/ASTSIZ$; 
  
# 
*     CLEAR OUTGOING SM BUFFER (2ND HALF OF *MSGBUF*).
# 
      IDX = (NMSGBUF$ + 1) / 2;        # INDEX TO 2ND HALF OF *MSGBUF* #
      FOR I = IDX STEP 1 UNTIL NMSGBUF$ 
      DO
        BEGIN 
        MSG$WORD[I] = 0;
        END 
  
      PTDT = PTA$DT[PT];
      GOTO DTYPSWT[PTDT]; 
  
# 
*     CONSOLE DEVICE TYPE.  IF SWITCH IS POSSIBLE, OBTAIN VALIDATION
*     DATA FOR CR/SWH SM FROM PTAC ENTRY.  IF NOT POSSIBLE, CALL
*     *NVFTDAD* WITH APPROPRIATE ERROR CODE AND EXIT. 
# 
LLINT:                                 # CONSOLE DEVICE TYPE           #
      PASTMATCH = FALSE;
      FOR ASTORD = 0 STEP 1 WHILE 
       (ASTORD LS ASENTRY) AND NOT PASTMATCH
      DO
        BEGIN 
        IF (AST$PANAM[ASTORD] EQ PTA$SWTAPP[PT])
                                  OR
           ((AST$SANAM[ASTORD] EQ PTA$SWTAPP[PT]) AND 
            (AST$SANAM[ASTORD] NQ AST$PANAM[ASTORD])) 
        THEN
          BEGIN 
          PASTMATCH = TRUE; 
          END 
        END 
  
      $BEGIN
      IF NOT PASTMATCH
      THEN
        BEGIN 
        NO$ANAM[0] = PTA$SWTAPP[PT];
        MESSAGE(NOAST[0],0);
        ABORT;
        END 
      $END
  
      ASTORD = ASTORD - 1;
      AS = ASTORD;
# 
*     IF A LOANED CONNECTION IS BEING RETURNED TO THE PRIMARY APPL, 
*     DECREMENT THE RESERVED CONNECTION COUNT FOR THE PRIMARY APPL. 
# 
      IF PTA$LRC[PT] GR RCRC"LSA" 
      THEN
        BEGIN 
        AST$RACN[ASTORD] = AST$RACN[ASTORD] - 1;
        END 
# 
*     CHECK FOR REQUEST STARTABLE TYPE OF APPLICATION, OR FOR AN
*     APPLICATION THAT CAN HAVE MULTIPLE COPIES.
# 
  
      PTA$SWTAN[PT] = AST$AN[ASTORD]; 
      IF AST$RS[ASTORD] OR
        (AST$MXCOP[ASTORD] GR 1)
      THEN
        BEGIN 
# 
*     APPLICATION IS REQUEST STARTABLE OR CAN HAVE MULTIPLE COPIES. 
*     CALL NVFUCRS TO HANDLE FURTHUR PROCESSING.  UPON RETURN,
*     DEPENDENT ON RETSTAT, EITHER SET ERROR CODE OR SET PTAC STATE TO
*     NETON PENDING, START TIMER AND RETURN.
# 
  
        RETORD = 0; 
        RETSTAT = CONNOK$;
        CTYP = TACON$;
  
        NVFUCRS(ASTORD,RETORD,RETSTAT,CTYP);
  
        IF RETSTAT EQ NOCONN$ OR
           RETSTAT EQ MCLIMIT$
        THEN
          BEGIN 
# 
*     CONNECTION NOT POSSIBLE.
*     IF A LOAN REQUEST CONNECTION TYPE, CALL NVFTRLC 
*     TO RESTORE VCB, ISSUE VCB WRITE REQUEST, ISSUE CR/RCN/A SM
*     AND RELEASE THE PTAC AND SPTAC IF IT EXISTS.
# 
  
          IF PTA$LRC[PT] EQ RCRC"LSA" 
          THEN
            BEGIN 
            SMOUT = TRUE; 
            PTA$LRC[PT] = RCRC"SLE";
            NVFTRLC(PT,SMOUT,PTA$LRC[PT]);
            RETURN; 
            END 
# 
*     NOT A LOANED REQUEST TYPE OF CONNECTION.
# 
          IF RETSTAT EQ NOCONN$ 
          THEN                         # APPL NOT AVAILABLE            #
            ERRCOD = ECANP$;
          ELSE                         # MAX COPIES/CONNECTIONS REACHED#
            ERRCOD = ECABSY$; 
          NVFTDAD(PT,ERRCOD); 
          IF PTA$STATE[PT] EQ PTACST"AWTPRMT" 
          THEN
            BEGIN 
            NVFTILP(PT);
            RETURN; 
            END 
          END 
        ELSE IF RETSTAT EQ NETP$
        THEN
          BEGIN 
# 
*     REQUESTED APPL IS BEING STARTED UP. 
*     CONNECTION IN NETON PENDING STATE.
*     SETUP TIMER TO PROTECT AGAINST APPLICATION NEVER NETTING ON 
*     AND HANGING THE CONNECTION. 
# 
          ERRCOD = ECAPNETP$; 
          PTA$STATE[PT] = PTACST"AWTNETP";
          TMB$ACN[0] = PTA$ACN[PT]; 
          TMB$QNUM[0] = LOC(P<TAINPQ>); 
          SSCATR(TMBBUF[0]);
          PTA$CNUM[PT] = TMB$CNUM[0]; 
          PTA$SWTAPP[PT] = AST$PANAM[ASTORD]; 
          AS = RETORD;
          RETURN; 
          END 
        ELSE IF RETSTAT EQ CONNOK$
        THEN
          BEGIN 
          AS = RETORD;
          PTA$SWTAPP[PT] = AST$PANAM[RETORD]; 
          PTA$SWTAN[PT] = AST$AN[RETORD]; 
          END 
        END 
# 
*     TO HERE, AN APPLICATION AVAILABLE FOR THE CONNECTION. 
*     CHECK THE MAX NUMBER OF CONNECTIONS.
# 
      ANUM = AST$AN[AS];
      TOTALCN = AST$TACN[AS] + AST$AACN[AS] + AST$RACN[AS]; 
      IF (ANUM EQ 0) OR (TOTALCN GQ AST$MCN[AS])
        OR (AST$DIF[AS]) OR (AST$DNF[AS]) 
      THEN
        BEGIN 
# 
*     SWITCH NOT POSSIBLE. EITHER APPLICATION IS INACTIVE, AT MAX 
*     NUMBER OF CONNECTIONS, DISABLED OR DOWN.
# 
        ERRCOD = ECANP$;
        IF (ANUM NQ 0) AND (TOTALCN GQ AST$MCN[AS]) 
        THEN
          BEGIN 
# 
*     REQUESTED APPLICATION AT CONNECTION LIMIT.
# 
          IF PTA$LRC[PT] LS RCRC"LSA" 
          THEN
            BEGIN 
            ERRCOD = ECABSY$; 
            END 
          ELSE
            BEGIN 
            ERRCOD = 0; 
            END 
          END 
# 
*     IF A LOAN REQUEST TYPE OF CONNECTION, THEN MUST SEND THE
*     CONNECTION BACK TO THE PRIMARY APPLICATION. 
# 
        IF PTA$LRC[PT] LS RCRC"LSA" 
        THEN
          BEGIN 
# 
*     NOT A LOAN REQUEST TYPE OF CONNECTION.
*     DETERMINE ADDITIONAL DIALOGUE POSSIBILITY AND ISSUE PROMPT
*     IF SO DETERMINED. 
# 
          NVFTDAD(PT,ERRCOD); 
          IF PTA$STATE[PT] EQ PTACST"AWTPRMT" 
          THEN
            BEGIN 
            NVFTILP(PT);
            END 
          RETURN; 
          END 
        ELSE
          BEGIN 
# 
*     LOAN REQUEST TYPE OF CONNECTION.
*     IF INITIAL LOAN FROM PRIMARY TO SECONDARY, ISSUE A
*     CR/RCN/A SM VIA CALL TO NVFTRLC.
# 
          IF PTA$LRC[PT] EQ RCRC"LSA" 
          THEN
            BEGIN 
            SMOUT = TRUE; 
            PTA$LRC[PT] = RCRC"SNA";
            IF (ANUM NQ 0) AND (TOTALCN GQ AST$MCN[AS]) 
            THEN
              BEGIN 
              PTA$LRC[PT] = RCRC"SLE";
              END 
            NVFTRLC(PT,SMOUT,PTA$LRC[PT]);
            RETURN; 
            END 
          END 
        END 
      ELSE
        BEGIN 
# 
*     SWITCH STILL POSSIBLE.
*     CHECK IF DUPLICATE USER ALLOWED.
# 
        IF AST$UIDF[AS] AND 
          (PTA$LRC[PT] LQ RCRC"LSA")
        THEN
          BEGIN 
# 
*      DUPLICATE USER NOT ALLOWED.  CHECK *RAU* TABLE FOR DUPLICATE 
*      USER.  IF DUPLICATE, CALL *NVFTDAD* AND EXIT.  IF NOT, 
*      MAKE ENTRY IN *RAU* TABLE AND PROCEED TO BUILD CR/SWH SM.
# 
          RAU$ENTRY = RAULNGTH / RAUSIZ$; 
          FOR I = 0 STEP 1 WHILE (I LS RAU$ENTRY) 
          DO
            BEGIN 
            IF (RAU$AN[I] EQ ANUM) AND (RAU$UIDX[I] EQ PTA$UIDX[PT])
              AND (RAU$FNAM[I] EQ PTA$FNAM[PT]) 
            THEN
              BEGIN 
              ERRCOD = ECABSY$; 
# 
*     DUPLICATE USER, CAN NOT SWITCH. 
* 
# 
              IF PTA$LRC[PT] LS RCRC"LSA" 
              THEN
                BEGIN 
# 
*     NON LOAN REQUEST TYPE OF CONNECTION.
*     DETERMINE ADDITIONAL DIALOGUE POSSIBILITY AND ISSUE PROMPT
*     IF SO DETERMINED. 
# 
                NVFTDAD(PT,ERRCOD); 
                IF PTA$STATE[PT] EQ PTACST"AWTPRMT" 
                THEN
                  BEGIN 
                  NVFTILP(PT);
                  END 
                RETURN; 
                END 
              ELSE
                BEGIN 
# 
*     LOAN REQUEST TYPE OF CONNECTION.
*     IF INITIAL LOAN FROM PRIMARY TO SECONDARY, ISSUE A
*     CR/RCN/A SM VIA CALL TO NVFTRLC.
# 
                IF PTA$LRC[PT] EQ RCRC"LSA" 
                THEN
                  BEGIN 
                  SMOUT = TRUE; 
                  PTA$LRC[PT] = RCRC"SNA";
                  NVFTRLC(PT,SMOUT,PTA$LRC[PT]);
                  RETURN; 
                  END 
                END 
              END 
            END 
# 
*     NOT A DUPLICATE USER. GENERATE RAU TABLE ENTRY. NOTE THAT THE CUR-
*     RENT CONTENT OF I IS THE INDEX TO THE NEW ENTRY.
# 
          RA = RAULNGTH;          # OFFSET FROM BEGINNING OF RAU TABLE #
          SSTETS(P<RAU>,RA,RAUSIZ$);   # ALLOCATE SPACE FOR RAU ENTRY  #
          RAU$AN[I]   = ANUM;          # SAVE APPLICATION NUMBER       #
          RAU$UIDX[I] = PTA$UIDX[PT];  # SAVE USER INDEX               #
          RAU$FNAM[I] = PTA$FNAM[PT];  # SAVE FAMILY NAME              #
          END 
# 
*       ISSUE THE PASSWORD EXPIRATION WARNING MESSAGE 
# 
  
        IF  (NOT PTA$PWEXPF[PT])         # PASSWRD EXP MESSAGE NOT SENT#
        THEN
          BEGIN 
          EXWORD[0] = PTA$EXPDAT[PT];    # PASSWORD EXPIRATION DATE    #
          IF (EXLOW18[0] NQ 0)           # A EXPIRING PASSWORD         #
          THEN
            BEGIN 
            EXP$DATE[0] = EDATE(EXLOW18[0]);# DATE IN DISPLAY CODE     #
            NVFUMQE(P<CTQ>,EXPBUF[0],APPTTX$,PTA$ACN[PT],50); 
            END 
          PTA$PWEXPF[PT] = TRUE;         # MESSAGE SENT TO USER        #
          END 
        END 
# 
*     SWITCH FOR CONSOLE IS POSSIBLE. 
*     CHECK IF INITIAL LOAN REQUEST. IF SO, SEND THE CR/RCN/N SM, AS
*     THIS WAS NOT DONE IN *NVFTRVD*. 
# 
  
      IF PTA$LRC[PT] EQ RCRC"LSA" 
      THEN
        BEGIN 
        SPMSG0[1] = 0;
        PFCSFC[1] = CRRCNN; 
        CRACN[1]  = PTA$ACN[PT];
        CRNXP[1]  = TRUE; 
        CRICT[1]  = ICT$; 
        CRALN[1]  = ALN$; 
        ADDR = 0; 
        NVFUMQE(P<CTQ>,APSM[1],APPPR$,ADDR,LCRRCNN);
        SPMSG0[1] = 0;
        END 
# 
*     NOW SET UP THE CR/SWH/R SM. 
# 
      CRSAHMT[1] = PTA$AHMT[PT];
      CRSAHDS[1] = PTA$AHDS[PT];
      CRSAAWC[1] = PTA$AAWC[PT];
      CRSATWD[1] = PTA$ATWD[PT];
      GOTO ENDDTYP; 
  
# 
*     PASSIVE DEVICE TYPE.  IF SWITCH IS POSSIBLE, OBTAIN VALIDATION
*     DATA FOR CR/SWH SM FROM PDCT ENTRY.  IF NOT POSSIBLE, JUST EXIT.
# 
LLPASV: 
      PASTMATCH = FALSE;
# 
*     LOCATE THE APPLICATION FOR THE CONNECTION.
*     FOR PASSIVE DEVICES, THE APPLICATION MAY BE A ONE OF THE
*     FOLLOWING TYPE OF APPLICATION:  
* 
*       1) PRIMARY APPLICATION THAT IS ACTIVE.
*       2) SECONDARY APPLICATION THAT IS ACTIVE.
# 
      FOR ASTORD = 0 STEP 1 WHILE 
       (ASTORD LS ASENTRY) AND NOT PASTMATCH
      DO
        BEGIN 
        IF ((AST$PANAM[ASTORD] EQ PDT$CAPP[PD+1]) AND 
            (AST$AN[ASTORD] NQ 0))
                                  OR
           ((AST$SANAM[ASTORD] EQ PDT$CAPP[PD+1]) AND 
            (AST$AN[ASTORD] NQ 0) AND 
            (AST$SANAM[ASTORD] NQ AST$PANAM[ASTORD])) 
        THEN
          BEGIN 
          PASTMATCH = TRUE; 
          END 
        END 
  
      $BEGIN
      IF NOT PASTMATCH
      THEN
        BEGIN 
        NO$ANAM[0] = PDT$CAPP[PD+1];
        MESSAGE(NOAST[0],0);
        ABORT;
        END 
      $END
  
      ASTORD = ASTORD - 1;
      AS = ASTORD;
# 
*     APPLICATION FOUND. CHECK CONNECTION LIMIT.
# 
      TOTALCN = AST$TACN[AS] + AST$AACN[AS] + AST$RACN[AS]; 
      IF (TOTALCN GQ AST$MCN[AS]) 
      THEN
        BEGIN 
# 
*     APPLICATION AT CONNECTION LIMIT. PASSIVE DEVICES HELD 
*     AT THIS POINT. CONSOLE CONNECTION ACTIVITY WILL FORCE THE 
*     RELOCATION OF THE PASSIVE DEVICES.
# 
        RETURN; 
        END 
# 
*     SWITCH FOR PASSIVE DEVICE IS POSSIBLE.  SAVE FAMILY NAME, USER
*     NUMBER, AND APPLICATION NAME IN PTAC ENTRY AS *NVFTIAM* (ISSUE
*     ACCOUNT DAYFILE MESSAGE) EXPECTS IT TO BE IN THE PTAC.  PICK UP 
*     VALIDATION DATA FOR CR/SWH SM FROM PDCT ENTRY.
# 
      PTA$FWORD[PT]  = PDT$FWORD[PD+2]; 
      PTA$UWORD[PT]  = PDT$UWORD[PD+3]; 
      PTA$SWTAPP[PT] = PDT$CAPP[PD+1];
      PTA$SWTAN[PT] = AST$AN[AS];        # RESTORE APPLICATION NUMBER  #
  
# 
*     CHECK IF INITIAL LOAN REQUEST. IF SO, MUST SEND CR/RCN/N SM.
# 
  
      IF PTA$LRC[PT] EQ RCRC"LSA" 
      THEN
        BEGIN 
        SPMSG0[1] = 0;
        PFCSFC[1] = CRRCNN; 
        CRACN[1]  = PTA$ACN[PT];
        CRNXP[1]  = TRUE; 
        CRICT[1]  = ICT$; 
        CRALN[1]  = ALN$; 
        ADDR = 0; 
        NVFUMQE(P<CTQ>,APSM[1],APPPR$,ADDR,LCRRCNN);
        SPMSG0[1] = 0;
        END 
# 
*     NOW SET UP THE CR/SWH/R SM. 
# 
  
      CRSWOCN[1] = PTA$OCN[PT]; 
      CRSAHMT[1] = PDT$AHMT[PD+4];
      CRSAHDS[1] = PDT$AHDS[PD+5];
      CRSAAWC[1] = PDT$AAWC[PD+6];
      CRSATWD[1] = PDT$ATWD[PD+7];
  
      GOTO ENDDTYP; 
  
ENDDTYP:                               # COMMON END PROCESSING         #
      ANUM = AST$AN[AS];
      AST$TACN[AS] = AST$TACN[AS] + 1;   # INCREMENT NUM OF CONNS.   #
      AST$ICCN[AS] = AST$ICCN[AS] + 1;
# 
*     COMPLETE BUILDING CR/SWH SM.
# 
      PFCSFC[1]   = CRSWH;
      CRNACN[1]   = PTA$ACN[PT];
      CRABL[1]    = PTA$ABL[PT];
      CRSWSDT[1]  = PTA$SDT[PT];
      CRDT[1]     = PTA$DT[PT]; 
      CRSWTC[1]   = PTA$TC[PT]; 
      CRSWIC[1]   = PTA$ICF[PT];
      CRSWORD[1]  = PTA$DO[PT]; 
      CRSTNAM[1]  = XSFW(PTA$TN[PT]); 
      CRSWPW[1]   = PTA$PW[PT]; 
      CRSWPL[1]   = PTA$PL[PT]; 
      CRSWSL[1]   = PTA$SL[PT]; 
      CRSWNET[1]  = PTA$NET[PT];
      CRSWDBZ[1]  = PTA$DBZ[PT];
      CRSWXBZ[1]  = PTA$XBZ[PT];
      CRSWUBZ[1]  = PTA$UBZ[PT];
      CRSWHW[1]   = PTA$HW[PT]; 
      CRSWVTP[1]  = PTA$VTP[PT];
      CRSWAN[1]   = ANUM; 
      CRSWFAM[1]  = XSFW(PTA$FNAM[PT]); 
      CRSWFO[1]   = PTA$FORD[PT]; 
      CRSWUN[1]   = XSFW(PTA$UNUM[PT]); 
      CRSWUI[1]   = PTA$UIDX[PT]; 
# 
*     SET THE LOAN STATUS FIELD IF THIS IS A LOAN TYPE OF CONNECTION. 
*     FOR A NON-LOAN CONNECTION, THE LOAN STATUS IS ZERO. 
# 
      IF PTA$LRC[PT] LS RCRC"LSA" 
      THEN
        BEGIN 
        CRSWLST[1] = 0; 
        END 
      ELSE
        BEGIN 
        CRSWLST[1] = PTA$LRC[PT]; 
        END 
# 
*     CHECK IF EXTENDED OPTIONAL WORDS ARE AVAILABLE. 
*     IF SO, APPEND THE OPTIONAL WORDS FROM THE SPTAC ENTRY 
*     TO THE CR/SWH/R SM. 
*     DELETE THE SPTAC ENTRY WHEN FINISHED. 
# 
      SIZEB = 0;
      SIZEA = LCRSWH; 
      IF PTA$SPTAC[PT]
      THEN
        BEGIN 
        NOSPTAC = TRUE; 
        FOR SAS = 0 STEP SPT$ESIZE[SAS] WHILE 
          ((SAS LS SPTACL) AND NOSPTAC) 
        DO
          BEGIN 
          IF SPT$VCB[SAS] EQ PTA$VCB[PT]
          THEN
            BEGIN 
            SIZEB = SPT$ESIZE[SAS] - 1; 
            P<TEMPFROM> = LOC(SPT$WRD2[SAS]); 
            P<TEMPTO> = LOC(CRSOPW[1]); 
            FOR I = 0 STEP 1 WHILE
              I LS SIZEB
            DO
              BEGIN 
              TOWRD[I] = FROMWRD[I];
              END 
            SSTRTS(P<SPTAC>,SAS,SPT$ESIZE[SAS]);
            PTA$SPTAC[PT] = FALSE;
            NOSPTAC = FALSE;
            SIZEA = SIZEA + SIZEB;
            END 
          END 
        END 
# 
*     IF THIS IS A LOANED CONNECTION THAT IS BEING RETURNED TO THE
*     PRIMARY APPLICATION, CLEAR THE LOAN FLAG, AS IT IS NO LONGER
*     "ON LOAN".
# 
      IF PTA$LRC[PT] GR RCRC"LSA" 
      THEN
        BEGIN 
        PTA$LCF[PT] = FALSE;
        END 
# 
*     CLEAR ACN FIELD OF PTAC ENTRY AS ACN COULD BE REUSED AFTER A
*     CR/SWH REQUEST IS ISSUED. 
# 
      PTA$ACN[PT] = 0;
      NVFUMQE(P<CTQ>,APSM[1],APPPR$,0,SIZEA); 
      RETURN; 
      END  # END NVFTDSP #
TERM
