.TITLE SRDSRT-SORT THE DIRECTRY .IDENT /V2.0/ ;3-JUN-76 ;+ ; ;**SRD--SORT DIRECTORY ; ;THIS MODULE SORTS AND COMPRESSES THE DIRECTORY ; ; ; THIS TASK WILL SORT A RSX11M DIRECTORY ;THEN CREATE A LISTING WITH MANY SELECTION OPTIONS ; ;THIS IS THE MAIN ROUTINE, AND IS PURE. ; ; Edits: ;No. Date By Reason ;--- --------- ----- ----------------------------------------------------- ;+02 01-Feb-79 HRT Fixed Write-back Bug so that /WB will work. ;+03 03-Apr-79 HRT Added R/O psects to made code more sharable. ;- ; ;SYSTEM MACRO CALLS ; .MCALL CALLR,FCSMC$ FCSMC$ ; ;LOCAL MACRO ; .MACRO C$MP ARG CMP ARG(R3),ARG(R4) ;SEE WHICH IS BIGGER BHI EXCHNG ;IF HI EXCHANGE POINTERS BLO CONTINUE ;I LO-CONINTUE .ENDM .sbttl Compress the directory .psect SRDSRT,I,RO,REL ; +03 SRDSRT::MOV F.BKDS+2(R0),R1 ; POINT AT END OF BUFFER MOV DIRBF$,R3 ; POINT AT TOP OF DIRECTORY MOV R3,R2 ; COPY THAT FOR SORT 40$: TST (R3) ; SEE IF OCCUPIED BNE 60$ ; BR IF YES 50$: SUB #D.SIZ,R1 ; BACK UP BOTTOM 1 ENTRY CMP R1,R3 ; HAVE WE MET COMPRESS POINTER BEQ SORT ; YES-GO SORT TST (R1) ; IS THIS SLOT OCCUPIED BEQ 50$ ; BR IF NO-LOOK SOME MORE MOV R1,R4 ; COPY ADDRESS OF BUSY SLOT MOV #,R5 ; SET DIRECTORY SIZE IN WORDS 55$: MOV (R4)+,(R3)+ ; FILL IN HOLE WITH SOB R5,55$ ; DO ENTIRE ENTRY CLR (R1) ; SHOW THIS ENTRY FREE BR 65$ ; R1=NEW LOGICAL END OF DIRECTORY 60$: ADD #D.SIZ,R3 ; INCREMENT TO NEXT 65$: CMP R3,R1 ; IS THIS THE END BLO 40$ ; BR IF NO .sbttl Sort the directory .ENABL LSB SORT: MOV R1,-(SP) ; +02 Get the total length of the SUB R2,(SP) ; +02 compressed directory ; AT THIS POINT, THE DIRECTORY IS DENSE, AND ; R1=LOGICAL END OF DIRECTORY ; R2=FIRST ENTRY ; ; NOW WE SORT THE ENTRIES 10$: MOV R2,R3 ; COPY ADDRESS OF CURRENT TOP MOV R3,R4 ; AGAIN 20$: ADD #D.SIZ,R4 ; POINT AT NEXT ITEM CMP R4,R1 ; WATCH FOR END BHIS 40$ ; BR WHEN ALL DONE TST SWMSK$ ; ORDER BY NAME? BMI 30$ ; BR IF YES C$MP D.TYP ; CK FOR FILE TYPE 30$: C$MP D.FNAM ; NOW FIRST PART OF NAME C$MP D.FNAM+2 ; SECOND PART C$MP D.FNAM+4 ; AND THIRD C$MP D.TYP ; DO TYPE INCASE WE'RE GOING BY NAME ; FALL THROUGH FOR NAME MATCH ; ... Now check for highest version ; CMP D.VER(R3),D.VER(R4) ; How do the versions compare? BHI CONTINUE ; HI - then don't swap EXCHNG: MOV R4,R3 ; Swap pointers CONTINUE: BR 20$ ; Go try again ; COME HERE AFTER A SCAN COMPLETE 40$: CMP R2,R3 ; MAKE SURE IT CHANGED BNE 45$ ; BR IF EXCHANGE REQUIRED ADD #D.SIZ,R2 BR 60$ 45$: MOV #8.,R4 ; SET LOOP COUNT 50$: MOV (R2),-(SP) ; PUSH 1 MOV (R3),(R2)+ ; COPY NEW OVER OLD MOV (SP)+,(R3)+ ; NOW PUT SOB R4,50$ ; 60$: CMP R2,R1 ; SEE IF DONE BLO 10$ ; BR IF MORE TO DO .DSABL LSB .SBTTL DIRECTORY IS SORTED, NOW WRITE BACK .enabl lsb CLR R2 ; +02 Set up for divide MOV (SP)+,R3 ; +02 Get length of compressed direct. DIV #512.,R2 ; +02 Divide by the block size TST R3 ; +02 Any remainder? BEQ 10$ ; +02 Eq - then skip additional block INC R2 ; +02 Else bump up count 10$: MOV R2,R3 ; +02 leave result in R3 BITB #WBSW,SWMSK$ ; WRITE-BACK REQUESTED? BEQ 80$ ; EQ - no, close file and return ;+02 Set the end-of-file marker to the last logical block ;+02 which is contained in R3. MOV R3,F.EFBK+2(R0) ; +02 RESET END-OF-FILE marker MOV DIRBF$,F.BKDS+2(R0) ; POINT I-O BUFFER TO TOP CLR -(SP) ; +02 Clear upper half CLR -(SP) ; +02 Reset VBN number MOV SP,R1 ; +02 Save pointer in R1 INC 2(R1) ; +02 Set initial block # ;+02 Now write the sorted directory back to disk. ;+02 R3 contains the count of how many disk blocks should be written ;+02 back to disk. 70$: WRITE$ R0,,,R1 ; WRITE OUT A BLOCK ADD #512.,F.BKDS+2(R0) ; +02 Point to next disk block. INC 2(R1) ; +02 Bump up VBN number SOB R3,70$ ; +02 loop till through. WAIT$ R0 ; +02 Insure that I/O is complete CMP (SP)+,(SP)+ ; +02 Clean the stack ; All through. Close input file and return 80$: CALLR .CLOSE ; CLOSE THE UFD .END