.TITLE FRG DISK FRAGMENTATION .IDENT /M1.2/ .SBTTL DATA AREA ; ; DATE: 7/12/77 ; ; REVISED 2/7/78 D. M. ; REVISED FOR DOUBLE PRECISION FOR BIG DISKS 5/19/78 D. M. ; ; BY: D. MICHAUD ; BRIDGEPORT CONTROLS ; 200 PRECISION ROAD ; HORSHAM, PA. ; ; THIS MCR TASK WILL PRODUCE FRAGMENTATION STATISTICS FOR THE SPECIFIED ; FILES-11 DEVICE. THE OUTPUT IS A FREQUENCY COUNT OF CONTIGUOUS FREE ; BLOCKS (HOLES) FALLING WITHIN EACH OF SEVERAL RANGES, THE TOTAL NUMBER ; OF BLOCKS FOR EACH RANGE, AND THE TOTAL NUMBER OF FREE BLOCKS FOR THE ; DEVICE. ; ; OUTPUT IS DIRECTED TO LUN 2, WHICH MAY BE ASSIGNED TO ANY TERMINAL. ; ERROR MESSAGES ARE DIRECTED TO LUN 5. ; .NLIST MEB,BEX ; ; ; .MCALL GTIM$,QIOW$,CALL,EXIT$S,DIR$ .MCALL FCSMC$,TCBDF$,UCBDF$,ALUN$,GMCR$ ;+ ; EQUATED SYMBOLS ;- BINNO = 9. ; NUMBER OF BINS BINSIZ = 4. ; NUMBER OF BYTES/BIN BINEND = <-BINSIZ> ; WILL POINT TO LAST BIN ; FCSMC$ ; DEFIN FCS MACROS TCBDF$ ; DEFINE TCB OFFSETS UCBDF$ ; DEFINE UCB OFFSETS FSRSZ$ 0 ; NO FSR FOR BLOCK OPERATIONS FDB: FDBDF$ FDRC$A FD.RWM FDBK$A INBUF,512.,,10 FDOP$A 1,DSET DSET: .WORD 0,0 .WORD UICSIZ,UIC .WORD NAMSIZ,NAME UIC: .ASCII /[0,0]/ UICSIZ=.-UIC .EVEN NAME: .ASCII /BITMAP.SYS/ NAMSIZ=.-NAME .EVEN INBUF: .BLKB 512. ALUN: ALUN$ 1,DK,0 ; DUMMY ASSIGN LUN GMCR: GMCR$ ; BUF=GMCR+2 ; BUF OVERLAYS COMMAND LINE BUFFER .BLKW 20. ; NEED SOME EXTRA SPACE TIME: GTIM$ BUF READ: QIOW$ IO.RVB,1,10,,IOST,, DPB: QIOW$ IO.WVB,5,1,,,, BLOCK: .WORD 1 ; BLOCK COUNTER FOR QIO ; BLOCK 1 IS NOT PART OF BIT MAP, ; SO WILL START READING AT BLOCK 2 TOTALH: .WORD 0 ;; HOLDS TOTAL HIGH PART 5/19/78 TOTALL: .WORD 0 ;; HOLDS TOTAL LOW PART 5/19/78 COUNTH: .WORD 0 ;; ACCUMULATE FREE BLOCKS HIGH PART 5/19/78 COUNTL: .WORD 0 ;; LOW PART 5/19/78 IOST: .BLKW 2 BINS: .WORD 25.,50.,75.,100.,250.,500.,750.,1000. BSIZ=8. ; NUMBER OF BINS - THE BIGGEST (< 1000. ) BIN: .BLKW 9.*2 ;HOLDS FREQUENCY COUNT FOR EACH BIN(DOUBLE) 5/19/78 BINSUM: .BLKW 9.*2 ;; HOLDS #BLOCKS FOR EACH BIN(2 WORDS EACH). 5/19/78 ISTRNG: .ASCII <11><11>/DISK FRAGMENTATION STATISTICS FOR / ASCDEV: .ASCII /DK0:/ .ASCII /%2N/<11><11><11>/%Y/<11>/%3Z/ .ASCII /%2N/<11><11>/CONTIGUOUS FREE BLOCKS (HOLES)/ .ASCII /%2NHOLE RANGE/<11>/ FREQUENCY/<11><11>/NUMBER OF BLOCKS/ ;+ ; NOTE - THE ? CHARACTERS APPEAR IN PLACE OF THE $DEMSG DIRECTIVE %T ; DUE TO THE FAILURE OF $EDMSG TO DO DOUBLE PRECISION. AT SUCH TIME AS ; THE PROBLEM IS FIXED, THE VARIOUS FIELDS OF 9 ? CHARACTERS MAY BE EACH ; REPLACED WITH %T AND THE INTERNAL ROUTINE EDIT MAY BE ELIMINATED. ;- .ASCII /%N 0 - 25/<11>/?????????/<11><11>/?????????/ .ASCII /%N 26 - 50/<11>/?????????/<11><11>/?????????/ .ASCII /%N 51 - 75/<11>/?????????/<11><11>/?????????/ .ASCII /%N 76 - 100/<11>/?????????/<11><11>/?????????/ .ASCII /%N101 - 250/<11>/?????????/<11><11>/?????????/ .ASCII /%N251 - 500/<11>/?????????/<11><11>/?????????/ .ASCII /%N501 - 750/<11>/?????????/<11><11>/?????????/ .ASCII /%N751 - 1000/<11>/?????????/<11><11>/?????????/ .ASCII /%N > 1000/<11>/?????????/<11><11>/?????????/ .ASCIZ /%2N/<11><11>/TOTAL FREE BLOCKS /<11>/?????????/ .EVEN ER1: .ASCII /...FRG - PRIVILEGED COMMAND/ ER1SIZ=.-ER1 .EVEN ER2: .ASCII /...FRG - FAILURE ON INPUT/ ER2SIZ=.-ER2 .EVEN ER3: .ASCII /...FRG - COMMAND LINE FAILURE/ ER3SIZ=.-ER3 .EVEN ER4: .ASCII /...FRG - ILLEGAL DEVICE/ ER4SIZ=.-ER4 .EVEN .PAGE .SBTTL CODE AREA ;+ ; ** FRAG - DISPLAY FRAGMENTATION DATA FOR FILES-11 DEVICES ; ; SYNTAX: ; FRG DDN: ; ; WHERE: ; DD - A LEGAL FILES-11 DEVICE NAME ; N - A LEGAL UNIT NUMBER < 8 ;- FRAG: DIR$ #GMCR ; GET COMMAND LINE BCC 1$ JMP ERROR3 ; STRICT SYNTAX-MUST HAVE COMMAND LINE ; 1$: MOV $TKTCB,R0 ; GET CURRENT TCB POINTER MOV T.UCB(R0),R0 ; GET OUR TCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; ARE WE PRIVILEGED? BNE 2$ ;; NE=YES, OK 5/19/78 JMP ERROR1 ; EQ=NOPE - FATAL ; 2$: MOV #BUF+3,R0 ; COMMAND LINE CMPB #' ,(R0)+ ; STRICT SYNTAX-MUST BE SPACE BEQ 3$ JMP ERROR3 ;; 5/19/78 ; 3$: MOV (R0),ALUN+A.LUNA MOVB (R0)+,ASCDEV ; MOVB (R0)+,ASCDEV+1 ; GET DEVICE NAME FOR OUTPUT MOVB (R0),ASCDEV+2 ; AND DEV NUMBER BIC #177770,(R0) ; STRIP ASCII MOV (R0),ALUN+A.LUNU ; DEV NUM FOR ALUN$ DIR$ #ALUN ; ASSIGN INPUT DEVICE BCC 4$ ;; 5/19/78 JMP ERROR4 ; CS= ILLEGAL DEVICE ; 4$: CLR COUNTL ;; CLEAR LOW PART 5/19/78 CLR COUNTH ; HIGH CLR TOTALL ; LOW CLR TOTALH ; HIGH ; OPNS$R #FDB,,,,,,ERROR2 ;; OPEN FOR SHARED READ ACCESS 6/21/78 RECORD: INC BLOCK MOV BLOCK,READ+Q.IOPL+10 ; SET FOR NEXT BLOCK DIR$ #READ ; READ A BLOCK TSTB IOST ; DONE? BLT ERR ; LT=MAYBE MOV #INBUF,R0 ; GET RECORD BUFFER BLOCKS: MOV (R0)+,R1 ; GET 1ST 16 BLOCKS BEQ FULL ; EQ= ALL USED CMP R1,#-1 ; ALL FREE? BNE COUNT ; NE=NOT ALL FREE ADD #16.,COUNTL ; COUNT 16 FREE BLOCKS ADC COUNTH ;; DOUBLE PRECISION ADD CARRY 5/19/78 BR END ; SEE IF DONE ; COUNT: MOV #16.,R2 ; BIT SHIFT COUNTER SHIFT: ASR R1 ; CHECK A BLOCK BCC FULL ; CC= A USED BLOCK ADD #1,COUNTL ;; COUNT A BLOCK FREE 5/19/78 ADC COUNTH ;; CARRY INTO HIGH PART 5/19/78 BR ENDLP ; SEE IF DONE ; FULL: TST COUNTL ; ANY FREE BLOCKS? BEQ ENDLP ; EQ=NOPE FULL1: MOV #BSIZ,R4 ; NUMBER OF BINS CLR R3 ; CLEAR BIN POINTER CLR R5 ;; CLEAR BINSIZE POINTER 5/19/78 5$: TST COUNTH ; FIRST SEE IF HIGH WORD IS NONZERO BEQ 6$ ; IF 0, THEN CHECK EACH BIN MOV #BINEND,R3 ; IF NOT 0, THEN GET BIGGEST BIN BR 10$ ; 6$: CMP COUNTL,BINS(R5) ; MORE THAN THIS BIN? BLOS 10$ ;; LE=NOPE (SIGNED BRANCH IS A NO-NO 6/23/78) TST (R5)+ ;; POINT TO NEXT BIN SIZE 5/19/78 CMP (R3)+,(R3)+ ;; BUMP BIN POINTER TWICE SOB R4,5$ ; CHECK NEXT BIN ; 10$: ADD COUNTL,TOTALL ; ACCUMULATE TOTAL ADC TOTALH ;; DOUBLE PRECISION 5/19/78 ADD COUNTH,TOTALH ;; ADD COUNTL,BINSUM+2(R3) ; ACC TOTAL FOR EACH BIN ADC BINSUM(R3) ;; DOUBLE PRECISION 5/19/78 ADD COUNTH,BINSUM(R3) ;; ADD #1,BIN+2(R3) ;; INCREMENT BIN ADC BIN(R3) ;; DOUBLE PRECISION 5/19/78 CLR COUNTL ; CLEAR COUNTER CLR COUNTH ;; 5/19/78 ENDLP: TST R1 ; ANY FREE BLOCKS STILL? BNE 1$ ;; NE=NO-END THE LOOP TST COUNTL ;;YES-BUT ARE OLD FREE BLOCKS COUNTED? BNE FULL1 ;; NE=NO, BETTER GO COUNT THEM TST COUNTH ;; HOW ABOUT HIGH WORD? BNE FULL1 ;; NE=NOT EMPTY, BETTER COUNT THEM 6/23/78 BR END ;; NONE LEFT IN THIS SET-GET OUT 1$: SOB R2,SHIFT ; CHECK ANOTHER BLOCK ; END: CMP R0,#ALUN ; READ ANOTHER DISK BLOCK? BHIS RECORD ; HIS=YES BR BLOCKS ; NO,LOOK AT ANOTHER 16 BITS ; ERR: CMPB #IE.EOF,IOST ; END OF FILE? BNE ERROR2 ; NE=OOPS! BR FINISH ; WRITE STATISTICS ; ERROR1: MOV #ER1,DPB+Q.IOPL ; GET ERROR STRING MOV #ER1SIZ,DPB+Q.IOPL+2 ; GET SIZE BR OUT ; ERROR2: MOV #ER2,DPB+Q.IOPL ; GET ERROR STRING MOV #ER2SIZ,DPB+Q.IOPL+2 ; GET SIZE BR OUT ERROR3: MOV #ER3,DPB+Q.IOPL ; GET ERROR STRING MOV #ER3SIZ,DPB+Q.IOPL+2 ; GET SIZE BR OUT ERROR4: MOV #ER4,DPB+Q.IOPL ; GET ERROR STRING MOV #ER4SIZ,DPB+Q.IOPL+2 ; GET SIZE BR OUT ; FINISH: DIR$ #TIME ; GET TIME/DATE MOV #BSIZ+1,R0 ; # OF BINS MOV #BUF+14,R2 ; START OF NUMBERS MOV #BIN,R5 ; GET FREQUENCY BUFFER MOV #BINSUM,R4 ; GET SUBTOTALS BUFFER 10$: MOV (R5)+,(R2)+ ; TRANSFER A FREQUENCY MOV (R5)+,(R2)+ ;; TRANSFER LOW PART 5/19/78 MOV (R4)+,(R2)+ ; TRANSFER A SUBTOTAL MOV (R4)+,(R2)+ ;; TRANSFER LOW PART 5/19/78 SOB R0,10$ ; GET ANOTHER MOV TOTALH,(R2)+ ;; TOTAL FREE BLOCKS 5/19/78 MOV TOTALL,(R2) ;; LOW PART 5/19/78 MOV #BUF,R2 ; GET ARGUEMENTS MOV #INBUF,R0 ; GET NEW OUTPUT STRING BUFFER MOV #ISTRNG,R1 ; GET ASCIZ STRING CALL $EDMSG ; EDIT STRING CALL EDIT ; USED TO REPLACE $EDMSG DOUBLE PRECISION MOV #INBUF,DPB+Q.IOPL ; GET STRING INTO DPB MOV R1,DPB+Q.IOPL+2 ; GET SIZE INTO DPB MOV #2,DPB+Q.IOLU ; USE LUN 2 OUT: CLOSE$ #FDB ; CLOSE THE FILE DIR$ #DPB EXIT$S ;+ ; SUBROUTINE EDIT ; INPUTS: R0=ADDRESS OF NEXT AVAILABLE BYTE IN OUTPUT BLOCK ; R1=LENGTH OF OUTPUT BLOCK ; ; OUTPUTS:R1=LENGTH OOF OUTPUT BLOCK ;- EDIT: MOV #INBUF,R3 MOV #BUF+14,R4 ; PARAMETER LIST ADDRESS 2$: TSTB (R3) ; FOUND END OF STRING (0)? BEQ 40$ ; EQ=YES, DONE 5$: CMPB (R3)+,#'? ; GOT '?' ? BNE 5$ ; NE=NOPE ; ; FOUND START OF ? FIELD; REPLACE WITH A DOUBLE NUMBER ;- TSTB -(R3) ; BACKUP POINTER MOV R3,R0 ; GET ADDRESS IN R0 FOR $CDDMG MOV R4,R1 ; GET ADDRESS OF DOUBLE NUMBER (HIGH 1ST) MOV #1,R2 ; SET FOR NO SUPPRESSION CALL $CDDMG CMP (R4)+,(R4)+ ; BUMP PARAMETER POINTER BY 2 25$: CMPB (R0),#'? ; ANY ? LEFT BNE 30$ ; NE=NOPE MOVB #' ,(R0)+ ; INSERT A SPACE BR 25$ ; AND LOOK FOR MORE 30$: MOV R0,R3 ; RESTORE POINTER BR 2$ ; AND GO BACK AND DO AGAIN 40$: SUB #INBUF,R3 ; GET SIZE IN R3 MOV R3,R1 ; AND STORE RETURN ; END OF ROUTINE .END FRAG