*DECK     NVFTVVD 
USETEXT          TEXTNVF
USETEXT          TEXTSS 
USETEXT          TXSMNVF
USETEXT          TXTANVF
USETEXT          TXTAPSS
  
PROC NVFTVVD; 
# TITLE NVFTVVD - VERIFY VALIDATION DATA                               #
  
      BEGIN  # NVFTVVD #
# 
**    NVFTVVD - VERIFY VALIDATION DATA. 
* 
*     E. THAVIKULWAT    81/10/14
* 
*     THIS PROCEDURES' MAIN FUNCTION IS TO DETERMINE WHETHER OR NOT 
*     USER VERIFICATION WAS SUCCESSFUL.  IT IS CALLED INTO EXECUTION
*     BY PROCEDURE *NVFTDQE*. 
* 
*     PROC NVFTVVD
* 
*     ENTRY:  
*       WC IN *WCBUF* 
*       ABH IN *ABHBUF* 
*       VERIFICATION DATA IN *MSGBUF* 
* 
*     EXIT: 
*       PASSWORD OVERMASK IS ISSUED ON LOGIN FOR ASYNCHRONOUS 
*       TERMINAL CLASSES  AND ONE OF THE FOLLOWING: 
*         1) APPLICATION PROMPT ISSUED. 
*         2) CONNECTION SWITCHED TO APPROPRIATE APPLICATION.
*         3) CONNECTION TERMINATED. 
*         4) PERSONAL IDENTIFIER PROMPT ISSUED. 
* 
*     NOTES:  
*       SHOULD A CONNECTION-BROKEN OCCUR PRIOR TO THIS, NO FURTHER
*       PROCESSING OF THE DATA IS DONE AND THE TERMINATING ROUTINE
*       IS CALLED.  VERIFICATION IS SUCCESSFUL ONLY IF THE SECURITY 
*       COUNT IS NOT EXHAUSTED, FAMILY NAME, USER NAME, PASSWORD, AND 
*       PERSONAL ID ARE VALID, AND THE USER IS VALIDATED FOR AT LEAST 
*       ONE APPLICATION.
*       IF THE TERMINAL CLASS IS 8 OR UNDER (ASYNCHRONOUS) BUT NOT A
*       IBM2741, THE TERMINAL INPUT LINE CONTAINING THE PASSWORD WILL 
*       BE MASKED.  SEE FURTHER NOTES IN INTERNAL PROCEDURE *MASKINPUT*.
* 
*     METHOD: 
*       SEARCH PTAC TABLE FOR ENTRY THAT MATCHES ACN OF THIS REQUEST. 
*       IF MATCH, INITIAL LOGIN, AND THE TERMINAL IS OF THE 
*       ASYNCHRONOUS TERMINAL CLASS, ISSUE THE PASSWORD OVERMASK. 
*       COPY THE VALIDATION DATA INTO THE PTAC ENTRY.  IF 
*       CONNECTION-BROKEN OCCURRED PRIOR TO THIS, CALL *NVFTETC* AND
*       EXIT.  IF TERMINAL IS STILL CONNECTED, VERIFY VALIDATION DATA 
*       AND ROUTE CONTROL TO THE APPROPRIATE ROUTINE.  IF NO PTAC 
*       ENTRY IS FOUND FOR THIS ACN, SET UP DECREMENT FAMILY COUNT
*       (73B) AND EXIT. 
# 
  
# 
****  PROC NVFTVVD - XREF LIST. 
# 
  
      $BEGIN
      XREF
        BEGIN 
        PROC ABORT;          # ABORT JOB                               #
        PROC MESSAGE;        # SEND MESSAGE TO SYSTEM AND USER DAYFILE #
        END 
      $END
  
      XREF
        BEGIN 
        PROC NVFSCAD;        # COMPLETE APPLICATION DEPARTURE          #
        PROC NVFTETC;        # END TERMINAL CONNECTION                 #
        PROC NVFTILP;        # ISSUE LOGIN PROMPTS                     #
        PROC NVFTPSV;        # PROCESS SUCCESSFUL VALIDATION           #
        PROC NVFTPUV;        # PROCESS UNSUCCESSFUL VALIDATION         #
        PROC NVFTURT;        # UPDATE *RAU* TABLE                      #
        PROC NVFTVAA;        # VALIDATE USER'S RIGHT TO ACCESS APPL    #
        PROC NVFUMQE;        # TRANSFER TEXT QUEUE                     #
        PROC SSTAQE;         # ACCEPT QUEUE ENTRY                      #
        FUNC XSFW C(10);     # SPACE FILL WORD                         #
        END 
  
