*DECK     NVFTITE 
USETEXT          TEXTNVF
USETEXT          TXTANVF
USETEXT          TEXTSS 
USETEXT          TXSMNVF
USETEXT          TXTAPSS
USETEXT          TXTSUSS
  
PROC NVFTITE; 
# TITLE NVFTITE - INITIATE TERMINAL CONNECTION (CR/ITE SM)             #
  
      BEGIN  # NVFTITE #
# 
**    NVFTITE - INITIATE TERMINAL CONNECTION (CR/ITE SM). 
* 
*     E. THAVIKULWAT    81/08/18
* 
*     THIS PROCEDURE INITIATES TERMINAL CONNECTION IN RESPONSE TO A 
*     CR/ITE REQUEST.  IT IS CALLED INTO EXECUTION BY PROCEDURE 
*     *NVFTDQE*.
* 
*     PROC NVFTITE
* 
*     ENTRY:  
*       ABH IN *ABHBUF* 
*       CR/ITE SM IN *MSGBUF* 
* 
*     EXIT: 
*       CONNECTION INITIATED
* 
*     METHOD: 
*       CALL *NVFUAFV* TO GET A VCB ORDINAL.  IF NO ORDINAL AVAILABLE,
*       SEND CR/ITE/A RESPONSE AND EXIT.  OTHERWISE, CALL *SSTATS* TO 
*       ALLOCATE SPACE FOR A NEW PTAC ENTRY AND COPY AUTOLOGIN DATA,
*       IF ANY, TO THE PTAC.  SEND CR/ITE/N RESPONSE AND SAVE 
*       APPROPRIATE INFORMATION FROM THE CR/ITE REQUEST IN THE PTAC.
*       IF SYNCHRONOUS CONSOLE, CALL *SSTATS* TO ALLOCATE SPACE FOR A 
*       NEW PDCT.  FOR ALL INTERACTIVE DEVICES, SEND BANNER AND CALL
*       *NVFTILP* TO ISSUE LOGIN PROMPT.  DEPENDING ON THE TERMINAL 
*       CLASS, SEND A CTR/CHAR TO FORCE THE TERMINAL TO BE IN NON-
*       TRANSPARENT INPUT MODE.  FOR PASSIVE DEVICES, ADD THE 
*       DEVICE TO ITS OWNING CONSOLE'S PDCT ENTRY AND DETERMINE IF
*       DEVICE IS TO BE SWITCH IMMEDIATELY. 
# 
  
# 
****  PROC NVFTITE - XREF LIST. 
# 
  
      XREF
        BEGIN 
        FUNC SSDCAD U;       # CONVERT ASCII TO DISPLAY                #
  
        PROC MESSAGE;        # SEND MESSAGE TO SYSTEM AND USER DAYFILE #
        PROC NVFUAFV;        # ACQUIRE A FREE VCB ORDINAL              #
        PROC NVFTDSP;        # DETERMINE SWITCH POSSIBILITY            #
        PROC NVFTETC;        # END TERMINAL CONNECTION                 #
        PROC NVFTILP;        # ISSUE LOGIN PROMPT                      #
        PROC NVFUMQE;        # TRANSFER SM OR TEXT TO QUEUE            #
        PROC SSBEBF;         # EXTRACT BIT FIELDS                      #
        PROC SSBSBF;         # STORE BIT FIELDS                        #
        PROC SSTATS;         # ALLOCATE TABLE SPACE                    #
        PROC SSTETS;         # ENLARGE TABLE SPACE                     #
        END 
  
# 
****
# 
      DEF  LNAME$   #7#;             # NUMBER OF CHARACTERS IN NAME    #
  
*CALL TMSGNVF 
  
*CALL TERMCLS 
  
      ITEM ADDR      I;      # ADDRESSING INFORMATION FOR ABH          #
      ITEM AORD      I;      # LOCATION OF ASCII NAME WITHIN ENTRY     #
      ITEM ADCHAR    I;      # AREA FOR STORING ONE ASCII/DISPLAY CHAR #
      ITEM CTEMP     C(7);   # CHARACTER TERMPORARY                    #
      ITEM DORD      I;      # LOCATION OF DISPLAY NAME WITHIN ENTRY   #
      ITEM ERRFLAG   B;      # ERROR FLAG                              #
      ITEM I         I;      # LOOP VARIABLE                           #
      ITEM IDX       I;      # INDEX FOR 2ND HALF OF *MSGBUF*          #
      ITEM MATCH     B;      # EXIT LOOP INDICATOR                     #
      ITEM PD        I;      # SUBSCRIPT FOR ARRAY PDCT                #
      ITEM PO        I;      # POSITION WHERE TABLE IS TO BE ENLARGED  #
      ITEM PT        I;      # SUBSCRIPT FOR ARRAY PTAC                #
      ITEM PTDT      I;      # SUBSCRIPT FOR GOTO SWITCH               #
      ITEM SBITA     I;      # STARTING BIT OF ASCII NAME              #
      ITEM SBITD     I;      # STARTING BIT OF DISPLAY NAME            #
      ITEM VCBORD    I;      # VCB ORDINAL                             #
  
  
