.TITLE WHO - SYSTAT PROGRAM ; .IDENT /JKN01/ ;WRITTEN BY J. NEELAND ;LAST MODIFIED 771011.2300 ; ;THIS WILL START OUT CRUDE AND EVENTUALLY GET BETTER ; .MCALL EXIT$S,QIOW$,UCBDF$,DIR$ .LIST MEB ;LET'S SEE THE CODE GENERATED ;(MAKES DEBUGGING EASIER) ; ;DEFINITIONS: MAXTSK=8. ;MAX. # OF TASKS/TERMINAL TO LIST ; WHO:: CLR UNITNO ;CLEAR UNIT # (START W/ TT0:) NEXTNO: MOV #DEVNAM+2,R0 ;SET STRING ADDRESS MOV UNITNO,R1 ;PROVIDE CURRENT VALUE OF UNIT # MOV #<2*4000>!<1*1000>!10,R2 ;SET FOR 2 BYTES FIELD WIDTH, RADIX 8. ; AND NO LEADING ZERO SUPPRESSION CALL $CBTA ;CONVERT TO ASCII MOV #DEVNAM,R0 ;SET POINTER FOR COMPLETE NAME MOV #PARBUF,R3 ;PROVIDE A BUFFER AREA CALL $FDLOG ;FIND A UCB, IF IT EXISTS BCC GOTONE ;CARRY CLEAR IF WE HAVE SUCH A DEVICE DONE: EXIT$S GOTONE: BIT #U2.LOG,U.CW2(R1) ;LOGGED IN? BNE INCNO ;IF NOT ZERO, NO, SO TRY NEXT UNIT ;GOT A LIVE ONE, NEXT GET LOGIN UIC AND PUT INTO OUTPUT BUFFER MOV R1,R5 ;SAVE UCB ADDRESS FOR FURTHER USE MOV R1,UCB ;SAVE MORE PERMANENTLY TOO MOV U.LUIC(R5),R4 ;GET THE LOGIN UIC MOV R4,R1 ;FIRST XLATE THE GRP CODE SWAB R1 MOV #1,R2 ;DON'T SUPPRESS LEADING ZEROS MOV #UICGRP,R0 ;SUPPLY BUFFER ADDR. CALL $CBTMG ;DO THE CONVERSION MOV R4,R1 ;REPEAT FOR THE MEMBER # MOV #1,R2 MOV #UICMEM,R0 CALL $CBTMG ;LOOK FOR TASKS W/ THIS TI: MOV #MAXTSK,NUMACT ;SET MAX NUMBER OF TASKS TO LOOK FOR CALL $SWSTK,ENDLST ;SWITCH TO SYSTEM STATE TO SCAN LIST MOV #TSKNAM,R0 ;GET ADDRESS OF ASCII BUFFER MOV $TSKHD,R5 ;GET BEGINNING OF TASK-LIST 10$: TST T.TCBL(R5) ;AT END OF LIST (NULL TASK)? BEQ 30$ CMP UCB,T.UCB(R5) ;NO, SO DOES THIS TASK BELONG TO THIS TI:? BNE 20$ MOVB #',,(R0)+ ;YES, FIRST INSERT ', ' MOVB #40,(R0)+ MOV T.NAM(R5),R1 ;GET 1ST HALF OF NAME CALL $C5TA ; & CONVERT TO ASCII MOV T.NAM+2(R5),R1 ;REPEAT FOR 2ND HALF CALL $C5TA DEC NUMACT ;DECR. COUNT OF REMAINING TO LOOK FOR BEQ 30$ ;IF ZERO, DON'T LOOK ANY MORE 20$: MOV T.ACTL(R5),R5 ;MOVE POINTER TO NEXT ACTIVE TASK BR 10$ ; & GO LOOK AGAIN ; 30$: RETURN ;RETURN FROM SYSTEM STATE ENDLST: MOV #MAXTSK,R0 ;CALC. LNGTH OF MSG.(DEPENDS ON #TSKS ACTIVE) SUB NUMACT,R0 ;NOW R0=NUMBER OF TASK NAMES FOUND ASH #3,R0 ;MULTIPLY BY 8 (8 CHRS/NAME INCL. ', ') ADD #MSGCNT,R0 ;BUMP BY INITIAL(FIXED) PART OF MSG. MOV R0,TTWRT+Q.IOPL+2 ;SET VALUE IN QIO PARAMETER LIST ;NOW WE CAN ACTUALLY OUTPUT THE MESSAGE ABOUT THIS LOGGED-IN TERMINAL DIR$ #TTWRT INCNO: INC UNITNO ;BUMP COUNT TO NEXT UNIT NUMBER BR NEXTNO ; & GO TRY ANOTHER UNIT AFTER PRINTING MSG. ; ;DATA AREA ; TTWRT: QIOW$ IO.WVB,1,1,,,, UCB: .BLKW 1 ;UCB ADDRS. FOR LOGGED-IN TERMINAL NUMACT: .BLKW 1 ;MAXTSK-NUMBER OF JOBS W/ T.UCB=UCB PARBUF: .BLKW 2 ;BUFFER AREA FOR $FDLOG UNITNO: .WORD 0 ;CURRENT UNIT # DEVNAM: .ASCII /TT00: [/ UICGRP: .ASCII /000,/ UICMEM: .ASCII /000]/ MSGCNT=.-DEVNAM TSKNAM: .BLKB 80.-MSGCNT ;HAVE A 80-CHAR OUTPUT BUFFER .EVEN .END WHO