*CALL TMSGNVF 
  
  
# 
****
# 
      ITEM AS         I;     # SUBSCRIPT FOR ARRAY AST                 #
      ITEM ASENTRY    I;     # NUMBER OF AST ENTRIES                   #
      ITEM I          I;     # LOOP VARIABLE                           #
      ITEM J          I;     # LOOP VARIABLE                           #
      ITEM LNGTH      I;     # LENGTH OF MESSAGE                       #
      ITEM MATCH      B;     # EXIT LOOP VARIABLE                      #
      ITEM NENTRY     I;     # NUMBER OF ENTRIES IN TABLE              #
      ITEM PRIAPP     B;     # PRIMARY APPLICATION INDICATOR           #
      ITEM PT         I;     # SUBSCRIPT FOR ARRAY PTAC                #
      ITEM PTTC       I;     # TERMINAL CLASS                          #
  
      $BEGIN
# 
*     FOLLOWING ARRAY CONTAINS MESSAGE ISSUED TO THE DAYFILE UPON NOT 
*     FINDING AN EXPECTED PTAC ENTRY. 
# 
      ARRAY DAYMSG[00:00] S(4); 
        BEGIN 
        ITEM DAY$MSG1   C(00,00,27) = ["NVFTVVD - CANNOT FIND PTAC "];
        ITEM DAY$MSG2   C(02,42,05) = ["ENTRY"];
        END 
  
      $END
  
# 
*     THE FOLLOWING ARRAY WILL BE USED AS TEMPORARY STORAGE OF THE
*     PERSONAL ID 
# 
      ARRAY PIDENTRY[00:00] S(2); 
        BEGIN 
        ITEM PID$WRD1   U(00,00,60);
        ITEM PID$WRD2   U(01,00,60);
        ITEM PID$CHAR   C(00,00,20);
        END 
  
# 
*     THE FOLLOWING BASED ARRAY POINTER POINTS TO THE FIRST WORD OF 
*     THE VALIDATION DATA PORTION OF THE PTAC ENTRY.
# 
      BASED ARRAY BPTACVD[00:00] S(1);
        BEGIN 
        ITEM BPT$WORD   U(00,00,60);   # FULL WORD REFERENCE           #
        END 
  
# 
*     SEARCH PTAC TABLE FOR ENTRY THAT MATCHES ON ACN.
# 
      MATCH  = FALSE; 
      NENTRY = PTALNGTH / PTACSIZ$;    # CALCULATE NUMBER OF ENTRIES   #
      FOR PT = 0 STEP 1 WHILE (NOT MATCH AND PT LS NENTRY)
      DO
        BEGIN 
        IF PTA$VCB[PT] EQ ABHADR[0] 
        THEN                           # PTAC ENTRY FOUND              #
          BEGIN 
  
# 
*         COPY VALIDATION DATA FROM *MSGBUF* TO PTAC ENTRY. 
# 
          P<BPTACVD> = LOC(PTA$FWORD[PT]);   # POINTS TO FAMILY WORD   #
          FOR I = 0 STEP 1 UNTIL (WCB$WC[0] - 9)
          DO
            BEGIN 
            BPT$WORD[I] = MSG$WORD[I];
            END 
  
# 
*         COPY CHARGE AND PROJECT DATA FROM *MSGBUF* TO PTA ENTRY 
# 
  
          J = I;
          P<BPTACVD> = LOC(PTA$CHGNUM[PT]);  # POINTS TO CHARGE NUMBER #
          FOR I = 0 STEP 1 UNTIL 2
          DO
            BEGIN 
            BPT$WORD[I] = MSG$WORD[J+I];
            END 
  