# 
*     FOLLOWING ARRAY CONTAINS MESSAGE ISSUED TO THE DAYFILE UPON NOT 
*     FINDING AN EXPECTED PDCT ENTRY FOR THE PASSIVE DEVICE'S OWNING
*     CONSOLE.
# 
      ARRAY DAYMSG[00:00] S(5); 
        BEGIN 
        ITEM DAY$MSG1   C(00,00,27) = ["NVFTITE - CANNOT FIND PDCT "];
        ITEM DAY$MSG2   C(02,42,17) = ["ENTRY FOR TERMNAM"];
        ITEM DAY$TNAME  C(03,42,07);   # OWNING CONSOLE'S NAME         #
        END 
  
# 
*     THE FOLLOWING BASED ARRAY POINTER POINTS TO THE NEW PTAC ENTRY. 
# 
      BASED ARRAY BPTAC[00:00] S(1);
        BEGIN 
        ITEM BPT$WORD   U(00,00,60);   # FULL WORD REFERENCE           #
        END 
  
      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              #
  
# 
*     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 
  
      ADDR = ABHADR[0]; 
# 
*     GET A VCB ORDINAL.  IF NO ORDINAL AVAILABLE, SEND CR/ITE/A
*     RESPONSE AND EXIT.  OTHERWISE, CONTINUE PROCESSING. 
# 
      NVFUAFV(VCBORD,ERRFLAG);         # OBTAIN AN AVAILABLE VCB ORD   #
      IF ERRFLAG
      THEN                             # NO VCB ORDINAL AVAILABLE      #
        BEGIN                          # BUILD CR/ITE/A RESPONSE       #
        PFCSFC[1]  = CRITEA;
        CRRITE[1] = RCIT"NVC";
        CRACN[1]   = CRACN[0];
        NVFUMQE(P<CTQ>,APSM[1],APPPR$,ADDR,LCRITEA);  # RESPONSE TO Q  #
  
        RETURN; 
        END 
# 
*     VCB ORDINAL AVAILABLE, PROCEED TO ALLOCATE SPACE FOR A NEW PTAC 
*     ENTRY.
# 
      PT = PTALNGTH / PTACSIZ$;        # CALCULATE NEW PTAC ENTRY ORD  #
      SSTATS(P<PTAC>,PTACSIZ$);        # ALLOC SPACE FOR PTAC ENTRY    #
# 
*     CLEAR NEW PTAC BUFFER.
# 
      P<BPTAC> = LOC(PTAC[PT]);        # POINTS TO NEW PTAC ENTRY      #
      FOR I = 0 STEP 1 UNTIL (PTACSIZ$ - 1) 
      DO
        BEGIN 
        BPT$WORD[I] = 0;
        END 
# 
*     CONVERT ASCII NAME TO DISPLAY NAME AND STORE IN TEMPORARY.
# 
      AORD  = 1;                       # LOCATION OF ASCII NAME        #
      SBITA = 4;                       # STARTING BIT OF ASCII NAME    #
      DORD  = 0;                       # LOCATION OF DISPLAY NAME      #
      SBITD = 0;                       # STARTING BIT OF DISPLAY NAME  #
      FOR I = 0 STEP 1 UNTIL 6
      DO
        BEGIN 
        SSBEBF(NVFSM[0],AORD,SBITA,8,ADCHAR);  # EXTRACT 1 ASCII CHAR  #
        ADCHAR = SSDCAD(ADCHAR);       # CONVERT TO DISPLAY            #
        SSBSBF(CTEMP,DORD,SBITD,6,ADCHAR);     # STORE 1 DISPLAY CHAR  #
        END 
  
  
