TITLE CUSPSW - PASSWORD PROCESSING AND ENCRYPTION ALGORITHMS SEARCH ACTPRM MODULE (CUSCRP) ENTRY ENCRYP, ENCRYN, LENPSW, SETPSW, CHKPSW CURALG::EXP 3 ;CURRENT ENCRYPTION ALGORITHM INDEX ;LENPSW - DETERMINE AND VALIDATE PASSWORD LENGTH ; CALL: MOVE S1, ADDRESS OF PROFILE ; MOVE S2, ADDRESS OF PASSWORD ; PUSHJ P,LENPSW ; ; TRUE RETURN: LENGTH OK ; FALSE RETURN: LENGTH LESS THAN MINIMUM REQUIRED ; ; ON EITHER RETURN, S1 CONTAINS THE MINIMUM REQURED LENGTH LENPSW::LOAD TF,.AEREQ(S1),AE.PWL ;GET MINIMUM LENGTH REQUIRED JUMPE TF,.RETT ;RETURN IF ZERO PUSHJ P,.SAVE2 ;SAVE P1 DMOVE P1,S1 ;COPY ARGS HRLI P2,(POINT 8,) ;8-BIT ASCIZ MOVSI S2,-.APWLC ;MAXIMUM LENGTH LENPS1: ILDB S1,P2 ;GET A CHARACTER JUMPE S1,LENPS2 ;DONE? AOBJN S2,LENPS1 ;LOOP LENPS2: HRRZS S2 ;KEEP ONLY COUNT LOAD S1,.AEREQ(P1),AE.PWL ;GET MINIMUM LENGTH REQUIRED CAIGE S2,(S1) ;CHECK IT $RETF ;TOO SMALL $RETT ;RETURN GOODNESS ; SETPSW - STORE PASSWORD IN RECORD ; CALL: MOVE S1, ADDRESS OF PASSWORD IN 8-BIT ASCIZ ; MOVE S2, ADDRESS OF BUFFER CONTAINING RECORD ; PUSHJ P,SETPSW ; ; TRUE RETURN: PASSWORD SET IN RECORD ; FALSE RETURN: ENCRYPTION ALGORITHM FAILED ; ; GETTING THE RECORD IN CORE, AND PUTTING IT BACK ARE THE CALLER'S PROBLEM SETPSW::$SAVE P1 ;SAVE P1 MOVE P1,S2 ;KEEP ADDRESS OF BUFFER MOVE T1,S1 ;COPY ADDRESS OF NEW PASSWORD MOVE T3,.AEPPN(P1) ;AND PPN FOR SALT PUSHJ P,ENCRYP ;ENCRYPT IT, PLEASE $RETIF ;RETURN PROPAGATING ERROR IF ANY MOVE T1,P1 ;PROFILE ADDRESS MOVE T2,S1 ;GET -LENGTH,,0 HRRI T2,.AEPSW ;PROFILE OFFSET MOVE T3,S2 ;ENCRYPTED PASSWORD ADDRESS MOVEI T4,0 ;CLEAR .AEMAP ENTRY PUSHJ P,A$EBLK## ;UPDATE PROFILE MOVE S1,CURALG ;GET THE ALGORITHM USED STORE S1,.AEFLG(P1),AE.PWE ;STORE ENCRYPTION ALGORITHM NUMBER $RETT ;RETURN ; CHKPSW - CHECK PASSWORDS ; CALL: MOVE S1, ADDRESS OF PASSWORD IN 8-BIT ASCIZ ; MOVE S2, ADDRESS OF PROFILE CONTAINING RECORD ; PUSHJ P,CHKPSW ; ; TRUE RETURN: PASSWORD MATCHES ; FALSE RETURN: PASSWORD DOES NOT MATCH ; IT IS THE CALLERS RESPONSIBILITY TO SET THE VALIDATION FAILED BIT. CHKPSW::$SAVE P1 ;SAVE P1 MOVE P1,S2 ;SAVE RECORD ADDRESS MOVE T1,S1 ;POINT TO PASSWORD SUPPLIED BY CALLER MOVEI T2,PSWBLK ;POINT TO PLACE TO RECEIVE PASSWORD MOVE T3,.AEPPN(P1) ;AND PPN FOR SALT LOAD T4,.AEFLG(P1),AE.PWE ;GET THE ENCRYPTION VERSION PUSHJ P,ENCRYN ;ENCRYPT IT $RETIF ;RETURN IF UNKNOWN ALG # HLLZ T1,.AEPSW(P1) ;-NUMBER OF WORDS OF PASSWORD HRRZ T2,.AEPSW(P1) ;GET OFFSET ADDI P1,(T2) ;INDEX INTO PROFILE HRLI P1,(IFIW 0(T1)) ;MAKE AN INDIRECT PTR TO CURRENT WORD CHKPS1: MOVE S1,@P1 ;GET A WORD OF USER-SUPPLIED PASSWORD CAME S1,PSWBLK(T1) ;COMPARE IT $RETF ;FAILED TO COMPARE AOBJN T1,CHKPS1 ;AND LOOP $RETT ;SUCCESS ;ENCRYP - Routine to take a 39 character password and encrypt it non-reversably ; into a 144 bit quantity. ;Calling sequence ; T1/ Pointer to 8-BIT ASCIZ string to encrypt. ; T2/ Four word block to receive encrypted password ; T3/ PPN to be used as salt. ; T4/ALGORITHM NUMBER TO USE ;Return ; Always, ENCRYP::MOVE T4,CURALG ;USE CURRENT ALGORITHM ENCRYN::SKIPLE T4 ;CAN'T BE NEGATIVE OR ZERO CAILE T4,AL$MAX ;OR GREATER THAN MAXIMUM? $RETF ;CAN ONLY HAPPEN IF ENTER FROM ENCRYN MOVEI T2,PSWBLK ;WHERE ENCRYPED PASSWORD WILL GO PUSHJ P,@ALGTAB-1(T4) ;DISPATCH MOVSI S1,-4 ;-LENGTH MOVEI S2,PSWBLK ;ADDRESS $RETT ;RETURN ALGTAB: IFIW ALG1 ;6-BIT CRC IFIW ALG2 ;6-BIT POLYNOMIAL IFIW ALG3 ;8-BIT ASCIZ CRC IFIW ALG4 ;8-BIT POLYNOMIAL IFIW ALG5 ;NCRYPT IFIW ALG6 ;ALTERNATE NCRYPT AL$MAX==.-ALGTAB ;LENGTH OF TABLE SUBTTL ALGORITHMS 1 & 3 - 6 & 8 BIT CRC ; 6-BIT CRC ALG1: $SAVE ;WE TRASH THESE ACS PUSHJ P,CNVSIX ;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT DMOVE P1,T2 ;COPY ARGS PUSHJ P,SMTH6 ;SMOOTH THE PASSWORD ACROSS FOUR WORD BLOCK JRST ALG1.0 ;ENTER COMMON CODE ; 8-BIT ASCIZ CRC ALG3: PUSHJ P,.SAVE4 ;SAVE SOME ACS DMOVE P1,T2 ;COPY ARGS PUSHJ P,CVTCAS ;DO CASE CONVERSION PUSHJ P,SMTH8 ;SMOOTH THE PASSWORD ACROSS FOUR WORD BLOCK ALG1.0: IMUL P2,[^D10006721*^D3167] ;SPREAD SALT AROUND SALT WORD ADDI P2,^D84857 ;AVOID PROPAGATING TRALING ZEROES HRLI P1,-WRDS ;MAKE AN AOBJN POINTER TO ENCRYPTED BLOCK ALG1.1: SETZB T1,T2 ;CLEAR DESTINATION DMOVE T3,(P1) ;GET TWO WORDS OF PASSWORD TLC P1,3 TLCN P1,3 ;WAS THIS THE LAST WORD IN THE BLOCK? MOVE T4,-3(P1) ;YES, DON'T USE JUNK BEYOND END MOVE P3,(P1) ;GET A WORD FROM THE PASSWORD BLOCK XOR P3,T4 ;COMBINE IT WITH NEXT WORD ROT P3,^D2 ;ROTATE IT ODDLY ADD P3,P2 ;ADD IN THE "SALT" (SCRAMBLED PPN) MOVEI P4,^D72 ;NUMBER OF BITS WE ARE GOING TO DO ALG1.2: TRNE P3,1 ;ODD COMMAND BIT? DADD T1,T3 ;YES, ADD IN CURRENT OPERAND ROTC T1,1 ;SHIFT ROT P3,-1 ;ROTATE COMMAND BITS IN OPPOSITE DIRECTION SOJGE P4,ALG1.2 ;LOOP FOR EVERY BIT IN GROUP MOVEM T1,(P1) ;STASH ENCRYPTED WORD AOBJN P1,ALG1.1 ;REPEAT FOR NEXT GROUP $RETT ;DONE CNVSIX: MOVE T4,T1 ;COPY ORIGINAL PASSWORD BLOCK ADDRESS MOVEI T1,PSW6 ;WILL USE THIS INSTEAD PUSHJ P,.SAVET ;SAVE T1-T4 MOVE T1,T4 ;GET ORIGINAL BLOCK ADDRESS BACK HRLI T1,(POINT 8,) ;BYTE POINTER TO SOURCE MOVE T2,[POINT 6,PSW6] ;BYTE POINTER TO DESTINATION MOVEI T3,.APWLC ;MAX CHARACTER COUNT MOVE T4,[PSW6,,PSW6+1] ;SET UP BLT SETZM PSW6 ;CLEAR FIRST WORD BLT T4,PSW6+<.APWLC/6> ;ZERO INTERMEDIATE STORAGE CNVSI1: ILDB T4,T1 ;GET A CHARACTER JUMPE T4,.POPJ ;RETURN IF ALL DONE ANDI T4,177 ;MASK DOWN CAIL T4,"A"+40 ;RANGE CAILE T4,"Z"+40 ; CHECK SUBI T4,40 ;CONVERT TO LOWER IDPB T4,T2 ;PUT A CHARACTER SOJG T3,CNVSI1 ;LOOP POPJ P, ;RETURN CVTCAS: PUSHJ P,.SAVET ;SAVE SOME ACS HRLI T1,(POINT 8,) ;8-BIT ASCIZ MOVEI T2,.APWLC ;CHARACTER COUNT CVTCA1: SOJL T2,.POPJ ;DON'T GO OFF THE DEEP END ILDB T3,T1 ;GET A CHARACTER JUMPE T3,.POPJ ;RETURN IF END OF STRING CAIL T3,"A"+40 ;LOWER CASE? CAILE T3,"Z"+40 CAIL T3,340 CAILE T3,375 JRST CVTCA1 ;NO SUBI T3," " ;YES, MAKE UPPER DPB T3,T1 ;CONVERT IN PLACE JRST CVTCA1 ;LOOP OVER ALL CHARACTERS SUBTTL ALGORITHMS 2 & 4 - 6 & 8 BIT POLYNOMIALS ;THIS COMPUTES P^(2^30+36) +A1*P^(2^30) +A2*P^3 +A3*P^2 +A4*P +A5 ;COPIED FROM TOPS20 MODULE CRYPT.MAC P5==P4+1 ; 6-BIT POLYMONIAL ALG2: $SAVE ;P ACS PUSHJ P,CNVSIX ;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT MOVE P1,T2 ;SAVE POINTER TO FOUR-WORD BLOCK PUSHJ P,SMTH6 ;SPREAD THE BITS AROUND JRST ALG2.0 ;ENTER COMMON CODE ; 8-BIT ASCIZ POLYNOMIAL ALG4: $SAVE ;P ACS MOVE P1,T2 ;SAVE POINTER TO FOUR-WORD BLOCK PUSHJ P,CVTCAS ;CONSISTENT CASING PUSHJ P,SMTH8 ;SPREAD THE BITS AROUND ALG2.0: MOVE T1,P1 ;GET BACK POINTER TO DATA MOVEI P5,2 ;NUMBER OF DOUBLE WORD GROUPS TO ENCODE DMOVE P3,2(T1) ;FROM SCRATCH ALG2.1: TDC P3,0(T1) ;FIRST HALF TDC P4,1(T1) ;SECOND HALF DMOVE P1,P3 ;DOUBLE WORD TO ENCODE LSHC P1,-1 ;PUT SIGNIFICANT BITS WHERE THEY BELONG DDIV P1,HSHMOD ;TAKE MOD DMOVE T3,P3 ;SAVE ORIGINAL NUMBER MOVEI T2,5 ;LOOP COUNT ALG2.2: DMOVE P1,P3 ;COPY NUMBER FOR SQUARE DMUL P1,P3 ;SQUARE IT DDIV P1,HSHMOD ;TAKE MOD SOJG T2,ALG2.2 ;LOOP TO RAISE IT TO THE 32 POWER DMOVEM P3,1(T1) ;SAVE PWD^32 DMOVE P1,P3 ;MOVE FOR MULTIPLY DMUL P1,T3 ;MAKE PWD^33 DDIV P1,HSHMOD ;TAKE MOD DADD P3,HSHA1 ;ADD IN FIRST COEFFICIENT SETZB P1,P2 ;MAKE QUAD-WORD DDIV P1,HSHMOD ;TAKE MOD DMOVE P1,1(T1) ;GET PWD^32 BACK DMOVEM P3,1(T1) ;SAVE A1+PWD^33 DMOVE P3,P1 ;COPY FOR SQUARE MOVEI T2,^D25 ;LOOP COUNT ALG2.3: DMUL P1,P3 ;SQUARE IT DDIV P1,HSHMOD ;TAKE MOD DMOVE P1,P3 ;COPY FOR SQUARE SOJG T2,ALG2.3 ;LOOP TO PRODUCE (PWD^(2^30)) DMUL P1,1(T1) ;MULTIPLY BY A1+PWD^33 DDIV P1,HSHMOD ;TAKE MOD DADD P3,HSHA2 ;YES SETZB P1,P2 ;MAKE A QUAD-WORD DDIV P1,HSHMOD ;TAKE MOD SETZ T2, ;OFFSET FOR COEFFICIENTS ALG2.4: DMOVE P1,P3 ;MOVE FOR MULTIPLY DMUL P1,T3 ;MULTIPLY BY PWD DDIV P1,HSHMOD ;TAKE MOD DMOVE P1,P3 ;MOVE FOR MULTIPLY DADD P1,HSHA3(T2) ;YES DDIV P1,HSHMOD ;TAKE MOD ADDI T2,2 ;NEXT COEFFICIENT CAIGE T2,6 ;ONLY 3 MORE COEFFICIENTS JRST ALG2.4 ;KEEP GOING DMOVEM P3,1(T1) ;STORE ENCODED PASSWORD DOUBLEWORD ADDI T1,2 ;POINT TO NEXT DOUBLEWORD SOJG P5,ALG2.1 ;DO BOTH DOUBLEWORDS SETZ T2, ;APPEND A ZERO $RETT ;RETURN HSHMOD: OCT 377777777777,377777777735 ;(2^70-35) PRIME MODULUS HSHA1: OCT 305301317120,157221260120 ;THE RANDOMLY CHOSEN COEFFICIENTS HSHA2: OCT 147300565442,275156661305 HSHA3: OCT 276504256001,246721554756 OCT 226461502774,377222042231 OCT 040267005300,343010077117 ;SMTH6/SMTH8 - ROUTINE TO TAKE AN 8-BIT ASCIZ PASSWORD STRING AND ;CONVERT IT INTO A SMOOTH 144 BIT QUANTITY ;Call ; T1/ Pointer to source string ; T2/ Pointer to four word block to receive data ;Return ; always SRCBPT==-1>-1 BYTES==.APWLC ;NUMBER OF INCOMING BYTES BYTSIZ==1 ;BYTE SIZE TO SPREAD AROUND WRDS==4 ;NUMBER OF WORDS IN DESTINATION ORGWRD==2 ;FIRST WORD TO DEPOSIT STUFF INTO ORGPOS==21 ;ORIGINAL POSITION TO DEPOSIT BYTES ROTPOS==13 ;HOW FAR TO ROTATE ON EACH ITERATION SMTH6: SKIPA T4,[/BYTSIZ] ;6-BIT ENTRY POINT SMTH8: MOVE T4,[/BYTSIZ] ;8-BIT ENTRY POINT PUSH P,[POINT BYTSIZ,(T1)];POINTER TO SOURCE STRING PUSH P,T4 ;SAVE NUMBER OF ITERATIONS TO MAKE PUSH P,T1 ;SAVE T1 MOVSI T1,0(T2) ;POINT TO DESTINATION BLOCK HRRI T1,1(T2) ;MAKE A BLT POINTER SETZM (T2) ;CLEAR THE FIRST WORD BLT T1,WRDS-1(T2) ;CLEAR THE ENTIRE BLOCK POP P,T1 ;RESTORE T1 HRLI T2,(IFIW (T2)) ;MAKE AN INDIRECT POINTER TO DESTINATION PUSH P,T2 ;AND SAVE IT ON STACK MOVEI T2,ORGWRD ;WORD TO START AT MOVEI T4,ORGPOS ;ORIGINAL POSITION SMTH.1: SOSGE SRCCNT(P) ;ALLOCATE A BIT FROM INPUT JRST SMTH.2 ;DONE, EXIT ILDB T3,SRCBPT(P) ;GET A BYTE ROT T3,(T4) ;POSITION IT CORRECTLY XORM T3,@DSTADR(P) ;ADD IT INTO DESTINATION ADDI T4,ROTPOS ;NEXT TIME'S ROTATION CAIL T4,^D36 ;MORE THAN A WORD'S ROTATION? SUBI T4,^D36 ;YES, LIMIT IT SOSGE T2 ;DECREMENT RELATIVE WORD TO DEPOSIT MOVEI T2,WRDS-1 ;START AT TOP IF OFF BOTTOM JRST SMTH.1 ;AND LOOP SMTH.2: ADJSP P,-3 ;BLOW AWAY THREE LOCATIONS ON THE STACK POPJ P, ;AND RETURN SUBTTL ALGORITHM 5 - NCRYPT ;Although this algorithm looks impressive, it is not. To take advantage ;of the enhanced security offered by this release, we recommend that you ;force your users to change their passwords immediately on LOGIN. This ;algorithm is provided only so that they can login that one time. ALG5: PUSHJ P,CNVSIX ;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT PUSH P,T1 ;SAVE T1 MOVSI T1,0(T2) ;POINT TO DESTINATION BLOCK HRRI T1,1(T2) ;MAKE A BLT POINTER SETZM (T2) ;CLEAR THE FIRST WORD BLT T1,WRDS-1(T2) ;CLEAR THE ENTIRE BLOCK POP P,T1 ;RESTORE T1 PUSH P,T2 ;SAVE WHERE TO STORE RESULT PUSH P,T3 ;SAVE PPN MOVE T2,(T1) ;GET PSWD IN T2 MOVE T1,T2 ;AND T2 HRRZ T4,(P) ;GET PROGRAMMER NUMBER IDIVI T2,(T4) ;DIVIDE INTO PASSWORD MOVM T3,T3 ;GET ABS(REMAINDER) MOVE T4,T3 ;COPY FOR A LOOP COUNTER ALG5.1: MUL T1,T1 ;SQUARE THE PASSWORD ROTC T1,^D18 ;GET MIDDLE 36 BITS OF RESULT JUMPN T1,.+2 ;MAKE SURE NON-ZERO MOVE T1,T2 ;IF ZERO, PICK UP PSWD AGAIN SOJG T4,ALG5.1 ;DO THIS A LARGE (RANDOM) NO. OF TIMES XOR T1,PSW6 ;MUNGE IT WITH THE FIRST WORD OF THE PASSWORD IDIVI T3,^D35 ;DIVIDE LOOP COUNTER ROT T1,1(T4) ;ROTATE T1 BY REMAINDER MOVEM T1,@-1(P) ;STORE INADEQUATE RESULT ADJSP P,-2 ;TOSS OUR SCRATCH SPACE $RETT SUBTTL ALGORITHM 6 - ALTERNATE NCRYPT ;Although this algorithm looks impressive, it is not. To take advantage ;of the enhanced security offered by this release, we recommend that you ;force your users to change their passwords immediately on LOGIN. This ;algorithm is provided only so that they can login that one time. ALG6: PUSHJ P,CNVSIX ;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT PUSH P,T1 ;SAVE T1 MOVSI T1,0(T2) ;POINT TO DESTINATION BLOCK HRRI T1,1(T2) ;MAKE A BLT POINTER SETZM (T2) ;CLEAR THE FIRST WORD BLT T1,WRDS-1(T2) ;CLEAR THE ENTIRE BLOCK POP P,T1 ;RESTORE T1 MOVE T4,T2 ;WHERE TO STORE RESULT MOVS T1,(T1) ;GET PASSWORD XOR T1,T3 ;VARY A BIT MUL T1,[^D1220703125] ;5**13 LSHC T1,^D18 ;GET MIDDLE 36 BITS OF RESULT XOR T1,T3 ;VARY A BIT MUL T1,[^D1220703125] ;5**13 LSHC T1,^D18 ;GET MIDDLE 36 BITS OF RESULT MOVEM T1,0(T4) ;STORE INADEQUATE RESULT $RETT LIT RELOC 0 PSWBLK: BLOCK WRDS ;TEMPORARY STORAGE FOR ENCRYPTED PASSWORD PSW6: BLOCK .APWLC/6+1 ;8-BIT TO SIXBIT CONVERTED PASSWORD RESULT PRGEND TITLE CUSREA - CUSTOMER INTERFACE TO REACT SEARCH ACTPRM,ORNMAC MODULE (CUSREA) ENTRY CMDCUS, CMDCUP, ENTCUS ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1985,1986. ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ND FTISWS,0 ;NORMALLY TURNED OFF ; SET NON-ZERO FOR IN-HOUSE CORPORATE ; DATA CENTER ND FTXMPL,0 ;NORMALLY TURNED OFF ; SET NON-ZERO TO ASSEMBLE IN EXAMPLES ; SHOWING HOW TO ADD CUSTOMER DEFINED ; PRIVILEGED AND UNPRIVILEGED COMMANDS, ; AND CUSTOMER DEFINED PROFILE ENTRY TYPES SUBTTL CUSTOMER COMMAND TABLES ; PRIVILEGED ADMINISTRATIVE COMMANDS CMDCUS::$STAB IFN FTXMPL,< DSPTAB (PFOO00,PFOO,) > ;END IFN FTXMPL $ETAB ; UNPRIVILEGED USER COMMANDS CMDCUP::$STAB IFN FTXMPL,< DSPTAB (UFOO00,UFOO,) > ;END IFN FTXMPL $ETAB IFN FTXMPL,< PFOO00: $NOISE (CONFRM##,) UFOO00: $NOISE (CONFRM##,) > ;END IFN FTXMPL SUBTTL PFOO COMMAND IFN FTXMPL,< XWD PFOHLP,[ASCIZ /Performs the privileged FOO function/] PFO: $RETT PFOHLP: ASCIZ \ The FOO command. \ > ;END IFN FTXMPL SUBTTL UFOO COMMAND IFN FTXMPL,< XWD UFO,[ASCIZ /Performs the unprivileged FOO function/] UFO: $RETT UFOHLP: ASCIZ \ The UFOO command. \ > ;END IFN FTXMPL SUBTTL CUSTOMER ENTRIES -- PRIVILEGES CPV010::$STAB IFN FTXMPL,< DSPTAB (PRV010##,CPVXXX,) DSPTAB (PRV010##,CPVYYY,) > ;END IFN FTXMPL IFN FTISWS,< DSPTAB (PRV010##,CPVCPN,) DSPTAB (PRV010##,CPVMDC,) DSPTAB (PRV010##,CPVNEX,) DSPTAB (PRV010##,CPVTRD,) DSPTAB (PRV010##,CPVTWR,) > ;END IFN FTISWS $ETAB CPVBPS::! IFN FTXMPL,< CPVXXX: XWD [POINT 1,.AEPRV(U),35],[ASCIZ /X-priv/] CPVYYY: XWD [POINT 1,.AEPRV(U),34],[ASCIZ /Y-priv/] > ;END IFN FTXMPL IFN FTISWS,< CPVCPN: XWD [POINT 1,.AEPRV(U),35],[ASCIZ /Change-PPN/] CPVNEX: XWD [POINT 1,.AEPRV(U),34],[ASCIZ /Network-examine/] CPVTWR: XWD [POINT 1,.AEPRV(U),33],[ASCIZ /TRMOP-write/] CPVTRD: XWD [POINT 1,.AEPRV(U),32],[ASCIZ /TRMOP-read/] CPVMDC: XWD [POINT 1,.AEPRV(U),18],[ASCIZ /MDC-Set-P/] > ;END IFN FTISWS CPVBPE::! CPVPRT::SKIPL S1,[IOWD CPVBPE-CPVBPS,CPVBPS] ;IOWD POINTER TO BITS $RETT ;TABLE IS EMPTY $TEXT (,< ^A>) ;INDENT NEXT SET OF TYPEOUT PUSHJ P,PRTBTS## ;AND OUTPUT THE FIRST SET OF BITS $RETT SUBTTL CUSTOMER FIELDS ENTCUS::$STAB KEYTAB (NUL##,,CM%NOR!CM%INV) IFN FTXMPL!FTISWS,< KEYTAB (DLG,) > ;END IFN FTXMPL!FTISWS $ETAB SUBTTL CUSTOMER ENTRIES -- LOG-FILE-DEFAULT IFN FTXMPL!FTISWS,< .ENTRY (DLG,.AELOG,) DLGPRS: $FILE (CONFRM##,,<$PREFIL(DLGACT)>) DLGACT: MOVE S1,[GJFBLK##,,GJFBLK##+1] ;SET UP TO ZERO BLOCK SETZM GJFBLK## ;CLEAR 1ST WORD BLT S1,GJFBLK##+GJFSIZ-1 ;CLEAR THE REST MOVSI S1,'...' ;GET SOMETHING TO MARK OUR PLACE MOVEM S1,GJFBLK##+.FDSTR ;STORE IT $RETT ;RETURN ; GET ROUTINE DLGGET: PUSHJ P,.SAVE1 ;SAVE P1 PUSHJ P,PROFSP## ;FETCH FILESPEC JUMPF PRSERR## ;CHECK FOR ERRORS MOVE P1,S1 ;SAVE FD ADDRESS PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR## ;CHECK FOR ERRORS MOVEI S1,(P1) ;FD (PARSER DATA BLOCK) ADDRESS MOVE S2,DLG+CG.PFL ;PROFILE OFFSET PUSHJ P,PROBLK## ;ADD/DELETE EXTENSIBLE BLOCK SKIPT ;CHECK FOR ERRORS WARN (NRM,,,DLGRES) DLGGO: MOVEI S1,.AELOG ;PROFILE OFFSET PJRST CMPVLC## ;SET CHANGE FLAGS AND RETURN ; COMPARE ROUTINE DLGCMP: MOVEI S1,.AELOG ;PROFILE OFFSET PJRST COMPAR## ;GO COMPARE ; CHANGE ROUTINE DLGCHG: MOVEI S1,.AELOG ;PROFILE OFFSET PJRST QUECHG## ;QUEUE UP THE CHANGE ; RESTORE ROUTINE DLGRES: MOVEI T1,(U) ;POINT TO PROFILE HLLZ T2,.AELOG(X) ;-LENGTH HRRI T2,.AELOG ;OFFSET MOVE T3,.AELOG(X) ;ORIGINAL OFFSET POINTER ADDI T3,(X) ;INDEX INTO PROFILE MOVX T4,DF.LOG ;DEFAULT BIT FOR FIELD TDNN T4,DF$LOG(X) ;WANT IT DEFAULTED? TDZA T4,T4 ;NO, RESTORE THE ZERO MOVEI T4,1 ;YES, RESTORE THE ONE PUSHJ P,A$EBLK## ;RESTORE ORIGINAL DEFAULT LOG FILE SETZM @CHGADR## ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK##+.AELOG ;IN BOTH PLACES $RETT ;RETURN ; DEFAULTING ROUTINE DLGDFL: MOVX S1,DF.LOG ;DEFAULT BIT IORM S1,DF$LOG(U) ;LIGHT IT SETOM PRSDFV## ;SETTING TO DEFAULT VALUE PJRST DLGGO ;SETUP MASKS AND RETURN ; PRINT ROUTINE DLGPRT: SKIPE S1,.AELOG(U) ;GET AOBJN POINTER TO FILESPEC JRST DLGPR1 ;GOT ONE $TEXT (,<-none->) ;NOPE $RETT ;RETURN DLGPR1: ADDI S1,(U) ;INDEX INTO PROFILE HLRE S2,S1 ;GET -LENGTH OF FILESPEC MOVMS S2 ;MAKE POSITIVE HRLZM S2,FDBLK##+.FDLEN ;SAVE AS FD LENGTH HRLZS S1 ;PUT FILESPEC ADDRESS IN LH HRRI S1,FDBLK##+.FDSTR ;MAKE A BLT POINTER BLT S1,FDBLK##+.FDPAT+4 ;COPY FOR GLXTXT $TEXT (,<^F/FDBLK/>) ;DISPLAY $RETT ;RETURN ; HELP TEXT DLGHLP: ASCIZ \ Default batch log file \ > ;END IFN FTXMPL!FTISWS END