# 
*     COPY THE PERSONAL IDENTIFIER *MSGBUF* TO A TEMPORARY LOCATION AND 
*     COPY THE PASSWORD EXPIRATION DATE FROM *MSGBUF* TO THE PTAC ENTRY.
# 
          J = J + I;
          PID$WRD1[0] = MSG$WORD[J];
          PID$WRD2[0] = MSG$WORD[J + 1];
          P<BPTACVD> = LOC(PTA$EXPDAT[PT]); 
          BPT$WORD[0] = MSG$WORD[J + 2];
# 
*         IF THIS IS A USER LOGIN, TERMINAL CLASS IS ANY ASYNCHRO-
*         NEOUS TYPE OTHER THAN TC2741, AND NEITHER A MANDATORY 
*         NOR A PRIMARY USER NAME HAS BEEN SPECIFIED IN NDL FOR 
*         THIS TERMINAL, THEN WE NEED TO SEND OUT A PASSWORD MASK.
# 
          PTTC = PTA$TC[PT];
          IF (PTA$IUVF[PT]) AND (PTTC LQ TCT4014$) AND (PTTC NQ TC2741$)
             AND (PTA$USRIND[PT] NQ MNDATRY$) 
             AND (PTA$USRIND[PT] NQ PRIMARY$) 
            AND (NOT PTA$WSV[PT]) 
         THEN 
            MASKINPUT(PTA$PROMPT[PT] - 1);
# 
*     IF THE PERSONAL IDENTIFIER IS NOT REQUIRED FOR THE USER, BUT IT 
*     WAS ASSUMED TO HAVE BEEN ENTERED, THE ENTRY WAS ACTUALLY THE
*     APPLICATION ENTRY.  THE ENTRY WILL BE MOVED TO THE APPLICATION
*     PORTION OF THE PTAC TABLE AND THE ZERO FILLED ENTRY WILL BE 
*     CHANGED TO BE A BLANK FILLED ENTRY. 
# 
          IF (PTA$COPI[PT] OR (PID$CHAR[0] EQ NULL$)) 
              AND PTA$VPIDF[PT] 
          THEN
            BEGIN 
            PTA$VLTAPP[PT] = XSFW(PTA$APPPID[PT]);
            PTA$PID[PT] = NULL$;
            PTA$VPIDF[PT] = FALSE;     # NO VOLUNTEERED PERSONAL ID    #
            PTA$VAF[PT] = TRUE;        # A VOLUNTEERED APPL EXISTS     #
            END 
  
# 
*         IF CONNECTION-BROKEN HAS OCCURRED, TERMINATE CONNECTION.
*         OTHERWISE, CHECK VALIDATION DATA AND ROUTE CONTROL TO THE 
*         APPROPRIATE ROUTINES. 
# 
          IF PTA$STATE[PT] EQ PTACST"CONBROK" 
          THEN                         # CONNECTION BROKEN OCCURRED    #
            BEGIN 
# 
*           IF THIS IS A LOAN REQUEST, LOCATE THE PRIMARY APPL *AST*
*           ENTRY AND DECREMENT THE NUMBER OF RESERVED CONNECTIONS. 
*           UPDATE THE *RAU* TABLE IF NECESSARY.
# 
            IF PTA$LRC[PT] GQ RCRC"LSA" 
            THEN
              BEGIN 
              PRIAPP = TRUE;
              NVFTURT(PTA$VCB[0],PT,PRIAPP);
  
              ASENTRY = ASTLNGTH/ASTSIZ$; 
              FOR AS = 0 STEP 1 WHILE 
                ((AS LS ASENTRY) AND
                 (AST$AN[AS] NQ PTA$PRIAN[PT])) 
              DO
                BEGIN 
                END 
              IF AS LS ASENTRY
              THEN
                BEGIN 
                AST$RACN[AS] = AST$RACN[AS] - 1;
                NVFSCAD(AS);
                END 
              END 
            NVFTETC(PT);               # END TERMINAL CONNECTION       #
            END 
          ELSE                         # TERMINAL STILL CONNECTED      #
            BEGIN 
