TITLE LNM - TYPE CURRENT LOG NAMES FOR JOBS ; --------------------------------------------------- ; SEARCH MACTEN,UUOSYM ; SEARCH STANDARD CUSP PARAMETERS SALL ; CLEAN UP THE LISTING ; ; REGISTER DEFINITIONS ; F= 0 ; SOME FLAGS C= 1 ; FOR CHARACTERS M= 2 ; JOB NUMBER MAXIMUM T1= 3 ; T TYPE REGISTERS T2= T1+1 T3= T2+1 Q1= T3+1 ; Q TYPE REGISTERS Q2= Q1+1 Q3= Q2+1 P1=11 P2=12 P== 17 ; THE STACK POINTER ; MORE DEFINITIONS ; F.EOL== 1B35 ; ON IF SAW END-OF-LINE F.NOP== 1B34 ; ON IF SUPPRESSING OPERATOR JOBS SWP==2000 JLOG== 4 ; JOB LOGGED IN STATUS BIT STKSIZ==^D20 ; OUR STACK SIZE X.EOL==1B<.CHLFD>!1B<.CHESC>!1B<.CHFFD>!1B<.CHBEL>!1B<.CHVTB> ; END OF LINE CHARACTERS ;DEF'NS FOR PAGE. UPTPAG==376 UPT==376000 SPYPAG==377 SPY==377000 LNMPAG==375 LNM==375000 ; HERE WE GO! ; WHO:: JFCL ; ALLOW CCL ENTRY MOVE [27,,113] GETTAB ;FIND RELATIVE LOC ON .UPLNM MOVEI 774 ;PRE 332 LOAD ADDI 376000 ; +UPMP LOC MOVEM LNMLOC MOVE P,[IOWD STKSIZ,STACK] ; INITIALIZE A STACK POINTER CLEAR F, ; CLEAR THE FLAGS MOVE T1,[POINT 7,TTYBUF] ; INITIALIZE TTY BUFFER MOVEM T1,TTYPTR ; POINTER AND... MOVEI T1,^D80 ; THE COUNT MOVEM T1,TTYCNT ; PJOB T1, ; GET THIS JOB NUMBER MOVEM T1,MYJOB ; SAVE IT FOR DOT REFERENCE ; MOVX M,%CNSJN ; GET THE NUMBER OF... GETTAB M, ; JOBS ALLOWED ON THE SYSTEM JRST BADERR ; OOPS! HRRE M,M ; ISOLATE JOB COUNT AND EXTEND SIGN JUMPLE M,DONE ; FOR VERY SMALL SYSTEMS! SUBI M,1 ; DECR. COUNT TO EXCLUDE NULL JOB... ; MOVX T1,%CNPTY ; GET THE PTY... GETTAB T1, ; OFFSET JRST BADERR ; SHOULD NOT HAPPEN HLRZM T1,PTYOFF ; SAVE OFFSET ; MOVX Q1,%CNLNM ; GET THE NUMBER... GETTAB Q1, ; OF JOBS LOGGED IN JRST BADERR ; SHOULD NOT HAPPEN PUSHJ P,DPRNT ; PRINT IN DECIMAL ; MOVEI Q1,[ASCIZ/ jobs in use out of /] PUSHJ P,PSTRG ; PRINT MESSAGE HRRZ Q1,M ; TELL HOW MANY THERE ARE PUSHJ P,DPRNT ; ... ; MOVNS M ; GET NEGATIVE MAX NUMBER OF JOBS HRLS M ; PUT IN LH HRRI M,1 ; NOW WE HAVE -M,,1 TXO F,F.NOP ; WE DON'T WANT OPERATOR JOBS MOVEI Q1,[ASCIZ/. Job Who Program Line PPN /] PUSHJ P,PSTRG ; FINISH FIRST MESSAGE & PRINT HEADER ; LOOP2: HRRZ T1,M ; NEXT JOB NUMBER TO T1 PUSHJ P,PWHO ; PRINT THIS WHO LINE AOBJN M,LOOP2 ; LOOP TILL DONE ; HERE WHEN DONE ; DONE: PUSHJ P,FORCE ; DUMP THE TTY BUFFER HRROI T1,.GTSTS GETTAB T1, SETO T1, TLNN T1,JLOG ; IS THIS JOB LOGGED IN? JRST DONE1 ; NOPE--NEED TO EXIT WITH LOGOUT MONRT. ; YES--EXIT QUIETLY JRST WHO ; DO IT AGAIN IT CONT IS TYPED ; DONE1: OUTSTR [ASCIZ/ .KJOB ./] SETZM .JBREN## ; CAN'T REEENTER ANYMORE LOGOUT ; EXIT ; HERE FOR ERRORS ; BADERR: MOVEI Q1,[ASCIZ/ ? Unexpected error /] ; BAD ERROR JRST ERR1 ; MERGE BELOW ERROR: MOVEI C,"?" ; START MESSAGE PUSHJ P,PCHAR MOVEI C,0 ; MAKE A STRING OUT OF INPUT... IDPB C,LINPTR ; WE USED SO FAR MOVEI Q1,LINBUF ; POINT TO THAT STRING PUSHJ P,PSTRG ; OUTPUT IT MOVEI Q1,[BYTE(7)"?",15,12] ; GET REST AND MERGE ; ERR1: PUSHJ P,PSTRG ; PUBLISH THE SURPRISE CLEAR Q2, ; MAKE SURE JACCT IS CLEAR SETNAM Q2, ; BY CLEARING THE NAME JRST DONE ; FINISH UP SUBTTL SUBROUTINE TO PRINT WHO LINE ; ---------------------------- ; WHO -- ROUTINE TO PRINT A LINE OF WHO INFORMATION. CALLING ; SEQUENCE IS ; ; MOVE T1,JOB# ; PUSHJ P,PWHO ; RETURN ; ; OPERATOR JOBS ARE SUPPRESSED IF F.NOP IS ON. ; PWHO: HRLZ Q1,T1 ; JOB# IN LH OF Q1 FOR GETTAB HRRI Q1,.GTSTS ; JOB STATUS TABLE GETTAB Q1, ; SUCK IN TABLE ENTRY JRST BADERR ; YIPE! ; TLNN Q1,SWP TLNN Q1,JLOG ; IS JOB LOGGED IN ? POPJ P, ; NOPE, JUST RETURN CAMN T1,MYJOB POPJ P, ; HRLZ T2,T1 ; JOB # IN T2 AND... HRRI T2,.GTPPN ; TABLE # FOR PPN'S GETTAB T2, ; GET-UM JRST BADERR ; WHY ME? ; HRLZ Q1,T1 HRRI Q1,.GTUPM GETTAB Q1, JRST BADERR HRRZS Q1 JUMPE Q1,CPOPJ HRLM Q1,UPTBLK+1 MOVE T3,[11,,DELUPT] PAGE. T3, JFCL MOVE T3,[11,,UPTBLK] PAGE. T3,200000 HALT SKIPN P1,@LNMLOC POPJ P, PWHO1: MOVE Q1,T1 ; START WITH THE JOB NUMBER MOVE C,[2,," "] ; PAD WITH SPACES PUSHJ P,DPRNT ; PRINT THE JOB NUMBER ; PUSHJ P,PSPAC ; SEPARATE WITH A SPACE PUSHJ P,PSPAC ; AND ANOTHER ONE ; HRLZ Q1,T1 ; AGAIN WE SET.. HRRI Q1,.GTNM1 ; UP Q1 FOR GETTAB GETTAB Q1, ; GET FIRST PART OF USER'S NAME JRST BADERR ; GAK! PUSHJ P,SPRNT ; PRINT IT ; HRLZ Q1,T1 ; THE SAME OLD... HRRI Q1,.GTNM2 ; STUFF FOR THE... GETTAB Q1, ; SECOND PART OF THE NAME JRST BADERR ; GAK! (AGAIN) PUSHJ P,SPRNT ; PRINT ; PUSHJ P,PSPAC ; ANOTHER SPACE ; HRLZ Q1,T1 ; GET JOB NUMBER AGAIN HRRI Q1,.GTPRG ; GETTAB FOR PROGRAM NAME GETTAB Q1, ; GET NAME OF PROGRAM HE'S RUNNING JRST BADERR ; OOPS PUSHJ P,SPRNT ; PRINT IT ; PUSHJ P,PSPAC ; PRINT A SPACE PUSHJ P,PSPAC ; AND ANOTHER ; MOVE Q1,T1 ; JOB NUMBER TO Q1... TRMNO. Q1, ; AND GET THE TERMINAL NUMBER JRST TDET ; MUST BE DETACHED JOB GETLCH Q1 ; GET LINE CHARACTERISTICS TXNE Q1,GL.CTY ; IS IT THE CTY? JRST TCTY ; YES! MOVE C,[4,," "] ; NO--ASSUME A TTY TXNN Q1,GL.ITY ; IS THIS A PTY? JRST PWHO2 ; NOPE--WE WERE RIGHT ; ANDI Q1,777 ; YES--CLEAN UP AND SUB Q1,PTYOFF ; MAKE A PTY NUMBER CAIGE Q1,100 ; PAD THE... PUSHJ P,PCHAR ; PTY NUMBER... CAIGE Q1,10 ; JUST A... PUSHJ P,PCHAR ; LITTLE BIT MOVEI C,"P" ; GET A "P" PUSHJ P,PCHAR ; PRINT IT CLEAR C, ; NO MORE PADDING JRST PWHO2 ; GO PRINT PTY NUMBER ; TDET: MOVEI Q1,[ASCIZ/ DET/]; HERE IF JOB IS DETACHED SKIPA TCTY: MOVEI Q1,[ASCIZ/ CTY/]; HERE IF JOB IS AT THE CTY PUSHJ P,PSTRG ; PRINT INDICATOR JRST PWHO3 ; MERGE BELOW PWHO2: ANDI Q1,777 ; INSURE CLEAN TERMINAL NUMBER PUSHJ P,OPRNT ; TERMINAL # IS OCTAL PWHO3: PUSHJ P,PSPAC ; SPIT OUT A BLANK ; HLRZ Q1,T2 ; PROJECT NUMBER TO Q1 MOVE C,[6,," "] ; PAD WITH SPACES PUSHJ P,OPRNT ; PRINT IT IN OCTAL MOVEI C,"," ; SEPARATE WITH... PUSHJ P,PCHAR ; A COMMA HRRZ Q1,T2 ; DITTO FOR PROGRAMMER NUMBER CLEAR C, ; NO PADDING PUSHJ P,OPRNT ; ... ; MOVE T3,[11,,DELLNM] PAGE. T3, JFCL MOVE T3,P1 PUSHJ P,VRT2PH HRLM T3,LNMBLK+1 MOVE T3,[11,,LNMBLK] PAGE. T3,200000 HALT ANDI P1,777 ADDI P1,LNM PUSHJ P,PCRLF PWHO4: SKIPN P2,(P1) POPJ P, MOVE T3,P2 PUSHJ P,VRT2PH HRLM T3,FUNBLK+1 MOVE T3,[11,,DELSPY] PAGE. T3, JFCL MOVE T3,[11,,FUNBLK] PAGE. T3,200000 HALT MOVE T3,P2 ANDI P2,777 ADDI P2,SPY SKIPGE T3 SKIPA C,[5,," "] MOVE C,[6,," "] PUSHJ P,PRPAD JFCL MOVEI C,"*" SKIPGE T3 PUSHJ P,PCHAR MOVE Q1,(P2) CAMN Q1,[-1] MOVE Q1,[SIXBIT /LIB*/] PUSHJ P,SPRNT MOVEI Q1,[ASCIZ /:=/] PUSHJ P,PSTRG PWHO5: MOVE Q2,1(P2) PUSHJ P,LPRNT MOVEI Q1,[ASCIZ /:[/] PUSHJ P,PSTRG SETO C, HLRZ Q1,2(P2) PUSHJ P,OPRNT MOVEI C,"," PUSHJ P,PCHAR HRRZ Q1,2(P2) SETO C, PUSHJ P,OPRNT ADDI P2,3 PWHO6: SKIPN Q2,(P2) JRST PWHO7 MOVEI C,"," PUSHJ P,PCHAR PUSHJ P,LPRNT AOJA P2,PWHO6 PWHO7: MOVEI C,"]" PUSHJ P,PCHAR SKIPN 1(P2) JRST PWHO8 MOVEI C,"," PUSHJ P,PCHAR JRST PWHO5 PWHO8: PUSHJ P,PCRLF AOJA P1,PWHO4 PCRLF: MOVEI Q1,[BYTE(7)15,12]; FINALLY, CRLF... PJRST PSTRG ; OUTPUT IT AND RETURN VRT2PH: HRRZS T3 LSH T3,-11 ADDI T3,440 ROT T3,-1 TLZE T3,400000 TLOA T3,001500 TLO T3,221500 ADDI T3,UPT LDB T3,T3 POPJ P, SUBTTL OUTPUT ROUTINES ; --------------- ; DPRNT -- PRINT DECIMAL NUMBER WITH LEFT PADDING. ; OPRNT -- PRINT OCTAL NUMBER WITH LEFT PADDING. ; CALLING SEQUENCE FOR THE ABOVE IS: ; ; MOVE Q1,NUMBER ; MOVE C,[FIELD SIZE,,PAD CHARACTER] ; PUSHJ P,-PRNT ; RETURN ; OPRNT: SKIPA Q3,[^D8] ; OCTAL DPRNT: MOVEI Q3,^D10 ; DECIMAL PRNT1: SUB C,[1,,0] ; DECREMENT FIELD WIDTH IDIV Q1,Q3 ; DIVIDE BY PROPER BASE HRLM Q2,(P) ; STASH REMAINDER SKIPN Q1 ; DONE YET ? PUSHJ P,PRPAD ; YES--PRINT PADDING AND SKIP PUSHJ P,PRNT1 ; NO, CONTINUE RECURSIVELY HLRZ C,0(P) ; RETRIEVE A CHARACTER ADDI C,"0" ; CONVERT TO ASCII PJRST PCHAR ; OUTPUT IT AND UNWIND ; PRPAD -- PRINT PADDING CHARACTER. CALLING SEQUENCE IS ; ; MOVE C,[NUMBER OF CHARACTERS,,PAD CHARACTER] ; PUSHJ P,PRPAD ; NEVER RETURNS HERE ; ALWAYS GIVES SKIP RETURN ; PRPAD: HLRE Q1,C ; GET NUMBER OF CHARACTERS SOJL Q1,CPOPJ1 ; QUIT WHEN DONE PUSHJ P,PCHAR ; PRINT CHARACTER JRST .-2 ; CONTINUE CPOPJ1: AOS (P) ; SET TO GIVE SKIP RETURN POPJ P, ; RETURN ; SPRNT -- PRINTS THE 6 SIXBIT CHARACTERS IN Q1. CALLING ; SEQUENCE IS ; ; MOVE Q1,WORD OF SIXBIT ; PUSHJ P,SPRNT ; RETURN ; SPRNT: MOVEI Q3,6 ; THERE ARE 6 CHARACTERS SPRNT1: ROTC Q1,6 ; ROTATE A SIXBIT CHAR TO Q2 ANDI Q2,77 ; CLEAN IT UP MOVEI C," "(Q2) ; CONVERT TO ASCII AND PUT IN C ; CAIL C,"A" ; FOLD TO LOWER CASE OF COURSE! ; CAILE C,"Z" ; SKIPA ; DAMN IT ; ADDI C,40 ; MAKE IT PRETTY PUSHJ P,PCHAR ; OUTPUT IT SOJG Q3,SPRNT1 ; CONTINUE FOR 6 CHARACTERS POPJ P, ; RETURN LPRNT: SETZ Q1, LSHC Q1,6 SKIPN C,Q1 POPJ P, ADDI C," " PUSHJ P,PCHAR JRST LPRNT ; PSTRG -- PRINT AN ASCIZ STRING. CALLING SEQUENCE IS ; ; MOVEI Q1,ADDR OF STRING ; PUSHJ P,PSTRG ; RETURN ; ; USES C. ; PSTRG: HRLI Q1,(POINT 7) ; MAKE A BYTE POINTER PSTRG1: ILDB C,Q1 ; GET A CHARACTER JUMPE C,CPOPJ ; RETURN IF DONE PUSHJ P,PCHAR ; OTHERWISE OUTPUT IT JRST PSTRG1 ; AND CONTINUE ; PSPAC -- PRINT A SPACE. CALLING SEQUENCE IS ; ; PUSHJ P,PSPAC ; RETURN ; PSPAC: MOVEI C," " ; GET A SPACE ; PJRST PCHAR ; FALL INTO PCHAR ; PCHAR -- PRINT A CHARACTER. CALLING SEQUENCE IS ; ; MOVE C,CHARACTER ; PUSHJ P,PCHAR ; RETURN ; ; PRESERVES ALL AC'S. ; PCHAR: SOSG TTYCNT ; DECREMENT AND TEST COUNT PUSHJ P,FORCE ; DUMP BUFFER IDPB C,TTYPTR ; STASH CHARACTER POPJ P, ; RETURN ; FORCE -- DUMP TTY BUFFER. CALLING SEQUENCE IS ; ; PUSHJ P,FORCE ; RETURN ; ; PRESERVES ALL AC'S. ; FORCE: PUSH P,C ; SAVE C MOVEI C,0 ; GET A ZERO CHARACTER IDPB C,TTYPTR ; DEPOSIT IT OUTSTR TTYBUF ; DUMP STRING MOVE C,[POINT 7,TTYBUF] ; GET NEW POINTER MOVEM C,TTYPTR ; INSERT IT MOVEI C,^D80 ; GET NEW COUNT... MOVEM C,TTYCNT ; AND INSERT IT POP P,C ; RESTORE C CPOPJ: POPJ P, ; RETURN SUBTTL INPUT ROUTINES ; -------------- ; GETLIN -- READ A LINE OF INPUT INTO THE LINE BUFFER AND SET UP LINPTR ; AND LINCNT. GETS EVERYTHING UP TO A VERTICAL MOTION CHARACTER. ; CALLING SEQUENCE IS ; ; PUSHJ P,GETLIN ; GETLIN: MOVE Q1,[POINT 7,LINBUF] ; SET UP POINTER MOVEM Q1,LINPTR CLEARM LINCNT ; CLEAR COUNT ; GETLN1: INCHWL C ; GET A CHARACTER IDPB C,Q1 ; STUFF IT INTO LINE BUFFER AOS LINCNT ; BUMP COUNT PUSHJ P,CHKTR1 ; CHECK FOR TERMINATOR POPJ P, ; GOT ONE! JRST GETLN1 ; KEEP TRYING ; GETSIX -- INPUT NEXT SIXBIT IDENTIFIER OR NUMBER. CALLING ; SEQUENCE IS ; ; PUSHJ P,GETSIX ; RETURN--Q1 CONTAINS SIXBIT ID AND BREAK CHAR. IS IN C ; GETSIX: MOVE Q3,[POINT 6,Q1] ; SET UP FOR CONSTRUCTING ID SETZ Q1, ; PUSHJ P,GTNBLK ; GET FIRST NONBLANK CHARCTER CAIA ; CHARACTER IN C ON FIRST PASS GTSX1: PUSHJ P,GETCHR ; GET A CHARACTER MOVE Q2,[042360,,001400] ; LOAD BREAK TABLE LSH Q2,(C) ; CHECK FOR A BREAK JUMPL Q2,CPOPJ ; RETURN NOW IF A BREAK ; MOVE Q2,C ; COPY CHARACTER CAIGE Q2,140 ; CONVERT TO SIXBIT SUBI Q2,40 TRZ Q2,777700 ; CAIL Q2,'0' ; SKIP IF TOO SMALL CAILE Q2,'Z' ; IF IN PERMITTED RANGE POPJ P, ; RETURN NOW CAILE Q2,'9' ; SKIP IF A NUMBER CAIL Q2,'A' SKIPA POPJ P, ; NOT ALPHANUMERIC ; TRNN Q1,77 ; DO WE ALREADY HAVE 6? IDPB Q2,Q3 ; NOPE--STASH CHARACTER JRST GTSX1 ; LOOP FOR MORE ; GTNBLK -- GET NEXT NONBLANK CHARACTER. ; GNBLK1 -- GET NEXT NONBLANK CHARACTER ASSUMING FIRST CHARACTER IS ; IN C. CALLING SEQUENCE IS ; ; PUSHJ P,GTNBLK OR GNBLK1 ; RETURN--C CONTAINS CHARACTER ; GTNBLK: PUSHJ P,GETCHR ; GET A CHARACTER GNBLK1: CAIE C,.CHTAB ; TABS AND... CAIN C," " ; BLANKS ARE IGNORED JRST GTNBLK POPJ P, ; GETCHR -- GET A CHARACTER FROM THE LINE BUFFER. CALLING SEQUENCE IS ; ; PUSHJ P,GETCHR ; RETURN--C CONTAINS CHARACTER ; ; IGNORES CARRAIGE RETURN. ; GETCHR: SOSGE LINCNT ; DECREMENT COUNT AND TEST SKIPA C,[.CHLFD] ; END OF LINE, KEEP RETURNING LINE FEEDS ILDB C,LINPTR ; GET A CHARACTER FROM LINE BUFFER CAIN C,.CHCRT ; CARRIAGE RETURN? JRST GETCHR ; YES--IGNORE IT POPJ P, ; NO--RETURN ; CHKTRM -- CHECK FOR A TERMINATOR, A END OF LINE CHARACTER OR A SEMI- ; COLON. CHKTR1 OMITS THE SEMICOLON. CALLING SEQUENCE IS ; ; MOVE C,CHARACTER ; PUSHJ P,CHKTRM OR CHKTR1 ; RETURN--C CONTAINS A TERMINATOR ; SKIP RETURN--C DOES NOT CONTAIN A TERMINATOR ; ; PRESERVES ALL AC'S. ; CHKTRM: CAIN C,";" ; SEMICOLON? POPJ P, ; YES CHKTR1: PUSH P,Q1 ; SAVE A REGISTER MOVX Q1,X.EOL ; GET END OF LINE BITS LSH Q1,(C) ; SHIFT TO SIGN BIT SKIPL Q1 ; IF ONE, WE GOT ONE AOS -1(P) ; NOPE, BUMP RETURN POINT POP P,Q1 ; RESTORE Q1 POPJ P, ; RETURN SUBTTL DATA ; ---- UPTBLK: 1 UPTPAG FUNBLK: 1 SPYPAG LNMBLK: 1 LNMPAG DELLNM: 1 SETZ LNMPAG DELSPY: 1 SETZ SPYPAG DELUPT: 1 SETZ UPTPAG LNMLOC: BLOCK 1 MYJOB: BLOCK 1 ; JOB NUMBER PTYOFF: BLOCK 1 ; PTY OFFSET STACK: BLOCK STKSIZ ; THE STACK TTYPTR: BLOCK 1 ; TTY BUFFER POINTER TTYCNT: BLOCK 1 ; CHARACTER COUNT TTYBUF: BLOCK ^D80/5+1 ; THE TTY BUFFER LINCNT: BLOCK 1 ; THE INPUT COUNT LINPTR: BLOCK 1 ; INPUT LINE POINTER LINBUF: BLOCK ^D140/5+1 ; INPUT LINE BUFFER END WHO