# 
*     SEARCH THE ALT FOR THIS TERMINAL.  IF FOUND STORE THE AUTO
*     LOGIN INFO IN THE PTAC ENTRY. 
# 
  
      FOR I=0 STEP 1 WHILE CTEMP NQ ALT$TNAM[I] AND 
                           I LQ ALTL/ALTSIZ$
      DO
        BEGIN 
        END 
  
  
      IF I LQ ALTL/ALTSIZ$
      THEN
        BEGIN 
        PTA$ALIF[PT] = TRUE;
        PTA$AFWRD[PT] = ALT$WRD1[I];
        PTA$AUWRD[PT] = ALT$WRD2[I];
        PTA$AAWRD[PT] = ALT$WRD3[I];
        END 
  
# 
*     BUILD CR/ITE/N RESPONSE.
# 
      PFCSFC[1]  = CRITEN;
      CRACN[1]   = CRACN[0];
      CRNXP[1]   = TRUE;
      CRICT[1]   = ICT$;
      CRALN[1]   = ALN$;
      CRVCB[1]   = VCBORD;
      CRITN[1]   = CTEMP; 
  
      NVFUMQE(P<CTQ>,APSM[1],APPPR$,ADDR,LCRITEN);  # TRNSFR RSP TO Q  #
# 
*     BUILD PTAC ENTRY. 
# 
      PTA$TN[PT]   = CRITN[1];
      PTA$ICF[PT]  = CRIC[0]; 
      PTA$ACN[PT]  = CRACN[0];
      PTA$VCB[PT]  = VCBORD;
      PTA$ABL[PT]  = CRITABL[0];
      PTA$SDT[PT]  = CRSDT[0];
      PTA$DT[PT]   = CRITDT[0]; 
      PTA$TC[PT]   = CRITTC[0]; 
      PTA$DO[PT]   = CRDO[0]; 
      PTA$PW[PT]   = CRITPW[0]; 
      PTA$PL[PT]   = CRITPL[0]; 
      PTA$XBZ[PT]  = CRXBZ[0];
      PTA$NET[PT]  = CRINET[0]; 
      PTA$UBZ[PT]  = CRUBZ[0];
      PTA$SL[PT]   = CRSL[0]; 
      PTA$DBZ[PT]  = CRDBZ[0];
      PTA$CNTIME[PT] = CTM$PDT[0];
      PTA$HW[PT]   = CRHW[0]; 
      PTA$VTP[PT] = CRVTP[0]; 
      PTA$IUVF[PT] = TRUE;
# 
*     IF SYNCHRONOUS CONSOLE, CALL *SSTATS* TO ALLOCATE SPACE FOR A NEW 
*     PDCT ENTRY.  FOR ALL INTERACTIVE DEVICES, SEND BANNER AND CALL
*     *NVFTILP* TO ISSUE APPROPRIATE PROMPT.  FOR PASSIVE DEVICES, ADD
*     DEVICE TO ITS OWNING CONSOLE'S PDCT ENTRY AND DETERMINE IF DEVICE 
*     IS TO BE SWITCHED IMMEDIATELY.
# 
      PTDT = PTA$DT[PT];
      GOTO DTYPSWT[PTDT]; 
  
LLINT:                                 # CONSOLE AND USER DEVICE TYPE  #
      PTA$PROMPT[PT] = AWTFAM$;        # AWAIT FAMILY PROMPT           #
      IF PTA$TC[PT] GQ TC9$ 
      THEN                             # SYNCHRONOUS CONSOLE DEVICE    #
        BEGIN                          # CREATE PDCT ENTRY             #
        PD = PDTLNGTH;                 # SAVE NEW PDCT SUBSCRIPT       #
        SSTATS(P<PDCT>,PDCTSIZ$);      # ALLOCATE SPACE FOR PDCT ENTRY #
# 
*       CLEAR NEW PDCT BUFFER.
# 
        FOR I = PD STEP 1 UNTIL (PDTLNGTH - 1)
        DO
          BEGIN 
          PDT$WORD[I] = 0;
          END 
  
        PDT$CN[PD]  = PTA$TN[PT]; 
        PDT$WC[PD]  = PDCTSIZ$; 
        PDT$CSTAT[PD+1] = PDCTST"AWTCVAL";
        PDT$CVCB[PD+1]  = PTA$VCB[PT];
        END 
# 
*     CHECK TERMINAL CLASS TO SEE IF NVF SHOULD SEND A CTR/CHAR.
# 
      ADDR = PTA$ACN[PT];              # APPLICATION CONNECTION NUMBER #
      GOTO TERMCLS [PTA$TC[PT]];
  
SENDCTRCHAR:  
  