# 
*     IF DEVICE ERROR FLAG IN PTAC IS SET, SEND "FAMILY NOT AVAILABLE,
*     TRY AGAIN LATER" MESSAGE TO TERMINAL AND END THE CONNECTION.
# 
            IF PTA$DVERR[PT]
            THEN
              BEGIN 
              NVFUMQE(P<CTQ>,FNABUF[0],APPTTX$,PTA$ACN[PT],LMSG50$);
              NVFTETC(PT);             # END TERMINAL CONNECTION       #
              RETURN; 
              END 
  
            IF (PTA$SCINV[PT] EQ 0) 
              AND ((PTA$AAVW[PT] LAN VAPMASK) NQ 0) 
            THEN                       # VALID LOGIN                   #
              BEGIN 
              IF (NOT PTA$WSV[PT])
              THEN
                BEGIN 
  
# 
*     THIS IS A ORIGINAL VALIDATION AND EVERYTHING IS VALID.
*     VALIDATE THE PERSONAL ID IF IT IS REQUIRED AND HAS BEEN ENTERED.
*      IF IT HAS NOT BEEN VOLUNTEERED PROMPT THE USER FOR IT. 
# 
  
                IF (NOT PTA$COPI[PT]) AND (PID$CHAR[0] NQ NULL$)
                THEN                   # PERSONAL IDENTIFIER REQUIRED  #
                  BEGIN 
                  IF PTA$VPIDF[PT]
                  THEN                 # PERSONAL ID VOLUNTEERED       #
                    BEGIN 
                    IF (PID$CHAR[0] NQ PTA$PID[PT]) 
                    THEN               # PERSONAL ID ENTERED INVALID   #
                      BEGIN 
                      PTA$INVPID[PT] = TRUE;
                      NVFTPUV(PT);     # PROCESS UNSUCCESSFUL VALIDATN #
  
                      RETURN;          # EXIT                          #
                      END 
                    END 
                  ELSE                 # PERSONAL ID NOT VOLUNTEERED   #
                    BEGIN 
                    PTA$PID[PT] = PID$CHAR[0];
                    PTA$PROMPT[PT] = AWTPID$; 
                    NVFTILP(PT);       # ISSUE PERSONAL ID LOGIN PROMPT#
  
                    RETURN;            # EXIT                          #
                    END 
                  END 
                IF PID$CHAR[0] NQ NULL$ 
                THEN                   # SAVE PID FOR ACCOUNT MESSAGE  #
                  PTA$PID[PT] = PID$CHAR[0];
                NVFTPSV(PT);           # PROCESS SUCCESSFUL VALIDATION #
                IF PTA$STATE[PT] EQ PTACST"AWTVAA"
                THEN                   # NEED TO VALIDATE              #
                  BEGIN 
                  NVFTVAA(PT);         # VALIDATE RIGHT TO ACCESS APPL #
                  END 
                END 
              ELSE
  
# 
*     THIS IS A REVALIDATION. FAMILY AND USER NAME ARE GOOD,
*     BUT PASSWORD IS INVALID.
# 
  
                BEGIN 
                PTA$INVLF[PT]=TRUE; 
                PTA$UIDX[PT] = 0;      # CLEAR USER INDEX FIELD        #
                PTA$WSV[PT]=FALSE;
                IF ((NOT PTA$COPI[PT]) AND (PID$CHAR[0] NQ NULL$) AND 
                   (PTA$AAWC[PT] NQ NULL$) AND (NOT PTA$VPIDF[PT])) 
                THEN                   # INVALID PASSWORD,PID REQUIRED #
                  BEGIN 
                  PTA$PROMPT[PT] = AWTPID$; 
                  NVFTILP(PT);         # ISSUE PERSONAL ID LOGIN PROMPT#
                  END 
                ELSE                   # PID NOT REQUIRED              #
                  BEGIN 
                  NVFTPUV(PT);         # PROCESS UNSUCCESSFUL VALIDATIO#
                  RETURN; 
                  END 
                END 
              END 
            ELSE                       # INVALID LOGIN                 #
              BEGIN 
              IF (NOT PTA$WSV[PT])
              THEN
                BEGIN 
  
