*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,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,PTACSIZ$); # ALLOC SPACE FOR PTAC ENTRY # # * CLEAR NEW PTAC BUFFER. # P = 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,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,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,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,CPRBUF[0],APPTTX$,ADDR,LMSG90$); NVFUMQE(P,BANBUF[0],APPTTX$,ADDR,LMSG30$); # TRANSFER TO Q # NVFUMQE(P,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,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