.TITLE CPU.MAC .IDENT /V1.0/ .ENABL LC ; ; CPU IS A PROGRAM THAT MEASURES INSTANTANEOUS CPU UTILIZATION ; .MCALL MRKT$C,QIO$C,QIOW$C,ALUN$C,EXIT$S,ALTP$C,ASTX$S,ENAR$S .MCALL GTIM$C,WTSE$C ; ; .EVEN ; COUNT: .WORD 0 FLAG: .WORD 0 ; INITMG: .ASCII <33>/[?2l/<33>/H/<33>/J/<12><11><11><11> .ASCII /Instantaneous CPU utilization/ .ASCII <33>/Y/<50><55> .ASCII /+----+----+----+----+----+----+----+----+----+----+/ .ASCII <33>/Y/<51><55> .ASCII /0 10 20 30 40 50 60 70 80 90 100 %/ .ASCII <33>/Y/<45><65>/Time:/ .ASCII <33>/Y/<45><106>/Utilization: / INITML= . - INITMG ; ENDMG: .ASCII <33>//Y/<45><73> TIMOUT: .ASCII / /<33>/Y/<45><123> NUMOUT: .ASCII / %/<33>/Y/<47><55>/|/<33>/F/ GRAPH: .BLKB 50. .ASCII <33>/G/<15><12><12><12><12> VALL= . - VALMG ; .EVEN IOST: .BLKW 2 TIMBUF: .BLKW 8. SECOND= TIMBUF+10. TICK= TIMBUF+12. INMG: .BLKB 1 .EVEN ; CPU: ALUN$C 1,TI,0 ; LUN 1 IS TERMINAL I/O ; INIT: QIOW$C IO.WAL,1,2,,,, ; PRINT INIT MESSAGE ; CLR COUNT ; NUMBER OF ITERATIONS = 0 TO START ; MRKT$C ,60.,1,MKAST ; SEND CONTROL TO AST IN SPECIFIED TIME QIO$C IO.ATA,1,1,,IOST,, ; GTIM$C TIMBUF ; GET CURRENT TIME ; MOV SECOND,R1 ; GET ABSOLUTE TICK MUL #60.,R1 ADD TICK,R1 MOV R1,R4 ; ; ALTP$C ,1 ; SET PRIORITY TO 1 SO THIS TASK ; WILL ONLY RUN WHEN NO OTHER TASKS ; ARE USING THE CPU ; LP0: MOV #500.,R0 ; INNER LOOP COUNTER LP1: SOB R0,LP1 ; CHEW UP SOME TIME ; INC COUNT BR LP0 ; ; MKAST: ALTP$C ; BUMP PRIORITY BACK TO DEFAULT ; TST FLAG ; ANY KEY ENTERED? BEQ NOKEY ; QIOW$C IO.WAL,1,1,,,, ; PRINT INIT MESSAGE ; CLR COUNT ; NUMBER OF ITERATIONS = 0 TO START ; ADD #2,SP ; KNOCK EVENT FLAG NUMBER OFF STACK CLR FLAG MRKT$C ,60.,1,MKAST ; SEND CONTROL TO AST IN SPECIFIED TIME ALTP$C ,1 ; SET PRIORITY TO 1 ASTX$S ; ; NOKEY: GTIM$C TIMBUF ; GET CURRENT TIME MOV #TIMOUT,R0 ; ADDRESS FOR HH:MM:SS MOV #TIMBUF+6,R1 ; GET CURRENT TIME BINARY VALUE ADDR MOV #3,R2 CALL $TIM ; MOV SECOND,R1 MUL #60.,R1 ADD TICK,R1 CMP R1,R4 BGT SMMIN ; ADD #3600.,R1 SMMIN: SUB R4,R1 ; GET TICKS SINCE LAST PASS ; MUL #27.,R1 ; 1600 = 1 SECOND CLR R0 DIV #100.,R0 MOV R0,R3 ; MOV COUNT,R1 ; GET VALUE CLR R0 ; SET HIGH ORDER WORD TO ZERO DIV R3,R0 MOV #100.,R1 SUB R0,R1 ; VALUE OF THE COUNTER TO BE CONVERTED BGE OUT ; JUST IN CASE CLR R1 ; ZERO NEGATIVE VALUE ; OUT: MOV R1,COUNT ; SAVE 0-100 VALUE ; MOV #NUMOUT,R0 ; ADDRESS OF OUTPUT NUMBER MOV #17012,R2 ; CONVERT TO DECIMAL, FIELD WDTH = 5 CALL $CBTA ; CONVERT THE VALUE ; MOV COUNT,R1 ; GET PERCENT UTILIZATION ASR R1 ; DIVIDE TO MAKE 0-50 CLR R0 ; LP2: MOVB #40,GRAPH(R0) ; PUT A BLANK IN CMP R0,R1 ; SEE IF WE NEED A * BGE ELP2 ; NO * NEEDED MOVB #141,GRAPH(R0) ; OUT WITH A * ELP2: INC R0 CMP R0,#50. BLT LP2 ; ; QIO$C IO.WAL,1,2,,,, ; PRINT VALUE OF COUNTER ; CLR COUNT ; SET COUNTER BACK TO ZERO ; ADD #2,SP ; KNOCK EVENT FLAG NUMBER OFF STACK CLR FLAG ; ALTP$C ,1 ; SET PRIORITY TO 1 GTIM$C TIMBUF MOV SECOND,R1 MUL #60.,R1 ADD TICK,R1 MOV R1,R4 ; MRKT$C ,60.,1,MKAST ; SEND CONTROL TO AST IN SPECIFIED TIME ASTX$S ; IOAST: CMPB #32,(SP) ; DID HE PRESS CTRL-Z ? BEQ EXT ; YES - GO EXIT CMPB #3,(SP) ; NO - HOW ABOUT CTRL-C ? BNE CLS ; NO - GO SEE IF HE WANTS SCREEN REFSD ; EXT: QIOW$C IO.WAL,1,1,,,, ; PRINT END MESSAGE WTSE$C 2 EXIT$S ; EXIT THE TASK ; CLS: CMPB #40,(SP) ; DID HE PRESS SPACE (SCREEN REFRESH) BNE NOSP ; NO - GO BACK INC FLAG ; YES - SET FLAG TO SHOW CLS INTENDED NOSP: ADD #2,SP ; KNOCK OFF INPUT FROM STACK QIO$C IO.ATA,1,1,,IOST,, ; RE-ISSUE I/O ; ASTX$S ; EXIT THE AST SERVICE ROUTINE ; .END CPU