# 
*   THIS IS A ORIGINAL VALIDATION, SINCE IT IS A INVALID LOGIN, WE NEED 
*   TO ISSUE CPM56 REQUEST TO REVALIDATE FAMILY AND USER NAME AGAIN.
# 
  
                P<CRQBUF>=LOC(MSGBUF[0])+((NMSGBUF$+1)/2);
                CRQ$FCWORD[0]=0;
                CRQ$FWORD[0]=0; 
                CRQ$PWORD[0]=0; 
                CRQ$UWORD[0]=0; 
                CRQ$FC[0]=CPM56B$;
                CRQ$ACN[0]=PTA$VCB[PT]; 
                CRQ$FNAM[0]=PTA$FNAM[PT]; 
                CRQ$VPWF[0]=TRUE;      # PASSWORD NOT TO BE VALIDATED  #
                CRQ$IFCTF[0]=FALSE;    # DO NOT INCREMENT FAMILY COUNT #
                CRQ$RETPID[0] = TRUE;  # RETURN THE PERSONAL IDENTIFIER#
                CRQ$UNUM[0]=PTA$UNUM[PT]; 
                CRQ$QNUM[0]=LOC(P<VDATAQ>); 
                LNGTH=CRQVSIZ$*10;
                NVFUMQE(P<CPMRQ>,CRQBUF[0],APPTTX$,0,LNGTH);
                PTA$STATE[PT]=PTACST"AWTVAL"; 
                PTA$PWEXPF[PT]=TRUE;   # DO NOT REISSUE PW EXP MESSAGE #
                PTA$WSV[PT]=TRUE;      # WAIT FOR SECOND VALIDATION    #
                RETURN; 
                END 
              ELSE
  
# 
*     THIS IS A REVALIDATAION. FAMILY AND USER NAME ARE NOT 
*     VALID. SET UP THE FLAG IN ORDER NOT TO ISSUE FAMILY AND USER
*     NAME IN AN "ABER" ACCOUNTING MESSAGE, SINCE THE INVALID USER
*     NAME COULD PROBABLY BE A PASSWORD.
# 
  
                BEGIN 
                PTA$WSV[PT]=FALSE;
                PTA$IFU[PT]=TRUE;      # BAD FAMILY/USER NAME PACK     #
                NVFTPUV(PT);           # PROCESS UNSUCCESSFUL VALIDATN #
                END 
              END 
            END 
  
          MATCH = TRUE; 
          END 
        END  # END FOR PT LOOP #
  
# 
*     IF NO PTAC ENTRY COULD BE FOUND, DECREMENT FAMILY COUNT AND EXIT. 
# 
      IF NOT MATCH
      THEN                             # NO PTAC ENTRY FOUND           #
        BEGIN 
        $BEGIN
        MESSAGE(DAYMSG,0);             # MSG TO SYSTEM AND USR DAYFILE #
        ABORT;
        $END
  
        P<CRQBUF>     = LOC(MSGBUF[0]) + ((NMSGBUF$ + 1) / 2);
        CRQ$FCWORD[0] = 0;
        CRQ$FWORD[0]  = 0;
        CRQ$FC[0]     = CPM73B$;
        CRQ$ACN[0]    = 0;
        CRQ$FNAM[0]   = MSG$CHAR[0];
  
        LNGTH = CRQDSIZ$ * 10;
        NVFUMQE(P<CPMRQ>,CRQBUF[0],APPTTX$,0,LNGTH);
        END 
  
CONTROL EJECT;
PROC MASKINPUT((PROMPT)); 
# TITLE MASKINPUT - OVERMASK INPUT LINE                                #
  
      BEGIN  # MASKINPUT #
