.TITLE WHOOUT - PRINT DATA FOR WHO .IDENT /V01/ .ENABL LC ;+ ; WRITTEN BY: GARY L. MAXWELL ; 29-MAR-80 ; NATIONAL STRONG MOTION DATA CENTER ; OFFICE OF EARTHQUAKE STUDIES ; U.S. GEOLOGICAL SURVEY ; 345 MIDDLEFIELD ROAD ; MAIL STOP 77 ; MENLO PARK, CALIFORNIA 94025 ; ; TAKE THE INFORMATION FROM THE WHO TABLES AND PRINT THEM ; OUT ON THE TERMINAL. ;- .MCALL PMSG .MCALL TCBDF$ TCBDF$ ; DEFINE TCB OFFSETS ;+ ; THE FOLLOWING MACRO TESTS A MASK AGAINST A MASK BYTE. IF ; THE TEST IS NONZERO, A SYMBOL (ASCII) IS LOADED INTO R1, ; AND A BRANCH TO A SPECIFIED LABEL IS MADE; OTHERWISE, CODE ; FALLS THROUGH THE MACRO. ;- .MACRO BITEST BITS,MSKWRD,SYMB,LBL,?A BIT BITS,MSKWRD ; ARE BITS ON? BEQ A ; NO, FALL THROUGH MOV SYMB,R1 ; ELSE GET SYMBOL BR LBL ; AND BRANCH A: .ENDM BITEST SPACE = <' > ; SPACE CHAR FLEN = 36. ; LENGTH OF TT:,UIC, NAME PART OF OUTPUT LARGBK: .BLKW 6 ; $EDMSG ARGUMENT BLOCK TARGBK: .WORD 0 ; NUMBER OF BUSY TI:'S .WORD TSTRLN ; LENGTH OF FIRST SUMMARY .WORD TSTR ; ADDRESS TARG0: .WORD 0 ; NUMBER OF ACTIVE TASKS .WORD ASTRLN ; LENGTH OF SECOND SUMMARY .WORD ASTR ; ADDRESS ; THE FOLLOWING ARE INPUT STRINGS TO $EDMSG .NLIST BEX DEVINP: .ASCII /%2A%5<%O:%5>/ ; BUILD DEVICE STRING .ASCII /%11<[%O,%O]%11>/ ; BUILD UIC STRING .ASCIZ /%17<%VA%17>/ ; BUILD NAME STRING TINP: .ASCIZ /%M %VA%M %VA/ ; SUMMARY INPUT STRING TSTR: .ASCII /active terminals, / TSTRLN = . - TSTR ASTR: .ASCII /active user tasks/ ASTRLN = . - ASTR NFND: .ASCII /Mystery User/ NFNDL = . - NFND .LIST BEX .EVEN .PAGE .PSECT WHOOUT,RO WHOOUT:: MOV $LGFHD,R5 ; POINT TO LOGGED IN LIST MOV TIBFLN,-(SP) ; PUSH TI: BUFFER LENGTH SUB #FLEN,(SP) ; FORM OUTER BUFFER LENGTH TSTRT: MOV #LARGBK,R2 ; POINT TO $EDMSG ARG. BLOCK MOV R5,R3 ; COPY POINTER TO TT: ENTRY ADD #LNAM,R3 ; POINT TO TT: NAME MOV R3,(R2)+ ; STORE POINTER IN BLOCK ADD #,R3 ; POINT TO TT: UNIT NO. MOV (R3),(R2)+ ; STORE UNIT NO. IN ARG BLOCK ADD #,R3 ; POINT TO GROUP CODE CLR R0 ; CLEAR OUT A REGISTER BISB (R3),R0 ; GET THE GROUP CODE MOV R0,(R2)+ ; AND STORE IN ARG BLOCK CLR R0 ; CLEAR REGISTER AGAIN BISB -(R3),R0 ; GET MEMBER CODE MOV R0,(R2)+ ; AND STORE IN ARG BLOCK MOV LACNT(R5),R3 ; NOW POINT TO USER BLOCK BEQ 20$ ; NULL MEANS WE DON'T KNOW WHO'S THERE MOV (R3)+,(R2)+ ; STORE LENGTH OF NAME MOV R3,(R2) ; STORE POINTER TO NAME BR 30$ ; GO FORM OUTPUT STRING 20$: MOV #NFNDL,(R2)+ ; LENGTH OF MYSTERY STRING MOV #NFND,(R2) ; ADDRESS OF MYSTERY STRING 30$: MOV #OUTBK,R0 ; POINT TO OUTPUT BLOCK MOV #DEVINP,R1 ; POINT TO INPUT STRING MOV #LARGBK,R2 ; POINT TO ARGUMENT BLOCK CALL $EDMSG ; FORMAT THE MESSAGE MOV (SP),R3 ; RECOVER BYTES REMAINING ON LINE MOV LTSK(R5),R4 ; POINT TO ACTIVE TASK LIST BEQ LINOUT ; NULL MEANS NOTHING ACTIVE TINTRP: SUB #8.,R3 ; ROOM ON LINE FOR TASK ID? BLT LINOUT ; NO, OUTPUT WHAT WE HAVE NOW MOV #SPACE,R1 ; DEFAULT TASK STATUS - RUNNING BITEST #TS.OUT,TSTAT(R4),#<'/>,120$ ; CHECKPOINTED? MOV TST2(R4),R2 ; NO, GET SECOND STATUS WORD BITEST #T2.TIO,R2,#<'?>,120$ ; TI: INPUT IN PROGRESS? BITEST #T2.STP,R2,#<'%>,120$ ; TASK STOPPED? BITEST #T2.SPN,R2,#<'$>,120$ ; TASK SUSPENDED? BITEST #T2.WFR,R2,#<'#>,120$ ; WAITFOR IN PROGRESS? TST TIOC(R4) ; ANY I/O PENDING? BEQ 120$ ; NO, TASK IS INDEED CPU BOUND MOV #<'*>,R1 ; YES, MOVE IN I/O SYMBOL 120$: MOVB #SPACE,(R0)+ ; PUT A SPACE IN OUTPUT BLOCK MOVB R1,(R0)+ ; STORE TASK STATUS MOV TNAME(R4),R1 ; GET FIRST HALF TASK NAME CALL $C5TA ; CONVERT TO ASCII IN BUFFER MOV TNAME+2(R4),R1 ; GET SECOND HALF TASK NAME CALL $C5TA ; CONVERT LAST HALF TO ASCII MOV TLNK(R4),R4 ; POINT TO NEXT TASK IN LIST BNE TINTRP ; IF ONE THERE, GO PROCESS LINOUT: MOV R0,R1 ; COPY CURRENT END POINTER MOV #OUTBK,R0 ; POINT TO BEGINNING OF BUFFER SUB R0,R1 ; GET LENGTH OF STRING PMSG ,,#SPACE ; OUTPUT TO TERMINAL TST R3 ; DID WE OUTPUT BECAUSE OF FULL BUFFER? BGE 210$ ; NO, GO GET NEXT TT: MOV TIBFLN,R3 ; YES, FIRST GET TI: BUFFER LENGTH MOV #7,R2 ; WE'LL TAB OUT TO COL. 7 SUB R2,R3 ; BUMP THAT AMOUNT FROM LENGTH MOV #SPACE,R1 ; FILL CHAR 200$: MOVB R1,(R0)+ ; PUT A SPACE IN BUFFER SOB R2,200$ ; DO UNTIL DONE BR TINTRP ; AND GO FINISH THIS TT: 210$: ADD #LLEN,R5 ; POINT TO NEXT TT: BLOCK TST (R5) ; END OF LIST? BNE TSTRT ; NO, GO PROCESS TST (SP)+ ; YES, CLEAN UP STACK MOV NUMLOG,TARGBK ; GET NUMBER LOGGED IN TI:'S MOV TSKFND,TARG0 ; GET NUMBER ACTIVE TASKS MOV #OUTBK,R0 ; POINT TO OUTPUT BLOCK MOV #TINP,R1 ; POINT TO INPUT STRING MOV #TARGBK,R2 ; POINT TO ARGUMENT BLOCK CALL $EDMSG ; EDIT THE MESSAGE MOV R0,R1 ; COPY END ADDRESS MOV #OUTBK,R0 ; POINT TO START AGAIN SUB R0,R1 ; GET LENGTH OF MESSAGE PMSG ,,#SPACE ; AND WRITE IT OUT RETURN ; AND EXIT .END