.TITLE DSKMON .IDENT /1B/ ;+ ; ; BY: ; JAMES G. DOWNWARD ; KMS FUSION, INC. ; 3941 RESEARCH PARK DR. ; ANN ARBOR, MICH, 48104 ; (313)-769-8500 ; 03-JUN-80 ; ; DSKMON WILL MONITOR THE BUSY BIT ON THE SYSTEMS PHYSICAL LB0:'S SCB ; EVERY CLOCK TIC. IF THE DISK CONTROLER IS BUSY, A CLOCK TIC WILL BE ; ADDED INTO A DOUBLE WORD BUSY COUNTER. DSKMON MUST BE INSTALLED WITH THE ; NAME 'DSKMON' SO THAT DSKOFF CAN STOP DSKMON BY SENDING IT A DUMMY DATA ; PACKET. DSKMON WILL NOT LET ITSELF RUN UNLESS IT IS RUN WITH THE CORRECT ; NAME. WHEN DSKMON RECEIVES A RECEIVE DATA AST IT EXITS PRINTING THE NUMBER ; OF TIMES THE BUSY BYTE WAS SET AND THE TOTAL NUMBER OF TICS WHICH HAVE ; GONE BY. ; ; NOTE THAT DSKMON WILL RUN AT PRIORITY=100. IT IS DESIGNED TO BE USED ; FOR DIAGNOSTIC USES ONLY AND NOT TO BE PERMANENTLY RUN. ; BECAUSE DISK SEEK TIMES ARE VERY MUCH LONGER THAN THE SAMPLE RATE, DSKMON ; GIVES A GOOD PICTURE OF DISK ACTIVITY. THE SAMPLE RATE COULD BE MADE ; SLOWER, BUT THE ACCURACY WOULD DECREASE. ; ;- .MCALL UCBDF$, SCBDF$,DCBDF$,MRKT$,DIR$,WTSE$,EXIT$S,SRDA$ .MCALL ASTX$S,QIO$S,RCVD$,QIOW$S,ALUN$,GTSK$,ALTP$ UCBDF$ SCBDF$ DCBDF$ ; OUTPUT MESSAGE ; OUTMSG: .ASCII /DSKMON -- LB0: BUSY / BSY: .ASCII / TICS OUT OF / TIM: .ASCIZ / TICS/ ER1: .ASCIZ /DSKMON -- FATAL, TASK MUST BE INSTALLED WITH NAME 'DSKMON'/ ER2: .ASCIZ /DSKMON -- FATAL, CAN NOT FIND PHYSICAL LB0:/ .EVEN DSKBSY: .BLKW 2 ;STORAGE CLKTIC: .BLKW 2 ; TIC COUNTER ; ; DPB'S MRKTIM: MRKT$ 1,1,1 ; MARK TIME FOR 1 TIC WAIT: WTSE$ 1 ; WAIT ON EFN 1 XITAST: SRDA$ DONE ; RECEV: RCVD$ ,BUF ; RECIEVE DATA IF ANY ASIGN: ALUN$ 2,TI,0 ; ASSIGN OUTPUT GETASK: GTSK$ BUF ; SETPRI: ALTP$ ,100. ; SET PRIORITY TO 100. .EVEN BUF: .BLKW 16. ; MYNAME: .RAD50 /DSKMON/ DSKMON:: DIR$ #ASIGN ; ASSIGN TERMINAL OUTPUT DIR$ #GETASK ; GET TASK PARAMETERS CMP BUF,MYNAME ; IS FIRST HALF OF NAME 'DSK' BEQ 2$ ; YES, ALL OK JMP BADNAM ; ERROR EXIT, NAME WRONG 2$: CMP BUF+2,MYNAME+2 ; IS LAST HALF OF NAME 'MON' BEQ 4$ ; ALL OK, IF EQ JMP BADNAM ; ERROR EXIT, NAME WRONG 4$: DIR$ #SETPRI ; SET PRIORITY TO 100 DIR$ #XITAST ; SPECIFY RECIEVE DATA AST TO FORCE EXIT MOV $DEVHD,R2 ; START AT BEGINNING OF DEVICE TABLE 10$: CMP D.NAM(R2),#"LB ; AND LOOK FOR LB: BEQ 20$ ; EQ- FOUND MOV D.LNK(R2),R2 ; NEXT DEVICE BNE 10$ ; TRY IT! JMP NOLB ; CAN NOT FIND ANY LB0:, WARN USER 20$: MOV D.UCB(R2),R0 ; GET UCB ADDR MOV U.RED(R0),R0 ; FIND PHYSICAL LB: (IE FIRST REDIRECT) MOV U.SCB(R0),R0 ; GET SCB ADDRESS 100$: ADD #1,CLKTIC+2 ; KEEP TRACK OF TIME ADC CLKTIC ; HIVAL TSTB S.STS(R0) ; IS IT BUSY BEQ 200$ ; IF EQ, NO ADD #1,DSKBSY+2 ; ADD ONE ADC DSKBSY ; AND CARRY TO HIGH PART IF NEEDED 200$: DIR$ #MRKTIM ; DIR$ #WAIT ; WAIT FOR EVENT FLAG 1(1 TIC LATER) BR 100$ ; CHECK AGAIN DONE: MOV #ENDUP,2(SP) ; ADDRESS OF WHERE TO START AFTER AST EXIT DIR$ #RECEV ; RECIEVE THE DATA(BLANK) ASTX$S ; BADNAM: MOV #ER1,R0 ; TELL USER TASK MUST BE INSTALLED WITH JMP XIT ; NAME 'DSKMON' NOLB: MOV #ER2,R0 ; WARN USER, CANNOT FIND LB0: JMP XIT ; AND EXIT ENDUP: MOV #BSY,R0 ; WHERE MESSAGE GOES MOV #DSKBSY,R1 ; SET UP NUMBER OF DSKBUSY TICS CLR R2 ; SUPRESS LEADING ZEROS CALL $CDDMG ; CONVERT MOV #TIM,R0 ; WHERE MESSAGE GOES MOV #CLKTIC,R1 ; SET UP TOTAL NUMBER OF TICS CLR R2 ; SUPRESS LEADING ZEROS CALL $CDDMG ; CONVERT MOV #OUTMSG,R0 ; SET UP MESSAGE FOR PRINTING XIT: CALL TYPEIT ; PRINT MESSAGE EXIT$S ; AND EXIT ; ; MESSAGE TYPER, TEXT ENDS IN NULL ; ADRESS OF MESSAGE SHOULD BE IN R0 TYPEIT: MOV R1,-(SP) MOV R0,R1 1$: TSTB (R1)+ BNE 1$ DEC R1 SUB R0,R1 QIOW$S #IO.WVB!TF.WAL,#2,#1,,,, MOV (SP)+,R1 RETURN .END DSKMON