# 
**    MASKINPUT - OVERMASK INPUT LINE 
* 
*     G. A. HUGHES      86/02/17
* 
*     THIS PROCEDURE IS INTERNAL TO PROCEDURE *NVFTVVD* AND IS CALLED 
*     ONLY BY *NVFTVVD*.  IT'S MAIN FUNCTION IS TO OVERMASK THE INPUT 
*     LINE CONTAINING THE PASSWORD. 
* 
*     PROC MASKINPUT
* 
*     ENTRY:  
*       *PROMPT* CONTAINS THE A LABEL POINTER TO LAST PROMPT ISSUED.
* 
*     EXIT: 
*       MASK BUILT AND ISSUED TO THE QUEUE. 
* 
*     NOTES:  
*       1) IF THE PROMPT IS A PASSWORD PROMPT AND THE TERMINAL IS A M33,
*          A 2741, OR A T4014, THEN THE MASK IS BUILT WITHOUT A PROMPT. 
*       2) IN ALL OTHER CASES THE PROMPT WILL BEGIN EACH CHARACTER OF 
*          THE MASK.
*       3) THE FIRST TWO CHARACTERS IN THE SECOND WORD OF THE PROMPT
*          MUST REMAIN BLANKS TO RETAIN THE ORIGINAL SPACING. 
* 
*     METHOD: 
*       DETERMINE HOW MANY CM WORDS EACH MASK LINE WILL NEED.  INSERT 
*       THE PROMPT AND THE MASK CHARACTERS INTO THE BUFFER.  BEFORE 
*       EACH LINE OF THE MASK A FORMAT EFFECTOR IS INSERTED TO SET THE
*       CURSOR BACK TO THE BEGINNING OF THE LINE.  A LINE FEED FORMAT 
*       EFFECTOR IS ISSUED FOLLOWING THE MASK AND CURSOR POSITIONING
*       IS REINSTATED.
# 
  
      DEF NUMBERMASK #4#;    # NUMBER OF SEPARATE MASKS TO GENERATE    #
      DEF BEGIN$LINE #"+"#;  # POSITION TO START OF CURRENT LINE FE    #
      DEF NEW$LINE   #" "#;  # SPACE ONE LINE FORMAT EFFECTOR          #
  
      ITEM IDX           I;  # INDEX FOR SECOND HALF OF *MSGBUF*       #
      ITEM MASK$CHAR     I;  # NUMBER OF CHAR BEYOND WORD BOUNDARY     #
      ITEM MASK$WORD     I;  # NUMBER OF WORDS TO MASK                 #
      ITEM MSK           I;  # MASK NUMBER LOOP COUNTER                #
      ITEM PROMPT        I;  # LAST PROMPT ISSUED                      #
      ITEM WD            I;  # *MSGBUF* LOOP COUNTER                   #
      ITEM WORD$NUMBER   I;  # CURRENT WORD OF MASK BEING BUILT        #
  
# 
*     THE FOLLOWING BUFFER IS USED TO ISSUE  A LINE FEED TO A TERMINAL
*     WHEN THE TERMINAL INPUT DOES NOT CONTAIN A PASSWORD.
# 
      ARRAY NEWLINE[00:00] S(1);
        BEGIN 
        ITEM LINEFEED   C(00,00,01) = [" "];
        END 
  
# 
*     THE FOLLOWING ARRAY DEFINES THE CHARACTERS TO BE USED IN BUILDING 
*     THE OVERMASK. 
# 
      ARRAY DEFMASK[00:03] S(6);
       BEGIN
       ITEM DEF$WORD   C(00,00,60) =             # FULL WORD REFERENCE #
       ["HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", 
        "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII", 
        "############################################################", 
        "                                                            "];
       END
  
# 
*     THE FOLLOWING BASED ARRAY POINTS TO THE MASK BEING BUILT. 
# 
  
      BASED ARRAY BLDMASK[00:00] S(1);
        BEGIN 
        ITEM BLD$WRD1   C(00,00,10);   # SINGLE WORD REFERENCE         #
        END 
  
# 
*     THE FOLLOWING BASED ARRAY POINTS TO A TWO WORD FIELD FOR THE MASK 
# 
  
      BASED ARRAY BLDMASK2[00:00] S(2); 
        BEGIN 
        ITEM BLD$WRD2   C(00,00,20);   # DOUBLE WORD REFERENCE         #
        END 
  
# 
*     THE FOLLOWING BASED ARRAY POINTS TO A SEVEN WORD FIELD FOR THE
*     MASK. 
# 
  
      BASED ARRAY BLDMASK7[00:00] S(7); 
        BEGIN 
        ITEM BLD$WRD7   C(00,00,70);   # SEVEN WORD REFERENCE          #
        END 
  
      SWITCH MPRMTSWT 
                 MLLAPPL,    # LABEL FOR APPLICATION PROMPT            #
                 MLLPRID,    # LABEL FOR PERSONAL ID PROMPT            #
                 MLLPWRD,    # LABEL FOR PASSWORD PROMPT               #
                 MLLUSER,    # LABEL FOR USER PROMPT                   #
                 MLLFAM;     # LABEL FOR FAMILY PROMPT                 #
  
