.TITLE CPU ; ; PROGRAM TO MONITOR AVAILABLE CPU TIME, RECORD IT PERIODICALLY IN A ; DISK FILE, DYNAMICALLY DISPLAY IT AS A BAR GRAPH IN THE CONSOLE ; LIGHTS AND OPTIONALLY PRINT IT AT THE REQUESTING TERMINAL. ; ; THE CONSOLE LIGHT BAR GRAPH IS TO THE NEAREST 10 PERCENT, WITH EACH ; LIGHT REPRESENTING 10 PERCENT (DISPLAYED FROM THE RIGHT - THE SIX ; LEFTMOST LIGHTS ARE ALWAYS ON). THE OPTIONAL TERMINAL PRINTOUT, WHICH ; IS ACTIVATED BY PUTTING SWITCH 12 UP, IS TO THE NEAREST ONE PERCENT. ; BOTH ARE UPDATED EACH 1/4 SECOND, WHILE EVERY 5 MINUTES THE ACCUMULATED ; DATA, TOGETHER WITH THE DATE AND TIME, IS WRITTEN TO A DISK FILE. ; ; A SEPARATE COUNTING TASK (COUNTR) RUNS AT MINIMUM PRIORITY (1) WHILE THIS ; TASK RUNS A MAXIMUM PRIORITY (250) AND RECORDS AND RESETS THE COUNTERS ; EVERY 1/4 SECOND. AT INITIALIZATION, THE COUNTER TASK RUNS AT MAXIMUM ; PRIORITY FOR ONE SECOND TO ESTABLISH A BASE LINE. BOTH CPU AND COUNTR ; SHOULD BE SEPARATELY INSTALLED PRIOR TO RUNNING (TO REDUCE EXECUTIVE ; OVERHEAD) AND SHOULD BE STARTED ONLY WHEN THE SYSTEM IS QUIESENT, ; OTHERWISE AN ERRONEOUS BASE LINE MAY RESULT. ; ; BOTH PROGRAMS ARE TERMINATED BY PUTTING SWITCH 15 UP. ; ; INSTALLATION NOTES ; 1. THE DEVICE, UIC AND NAME OF THE DISK FILE TO STORE THE ACCUMULATED ; DATA ON MUST BE SPECIFIED IN THE FILE DESCRIPTOR DATA PRIOR TO ; ASSEMBLY. ; 2. AS INDICATED ABOVE, BOTH CPU AND COUNTR SHOULD FIRST BE INSTALLED, ; THEN RUN, TO REDUCE EXECUTIVE OVERHEAD. ; 3. THIS PROGRAM WAS WRITTEN FOR RSX-11D VERSION 6.2 RUNNING ON A ; PDP 11/70. IT SHOULD WORK PROPERLY ON OTHER PDP11 MODELS AND ; EARLIER VERSIONS OF RSX-11D. MODIFICATIONS MAY BE NECESSARY FOR ; RSX-11M. IT WILL NOT WORK UNDER IAS, AS IAS HAS IT'S OWN CPU ; MONITOR EMBEDDED IN THE TIME-SLICING ALGORITHM. ; ; WRITTEN OCTOBER 1977 R B FRENCH THE BOEING COMPANY ; ; TASK BUILD FILE ; ; CPU/-FP/PR/-CP,CPU=CPU ; / ; UNITS=2 ; ASG=TI:1 ; PRI=250 ; STACK=64 ; LIBR=SYSRES:RO ; / ; .MCALL DIR$,MRKT$,WTSE$,QIOW$,GTIM$,EXEC$,ALTP$,EXIT$S .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,NMBLK$,FSRSZ$ .MCALL OPEN$A,OPEN$W,PUT$,CLOSE$ ; COUNT=172260 ;USE SUPERVISOR DATA PAR0 FOR COUNT CARRY=172262 ;USE SUPERVISOR DATA PAR1 FOR CARRY ; ; FILE DESCRIPTOR DATA FSRSZ$ 1 FDB: FDBDF$ FDAT$A R.FIX,,214. FDRC$A ,DATA,214. FDOP$A 2,FILNAM,,FO.WRT FILNAM: .WORD DEVSZ,DEV .WORD DIRSZ,DIR .WORD NAMSZ,NAM DEV: .ASCII /SY0:/ ;DISK FILE DEVICE DEVSZ=.-DEV DIR: .ASCII /[201,32]/ ;DISK FILE UIC DIRSZ=.-DIR NAM: .ASCII /CPU.DAT;1/ ;DISK FILE NAME NAMSZ=.-NAM .EVEN ; ; CLEAR AND START COUNTER START: DIR$ #EXEC ;START THE COUNTER CLR @#COUNT ;CLEAR COUNT CLR @#CARRY ;CLEAR CARRY ; ; READ AND CLEAR THE COUNTER EVERY 1/4 SECOND LOOP: DIR$ #MRKT ;ISSUE THE MARK TIME DIR$ #WTSE ;AND WAIT FOR IT MOV @#COUNT,R1 ;GET COUNT CLR @#COUNT ;AND CLEAR IT MOV @#CARRY,R0 ;GET CARRY CLR @#CARRY ;AND CLEAR IT MOV R0,-(SP) ;SAVE THE COUNT MOV R1,-(SP) TST PC10 ;1ST TIME THROUGH? BEQ BASE ;IF SO, GO CALCULATE BASE LINE ; ; GENERATE AND DISPLAY THE BAR GRAPH MOV PC10,R2 ;DIVIDEND IN R2 DIV R2,R0 ;DIVIDE BY 10 PERCENTILE JSR PC,ROUND ;ROUND OFF RESULT CLR R1 ;CLEAR BAR GRAPH TST R0 ;IF RESULT IS ZERO BEQ 20$ ;SKIP ROTATE STUFF 10$: SEC ;SET CARRY BIT ROL R1 ;PUT IN BAR CHART SOB R0,10$ 20$: BIS #176000,R1 ;SET UPPER 6 BITS MOV R1,@#177570 ;DISPLAY BAR GRAPH ; MOV (SP)+,R1 ;RESTORE THE COUNT MOV (SP)+,R0 MOV PC1,R2 ;DIVIDEND IN R2 DIV R2,R0 ;DIVIDE BY ONE PERCENTILE JSR PC,ROUND ;ROUND OFF RESULT BIT #10000,@#177570 ;TERMINAL MONITORING REQUESTED? BEQ ACCUM ; MOV R0,-(SP) ;SAVE IT CLR R2 ;NO LEADING ZEROS MOV R0,R1 ;VALUE TO R1 MOV #" ,BUF+1 ;CLEAR THE BUFFER MOV #" ,BUF+3 MOV #BUF,R0 ;BUFFER ADDRESS IN R0 JSR PC,$CBDMG ;PUT IT IN THE BUFFER INC LINE ;INCREMENT COUNT CMP #16.,LINE ;END OF LINE YET? BNE 40$ MOV #6412,BUF+3 ;ADD LF AND CR CLR LINE ;AND CLEAR COUNT 40$: DIR$ #QIOW MOV (SP)+,R0 ;RESTORE R0 ; ; ADD PERCENTAGE TO DATA ARRAY FOR DISK FILE ACCUM: CMP #100.,R0 ;TRUNCATE IF OVER 100 BGE 10$ MOV #100.,R0 10$: ASL R0 INC DATA(R0) ;ADD TO DATA ARRAY INC PCOUNT ;INCREMENT PRINT COUNTER CMP PCOUNT,PRINT ;TIME TO PRINT YET? BLT CHKSW ;BRANCH IF NOT DIR$ #GTIM ;GET TIME OPEN$A #FDB ;OPEN THE DATA FILE PUT$ ;PRINT THE DATA CLOSE$ ;AND CLOSE THE FILE MOV #101.,R0 ;RESET DATA ARRAY MOV #DATA,R2 20$: CLR (R2)+ SOB R0,20$ CLR PCOUNT ;CLEAR PRINT COUNTER BR CHKSW ; ; ; DETERMINE BASE LINE VALUES BASE: MOV #40.,R2 ;DIVIDEND IN R2 DIV R2,R0 ;CALCULATE 10% VALUE JSR PC,ROUND ;ROUND OFF MOV R0,PC10 ;AND SAVE IT MOV (SP)+,R1 ;RESTORE COUNT MOV (SP)+,R0 MOV #400.,R2 ;DIVIDEND IN R2 DIV R2,R0 ;CALCULATE 1% VALUE JSR PC,ROUND ;ROUND OFF MOV R0,PC1 ;AND SAVE IT DIR$ #ALTP ;CHANGE COUNTER PRIORITY TO 1 MOV #15.,MRKT+M.KTMG ;CHANGE MARK TIME TO 15 TICKS OPEN$A #FDB ;TRY TO APPEND DATA FILE BCC 20$ ;CHECK FOR ERRORS CMPB #-26.,FDB+F.ERR ;IS ERROR NO SUCH FILE? BEQ 10$ ;THEN GO CREATE IT BIS #100000,@#CARRY ;STOP THE COUNTER DIR$ #ERR ;WRITE ERROR MESSAGE EXIT$S ;AND EXIT 10$: OPEN$W #FDB ;CREATE THE FILE 20$: CLOSE$ ;CLOSE THE FILE ; ; CHECK TERMINATE SWITCH BEFORE CONTINUING CHKSW: BIT #100000,@#177570 ;CHECK TERMINATE SWITCH (15) BNE 10$ ;SHUT DOWN IF SET JMP LOOP ;OTHERWISE CONTINUE MONITORING 10$: BIS #100000,@#CARRY ;SET CARRY SIGN BIT TO STOP COUNTER DIR$ #GTIM ;GET TIME INFO OPEN$A #FDB ;OPEN THE DATA FILE PUT$ ;PRINT THE DATA CLOSE$ ;AND CLOSE THE FILE EXIT$S ;AND EXIT ; ; SUBROUTINE FOR ROUNDING OFF R0-R1 DIVIDE RESULTS ROUND: ASL R1 ;DOUBLE REMAINDER CMP R1,R2 ;COMPARE WITH DIVIDEND BLT 10$ ;ROUND UP NEEDED? INC R0 ;THEN DO IT 10$: RTS PC ;AND RETURN ; MRKT: MRKT$ 1,60.,1 ;MARK TIME DPB WTSE: WTSE$ 1 GTIM: GTIM$ TIME QIOW: QIOW$ 400,1,2,,,, .ODD BUF: .ASCII / / ERR: QIOW$ 400,1,2,,,, MSG: .ASCII <12>/UNABLE TO OPEN DATA FILE/<15> PCOUNT: .WORD 0 PRINT: .WORD 1200. LINE: .WORD 0 PC1: .WORD 0 PC10: .WORD 0 EXEC: EXEC$ COUNTR,,250. ALTP: ALTP$ COUNTR,1 DATA: .BLKW 101. TIME: .BLKW 8. .END START