TITLE ECHO, VERSION-5, EDIT-7 SUBTTL WRITTEN BY BOB CONLON 01-MAR-78, MODIFIED 13-MAY-81 ;MACRO SUBROUTINE FOR DECSYSTEM-20 USED TO TURN TTY ECHO ON/OFF FOR ;TTY USERS. ENTRY NAMDAT ENTRY TRAPC ENTRY ECHO ENTRY OFECHO ENTRY INIT ENTRY DATCHK ENTRY NOECHO ENTRY APR ENTRY EXIT1 ENTRY PPNO INTERN GETPW, GOTPW, NOTSPW, USPWDN, SAVACS, ERBLK, ERROUT INTERN ECHON, RESACS, OCTDEC, OD001, OD001A, OD002, PW, SAVE INTERN PRVIND, TAGADR, PRIV.1, USRPWD INTERN WDSBEF, KEYWDS, WDSAFT, FMTWDS, AUDKEY, AUDAFT INTERN SCRREC,UNSSCR,FMTCNV,NOTFMT,NOTAUD,DOREST,UNKNOW,DOSCR ;THIS ROUTINE WILL HANDLE A ^C INTERCEPT WITHOUT ANY SPECIAL ACTIVITY. ;ALL THAT OCCURS IS A PUSH OF THE LAST PC ONTO THE STACK AND A RETURN ;TO THAT PLACE IN THE PROGRAM. TRAPC: PUSHJ 17,SAVACS ;SAVE THE ACS MOVEI 1,TRPBLK ;GET ADDR OF ERROR BLOCK MOVEM 1,134 ;SET UP .JBINT PUSHJ 17,RESACS ;RESTORE ACS POPJ 17, ;BACK OUT ECHO: PUSHJ 17,SAVACS ;SAVE THE ACS PUSHJ 17,ECHON ;TURN ON THE ECHO PUSHJ 17,RESACS ;RESTORE THE ACS POPJ 17, ;BACK OUT OFECHO: PUSHJ 17,SAVACS ;SAVE THE ACS PUSHJ 17,ECHOFF ;TURN OFF THE ECHO PUSHJ 17,RESACS ;RESTORE THE ACS POPJ 17, ;AND BACK OUT NAMDAT: PUSHJ 17,SAVACS ;SAVE THE ACS CALLI 1,14 ;GET TODAY'S DATE CAMG 1,DATHLD ;DATE > XPD? JRST CHK30 ;NO, SEE IF WITHIN 30 DAYS OUTSTR [ASCIZ /?CSSDBM E X P I R E D CONTACT BOB CONLON X 3630/] OUTSTR CR EXIT CHK30: MOVE 2,DATHLD ;GET XPD DAYS IN 1 SUBI 2,^D30 ;SET DOWN BY 30 DAYS CAMG 1,2 ;DATE > XPD-30 DAYS? JRST DCKDON ;NO CONTINUE PROCESS OUTSTR CR OUTSTR [ASCIZ /%CSSDBM WILL BE SUSPENDED WITHIN 30 DAYS/] OUTSTR CR OUTSTR [ASCIZ /CONTACT BOB CONLON AT X3-3630 FOR CONTRACT RENEWAL/] OUTSTR CR DCKDON: PUSHJ 17,RESACS ;RESTORE ACS POPJ 17, ;RETURN DATCHK: POPJ 17, ;RETURN INIT: PUSHJ 17,SAVACS ;SAVE THE ACS HRRZ 1,@16 ;GET ADDR OF FIELD1 IN 1 HRRZ 2,@1 ;GET VALUE OF FIELD1 IN 2 MOVEM 2,WDSBEF ;STORE # WDS BEFORE KEY AOS 16 ;INCREMENT TABLE ADDR HRRZ 1,@16 ;GET ADDR OF FIELD2 IN 1 HRRZ 2,@1 ;GET VALUE OF FIELD2 IN 2 MOVEM 2,KEYWDS ;STORE # WDS IN KEY AOS 16 ;INCREMENT TABLE ADDR HRRZ 1,@16 ;GET ADDR OF FIELD3 IN 1 HRRZ 2,@1 ;GET VALUE OF FIELD3 IN 2 MOVEM 2,WDSAFT ;SAVE # WORDS AFTER KEY PUSHJ 17,RESACS ;RESTORE THE ACS POPJ 17, ;RETURN TO COBOL PROGRAM SCRREC: PUSHJ 17,SAVACS ;SAVE THE ACS MOVE 4,[ROT 3,3] ;LOAD FUNCTION PUSHJ 17,FMTCNV ;DO CONVERSION PUSHJ 17,RESACS ;RESTORE THE ACS POPJ 17, ;BACK TO THE COBOL PROGRAM UNSSCR: PUSHJ 17,SAVACS ;SAVE THE ACS MOVE 4,[ROT 3,-3] ;LOAD FUNCTION PUSHJ 17,FMTCNV ;DO CONVERSION PUSHJ 17,RESACS ;RESTORE THE ACS POPJ 17, ;BACK TO THE COBOL PROGRAM FMTCNV: HRRZ 1,@16 ;GETS ADDR OF RECORD TYPE IN 1 HRRZ 5,@1 ;GET RECORD TYPE IN 5 AOS 16 ;INCREMENT TAB ADDR FOR RECORD HRRZ 1,@16 ;GETS ADDR OF BPTR OF RECORD HRRZ 2,@1 ;GETS START ADDR OF REC IN 2 CAIE 5,0 ;IS RECORD A FMT JRST NOTFMT ;NO MOVE 1,FMTWDS ;GET # WORDS IN FMT TO 1 PUSHJ 17,DOSCR ;SCRAMBLE POPJ 17, ;RETURN NOTFMT: CAIE 5,2 ;IS RECORD TYPE AUDIT? JRST NOTAUD ;NO ADD 2,AUDKEY ;BE SURE TO SKIP THE KEY MOVE 1,AUDAFT ;MOVE # WORDS AFTER KEY TO 1 PUSHJ 17,DOSCR ;SCRAMBLE POPJ 17, ;RETURN TO CALLER NOTAUD: CAIE 5,1 ;IS RECORD TYPE DB JRST UNKNOW ;NOPE MOVE 1,WDSBEF ;GET # WDS BEF KEY IN 1 JUMPE 1,DOREST ;JUMP IF NO WORDS PUSHJ 17,DOSCR ;SCRAMBLE DOREST: ADD 2,KEYWDS ;SKIP THE KEY MOVE 1,WDSAFT ;WORDS AFTER KEY PUSHJ 17,DOSCR ;SCRAMBLE POPJ 17, ;RETURN UNKNOW: OUTSTR [ASCIZ /UNKNOWN RECORD TYPE /] EXIT DOSCR: MOVE 3,@2 ;GET A WORD FROM REC TO 3 XCT 4 ;ROTATE MOVEM 3,@2 ;PLACE BACK INTO RECORD AOS 2 ;INCREMENT REC ADDR SOSG 1 ;DECREMENT WORD COUNT POPJ 17, ;NO MORE TO DO JRST DOSCR ;DO ANOTHER NOECHO: PUSHJ 17,SAVACS ;SAVE ALL ACS MOVEI 1,ERBLK ;MOVE TRAP ADDR TO 1 MOVEM 1,134 ;AND OUT TO .JBINT HRRZ 1,@16 ;GET ADDR OF PRIV IND MOVEM 1,PRVIND ;AND SAVE IT MOVE 1,@PRVIND ;GET CONTENT OF PROMPT-IND MOVEM 1,DBWFLG ;SAVE FOR CSSDBW CHECK AOS 16 ;INCREMENT ADDR HRRZ 1,@16 ;GET ADDR OF GOOD CODE RETURN PC MOVEM 1,TAGADR ;SAVE FOR LATER AOS 16 ;INCREMENT ADDR HRRZ 1,@16 ;GET ADDR OF PRIV(1) BPNT MOVE 2,@1 ;GET BPNT OF PRIV(1) MOVEM 2,PRIV.1 ;SAVE TILL LATER AOS 16 ;INCREMENT ADDR HRRZ 1,@16 ;GET ADDR OF USER-PASSWORD BPNT MOVE 2,@1 ;AND GET THE BPNT MOVEM 2,USRPWD ;STORE TILL LATER AOS 16 ;INCREMENT TABLE ADDR HRRZ 1,@16 ;GET ADDR OF SPC BPTR MOVE 2,@1 ;GET SPC BPTR IN 2 MOVEM 2,SPCPTR ;SAVE TILL LATER PUSHJ 17,ECHOFF ;TURN OFF ECHO OUTSTR [ASCIZ /PASSWORD: /] SETZ 4, ;ZERO 4 MOVE 2,[POINT 6,4] ;SETUP USER PASSWORD BPNT MOVN 3,[6] ;SETUP CHAR COUNT CLRBFI ;CLEAR INPUT BUFFER GETPW: INCHWL 1 ;GET USER PASSWORD CAIN 1,15 ;IS IT ? JRST GOTPW ;YES AOJG 3,GOTPW ;ARE THERE MORE THAN 6 CHARS? SUBI 1,40 ;CONVERT TO SIXBIT IDPB 1,2 ;DEPOSIT JRST GETPW ;LOOP BACK GOTPW: PUSHJ 17,ECHON ;TURN ECHO BACK ON OUTSTR CR ;OUTPUT A CR LF CLRBFI ;CLEAR INPUT BUFFER CLRBFO ;CLEAR OUTPUT BUFFER JUMPN 4,.+2 ;WAS A NULL PW ENTERED? EXIT ;YES CAME 4,PW ;IS IT GOOD PW JRST NOTSPW ;NO MOVEI 1,1 ;PREPARE TO SET PRIV-IND MOVEM 1,@PRVIND ;MOVE IT MOVEI 1,20 ;PREPARE TO SET PRIV IDPB 1,PRIV.1 ;DEPOSIT A SIXBIT 0 IDPB 1,PRIV.1 ;ANOTHER 0 MOVEI 1,23 ;LOAD A SIXBIT 3 IDPB 1,PRIV.1 ;DEPOSIT MOVE 1,DBWFLG ;SEE IF ENTRY FROM CSSDBW CAIE 1,7 ;IS IT CSSDBW? JRST NOTDBW ;NO OUTSTR CR ;OUTPUT A OUTSTR [ASCIZ /ENCRYPT DATA: /] INCHWL 1 ;GET SPC SUBI 1,40 ;CONVERT TO 6 BIT IDPB 1,SPCPTR ;MOVE IT TO SPC CLRBFI NOTDBW: POP 17, ;POP OLD RETURN FROM STACK PUSH 17,TAGADR ;PLACE RETURN ADDR ON STACK PUSHJ 17,RESACS ;RESTORE ACS POPJ 17, ;SPECIAL RETURN NOTSPW: MOVEI 3,6 ;SET BYTE COUNT SETZ 5, ;ZERO TEMP AC MOVE 2,[POINT 6,4] ;PREPARE TO GET PW FROM 4 ILDB 5,2 ;GET A BYTE IDPB 5,USRPWD ;DEPOSIT SOJLE 3,USPWDN ;JUMP IF DONE JRST NOTSPW+3 ;GO GET MORE USPWDN: PUSHJ 17,ECHON ;TURN ECHO BACK ON PUSHJ 17,RESACS ;RESTORE ACS POPJ 17, ;RETURN TO COBOL APR: POPJ 17, ;ALL DONE PPNO: PUSHJ 17,SAVACS ;SAVE THE ACS MOVE 1,@16 ;GET ADDR OF ADDR OF USER-PPN MOVE 2,@1 ;GET ADDR OF USER-PPN CALLI 2,24 ;GET MY PPN MOVEM 2,@1 ;RESTORE MY PPN PUSHJ 17,RESACS ;RESTORE THE ACS POPJ 17, ;BACK TO COBOL EXIT1: EXIT ;RETURN TO AVOID AUD ERRORS TRPBLK: 4,TRPCON ;4 WDS,SRTN AT TRPCON XWD 0,2 ;NO MESSAGE,,TRAP ^C Z ;GETS LAST PC Z ;LH GETS INTERRUPT TYPE TRPCON: PUSH 17,TRPBLK+2 ;PUT LAST PC ONTO STACK SETZM TRPBLK+2 ;ZERO OUT FOR NEXT ^C POPJ 17, ;BACK TO LAST PC SAVACS: MOVEM 16,SAVE+16 ;SAVE AC16 MOVE 16,[XWD 0,SAVE] ;BOTH START ADDR BLT 16,SAVE+15 ;XFER MOVE 16,SAVE+16 ;RESTORE AC16 POPJ 17, ;RETURN ERBLK: 4,ERROUT ;4 WORDS,,AT ERROUT XWD 0,2 ;NO MONITOR MESSAGE,,TRAP ^C Z ;LAST USER PC Z ;LH GETS INTERRUPT TYPE ERROUT: PUSHJ 17,ECHON ;GO TURN ECHO BACK ON PUSH 17,ERBLK+2 ;PUSH NEXT PC ONTO STACK SETZM ERBLK+2 ;SET FOR NEXT ^C EXIT 1, ;EXIT TO MONITOR POPJ 17, ;RETURN TO LAST PC IF CONT ECHON: SETO 1, ;MOVE ONES TO 1 GETLCH 1 ;GET LINE CHARACTERISTICS TLZ 1,000004 ;SET ECHO BIT ON SETLCH 1 ;TELL MONITOR POPJ 17, ;RETURN RESACS: MOVE 16,[XWD SAVE,0] ;STARTING ADDR OF SOURC E AND DEST BLT 16,15 ;XFER MOVE 16,SAVE+16 ;RESTORE ORIGINAL 16 POPJ 17, ;RETURN OCTDEC: SETZ 4, ;ZERO DIGIT COUNT IDIVI 1,12 ;DIVIDE BY BASE PUSH 17,2 ;PUSH REMAINDER ONTO STACK AOS 4 ;INCREMENT DIGIT COUNT JUMPE 1,OD001 ;JUMP OF DONE JRST OCTDEC+1 ;LOOP BACK FOR MORE OD001: CAIE 4,1 ;HAS ONLY 1 DIGIT BEEN FACTORED? JRST OD001A ;NO MOVEI 5,20 ;PREPARE TO LEFT ZERO FILL IDPB 5,3 ;SEND LEFT ZERO OUT OD001A: SOJL 4,OD002 ;DECREMENT DIGIT COUNT HRRZ 5,(17) ;GET VALUE FOR STACK ADDI 5,20 ;MAKE IT SIXBIT IDPB 5,3 ;DEPOSIT THE BYTE POP 17, ;POP THE STACK JRST OD001A ;LOOP BACK OD002: POPJ 17, ;RETURN ECHOFF: SETO 1, ;PREPARE TO TUN OFF ECHO BIT GETLCH 1 ;GET LINE CHARACTERISTICS TLO 1,000004 ;SET ECHO BIT OFF SETLCH 1 ;TELL MONITOR POPJ 17, ;BACK OUT PW: SIXBIT /AUDIT1/ CR: ASCIZ / / SAVE: BLOCK ^D16 ;STORAGE OF ACS DATHLD: ^D9672 ;01-JAN-90 PRVIND: Z ;ADDR OF PRIV-IND TAGADR: Z ;ADDR OF GOOD PW RETURN PC PRIV.1: Z ;BYTE POINTER FOR PRIV(1) USRPWD: Z ;BYTE POINTER OF USER-PASSWORD WDSBEF: Z ;# WORDS BEFORE DB KEY KEYWDS: Z ;# WORDS KEY OCCUPIES WDSAFT: Z ;# WORDS AFTER KEY FMTWDS: ^D672 ;NUMBER OF WORDS IN FORMAT REC AUDKEY: 3 ;NUMBER OF WORDS IN AUD KEY AUDAFT: ^D20 ;NUMBER OF WORDS AFT AUD KEY SPCPTR: Z ;BYTE POINTER FOR SPC DBWFLG: Z ;SAME AS PRVIND (CSSDBW) END