.TITLE SRDSRT-SORT THE DIRECTRY .IDENT /V5.0/ ; UPDATE AUDIT CONTROL-13 NOV 1979 12:09:38 ;**V5.0 ; EDIT # 0009 2 NOV 1979 15:22:46 DK1:[300,3]SRDSRT.MAC;13 ;**V5.0 ; PREVIOUS EDIT 2 NOV 1979 14:43:16 DK1:[300,3]SRDSRT.MAC;12 ;**V5.0 ;***** MODIFIED BY RAY VAN TASSLE 6 DEC 1978 ;**V5.0 ; TO FIX CORRUPTION ON WRITE-BACK AND LIST ;**V5.0 ;+ ;**-1 ; ;**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. ; ; ;- ; ;SYSTEM MACRO CALLS ; .MCALL CALLR,WRITE$,WAIT$ ;**V5.0 ; ;**-1 ;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 ; SRDSRT:: ;**V5.0 MOV F.BKDS+2(R0),R1 ;POINT AT END OF BUFFER ;**V5.0 CLR (R1) ; NEXT ENTRY AFTER DIRECTORY IS "FREE";RVT ;**V5.0 MOV DIRBF$,R3 ;POINT AT TOP OF DIRECTORY ;**-1 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 BLOS SORT ; YES-GO SORT ;**V5.0 TST (R1) ; IS THIS SLOT OCCUPIED ;**-1 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 .PAGE ;**V5.0 .ENABL LSB ;**-1 ; AT THIS POINT, THE DIRECTORY IS DENSE, AND ; R1=LOGICAL END OF DIRECTORY ; R2=FIRST ENTRY ; ; NOW WE SORT THE ENTRIES ; SORT: BIT #SRSW,SWMS1$ ; SORT IT ??? ;**V5.0 BEQ 63$ ; NO ;**V5.0 ;**V5.0 ;**V5.0 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) BHI CONTINUE EXCHNG: MOV R4,R3 CONTINUE: BR 20$ ; ; 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 ; ; DIRECTORY IS SORTED, NOW WRITE BACK ; 63$: MOV #WBTRY,R4 ; RE-TRY LOOP COUNT ;**V5.0 CLR R5 ;**V5.0 TSTB SWMSK$ ;WRITE-BACK REQUESTED? ;**V5.0 BPL 90$ ;BR IF NO ;**V5.0 CMPB #IE.EOF,F.ERR(R0) ; GOT ENTIRE DIRECTORY?? ;**V5.0 BEQ 65$ ; YES ;**V5.0 ;**V5.0 DIAG WBCAN ;**V5.0 RETURN ;**V5.0 ;**V5.0 65$: CLR R5 ;**V5.0 MOV #1,F.EFBK+2(R0) ;RESET END-OF-FILE ;**-2 MOV DIRBF$,F.BKDS+2(R0) ;POINT I-O BUFFER TO TOP MOV #1,F.VBN+2(R0) ;AND ALSO VIRT. BLK NUMBER 70$: WRITE$ R0 ;WRITE OUT A BLOCK BCS 85$ ; ERROR ;**V5.0 WAIT$ R0 ; WAIT FOR COMPLETION ;**V5.0 BCS 85$ ;**V5.0 ;**V5.0 75$: ADD #512.,F.BKDS+2(R0) ;ADJ. BUFFER TO NEXT BLK ;**V5.0 CMP F.BKDS+2(R0),R1 ;SEE IF WE'RE PAST END OF DATA ;**V5.0 BLO 70$ ;**V5.0 ;**V5.0 ; CHECK FOR ERROR & RETRY IF NEEDED ;**V5.0 TST R5 ;**V5.0 BEQ 80$ ; NO ERRORS THIS TIME ;**V5.0 SOB R4,65$ ;**V5.0 ;**V5.0 80$: CALLR .CLOSE ;CLOSE THE UFD ;**V5.0 ;**V5.0 ;**V5.0 85$: DIAG WBERR ;**V5.0 INC R5 ;**V5.0 BR 75$ ;**V5.0 ;**V5.0 90$: CMPB #IE.EOF,F.ERR(R0) ; DONE WITH DIRECTORY ?? ;**V5.0 BEQ 80$ ; YES--CLOSE IT ;**V5.0 RETURN ;**V5.0 ;**V5.0 .END ;**V5.0