# 
*     CLEAR OUT GOING SUPERVISORY MESSAGE BUF (SECOND HALF OF *MSGBUF*) 
# 
  
      IDX = (NMSGBUF$ + 1) / 2;        # INDEX TO 2ND HALF OF *MSGBUF* #
      FOR WD = IDX STEP 1 UNTIL NMSGBUF$
      DO
        BEGIN 
        MSG$WORD[WD] = 0; 
        END 
  
      P<BLDMASK> = LOC(MSGBUF[0]) + ((NMSGBUF$ + 1) / 2); 
      MASK$CHAR = 60; 
  
      MASK$WORD = (MASK$CHAR / 10) + 1;  # NUMBER OF WORDS IN INPUT    #
      WORD$NUMBER = 0;
      IF ((PTTC EQ TCM33$) OR (PTTC EQ TCT4014$)) 
         AND (PTA$PROMPT[PT] EQ AWTPWD$)
      THEN                             # PASSWORD NOT ON PROMPT LINE   #
        BEGIN 
        IF (MASK$CHAR - ((MASK$WORD - 1) * 10) GQ 8)
        THEN                           # INSURE ZERO BYTE, INCLUDE FE  #
           MASK$WORD = MASK$WORD + 1; 
  
        FOR MSK = 0 STEP 1 UNTIL (NUMBERMASK - 1) 
        DO
          BEGIN 
          C<0,1>BLD$WRD1[WORD$NUMBER] = BEGIN$LINE; 
          C<1,MASK$CHAR>BLD$WRD1[WORD$NUMBER] = DEF$WORD[MSK];
          WORD$NUMBER = WORD$NUMBER + MASK$WORD;
          END 
        END 
      ELSE                             # PASSWRD ENTERD ON PROMPT LINE #
        BEGIN 
        IF (MASK$CHAR - ((MASK$WORD - 1) * 10) GQ 7)
        THEN                           # INCREMENT FOR ZERO BYTE       #
          MASK$WORD = MASK$WORD + 1;
  
        FOR MSK = 0 STEP 1 UNTIL (NUMBERMASK - 1) 
        DO
          BEGIN 
          P<BLDMASK2> = LOC(BLD$WRD1[WORD$NUMBER]); 
          GOTO MPRMTSWT[PROMPT];
  
MLLFAM: 
          C<0,12>BLD$WRD2[0] = FAM$PRMT;
          GOTO ENDMASK; 
  
MLLUSER:  
          C<0,12>BLD$WRD2[0] = USR$PRMT;
          GOTO ENDMASK; 
  
MLLPWRD:  
          C<0,12>BLD$WRD2[0] = PWD$PRMT;
          GOTO ENDMASK; 
  
MLLPRID:  
MLLAPPL:  
ENDMASK:                               # END OF CASE                   #
          C<0,1>BLD$WRD2[0] = BEGIN$LINE; 
          WORD$NUMBER = WORD$NUMBER + 1;
          C<2,MASK$CHAR>BLD$WRD1[WORD$NUMBER] = DEF$WORD[MSK];
          WORD$NUMBER = WORD$NUMBER + MASK$WORD;
          END 
        END 
  
# 
*     ADD A LINE FEED TO THE GENERATED OVERMASK, QUEUE THE BUFFER,
*     AND TURN CURSOR POSITIONING BACK ON.
# 
      C<0,1>BLD$WRD1[WORD$NUMBER] = NEW$LINE; 
      WORD$NUMBER = WORD$NUMBER + 1; # INCREMENT FOR ACTUAL COUNT    #
      WCB$WC[1] = WORD$NUMBER + 2;
      ABHWORD[1] =0;
      ABHABT[1] = APPTTX$;
      ABHADR[1] = PTA$ACN[PT];
      ABHACT[1] = CT6DISPLAY; 
      ABHTLC[1] = WORD$NUMBER * 10; 
      SSTAQE(P<CTQ>,WCBUF[1],ABH[1],BLDMASK[0]);
      END  # MASKINPUT #
  
      END  # END NVFTVVD #
  
TERM