# 
*     SEND CTR/CHAR TO FORCE TERMINAL TO BE IN NON-TRANSPARENT INPUT
*     MODE. 
# 
      PFCSFC[1] = CTRCHAR;
      CTRSTR[1] = 0;                   # CLEAR REST OF WORD 0          #
      B<0,16>CTRSTR[1] = NOXPAR$;      # ADD FN/FV PAIR FOR NON-XPARENT#
      NVFUMQE(P<CTQ>,APSM[1],APPPR$,ADDR,LCTRLO$); # TRANSFER TO QUEUE #
  
NOCTRCHAR:  
  
# 
*     BUILD BANNER AND CALL *NVFTILP* TO ISSUE APPROPRIATE PROMPT.
# 
      BAN$DATE[0]   = C<1,9>CTM$DATE[0];  # SET DATE                   #
      BAN$TIME[0]   = CTM$CLOCK[0];    # SET TIME OF DAY               #
      BAN$TNAM[0]   = PTA$TN[PT];      # TERMINAL NAME                 #
      NVFUMQE(P<CTQ>,CPRBUF[0],APPTTX$,ADDR,LMSG90$); 
      NVFUMQE(P<CTQ>,BANBUF[0],APPTTX$,ADDR,LMSG30$);  # TRANSFER TO Q #
      NVFUMQE(P<CTQ>,SYSHDR[0],APPTTX$,ADDR,LMSG70$);  # TRANSFER TO Q #
      NVFTILP(PT);                     # ISSUE PROMPT IF REQUIRED      #
  
      GOTO ENDDTYP; 
  
LLPASV:                                # PASSIVE DEVICE TYPE           #
# 
*     CONVERT ASCII OWNING CONSOLE NAME TO DISPLAY AND STORE IN PTAC
*     ENTRY.
# 
      AORD  = 3;                       # LOCATION OF ASCII NAME        #
      SBITA = 4;                       # STARTING BIT OF ASCII NAME    #
      DORD  = 2;                       # LOCATION OF DISPLAY NAME      #
      SBITD = 0;                       # STARTING BIT OF DISPLAY NAME  #
      FOR I = 0 STEP 1 UNTIL 6
      DO
        BEGIN 
        SSBEBF(NVFSM[0],AORD,SBITA,8,ADCHAR);  # EXTRACT 1 ASCII CHAR  #
        ADCHAR = SSDCAD(ADCHAR);       # CONVERT TO DISPLAY            #
        SSBSBF(PTAC[PT],DORD,SBITD,6,ADCHAR);  # STORE 1 DISPLAY CHAR  #
        END 
  
# 
*     SEARCH PDCT TABLE FOR ENTRY BELONGING TO THIS DEVICE'S OWNING 
*     CONSOLE.
# 
      MATCH = FALSE;
      FOR PD = 0 STEP PDT$WC[PD] WHILE (NOT MATCH AND PD LS PDTLNGTH) 
      DO
        BEGIN 
        IF PDT$CN[PD] EQ PTA$OCN[PT]
        THEN
          BEGIN                        # FOUND OWNING CONSOLE ENTRY    #
          PO = PD + PDT$WC[PD];        # POSITION TO ENLARGE TABLE     #
          SSTETS(P<PDCT>,PO,1);        # ENLARGE TABLE BY 1 WORD       #
          PDT$WC[PD] = PDT$WC[PD] + 1;  # UPDATE PDCT WORD COUNT       #
          PDT$PN[PO] = PTA$TN[PT];     # SAVE TERMINAL NAME            #
          PDT$PVCB[PO] = PTA$VCB[PT];  # SAVE VCB ORDINAL              #
          PDT$PSTAT[PO] = PDCTST"AWTCON";  # SET STATE TO AWAIT CONSOL #
          IF PDT$CSTAT[PD+1] EQ PDCTST"CONSWT"
          THEN                         # CONSOLE HAS BEEN SWITCHED     #
            BEGIN 
            NVFTDSP(PT,PD);            # SWITCH DEVICE IF POSSIBLE     #
            END 
          MATCH = TRUE; 
          END 
        END 
  
      IF NOT MATCH
      THEN                             # NO ENTRY IN PDCT TABLE        #
        BEGIN 
        DAY$TNAME[0] = PTA$OCN[PT]; 
        MESSAGE(DAYMSG,0);             # MSG TO SYSTEM AND USR DAYFILE #
        NVFTETC(PT);                   # END TERMINAL CONNECTION       #
        END 
  
      GOTO ENDDTYP; 
  
ENDDTYP:                               # COMMON END PROCESSING         #
      END  # END NVFTITE #
  
TERM
