.TITLE SRDSRT-SORT THE DIRECTRY ; ;**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$ ; ;LOCAL MACRO ; .MACRO C$MP ARG CMP ARG(R3),ARG(R4) ;SEE WHICH IS BIGGER BHI EXCHNG ;IF HI EXCHANGE POINTERS BLO CONTINUE ;IF LOW CONTINUE .ENDM ; .MACRO C$MP2 ARG CMP ARG(R3),ARG(R4) ;SEE WHICH IS BIGGER BHI CONTINUE ;IF HI -CONTINUE - THIS IS DESCENDING BLO EXCHNG ;IF LO EXCHANGE POINTERS .ENDM KEYADD: .WORD 0 TMASK: .WORD 0 DFLT: .BYTE 1 .BYTE 2 .BYTE 3 .EVEN CNTBUF: .BYTE 4 ;SORT KEY TO SORT ON COUNT .EVEN SRDSRT:: ;1ST COMPRESS DIRECTORY COPY MOV F.BKDS+2(R0),R1 ;POINT AT END OF BUFFER CLR (R1) ; NEXT ENTRY AFTER DIRECTORY IS "FREE";RVT 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 BLOS COUNT ; 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 .PAGE .ENABL LSB ; AT THIS POINT, THE DIRECTORY IS DENSE, AND ; R1=LOGICAL END OF DIRECTORY ; R2=FIRST ENTRY ; ; NOW WE SORT THE ENTRIES ; COUNT: MOV #KEYTB,KEYADD ;USE SORT KEYS CREATED BIT #SRSW,SWMS1$ ;SORT?? BNE 5$ ; YES BRANCH BIT #,SWMS1$ ;IS A SORT NEEDED? BNE 1$ ; YES SORT IT ANYWAY JMP WBACK ; NO BRANCH ; SINCE USER WANTS NO SORTING BUT NEEDS A SORT BECAUSE OF OV OR NV SWITCHES ; A COUNTER IS INSERTED INTO BUFFER ENTRIES. A SECOND SORT WILL BE DONE ; ON THIS COUNTER IN ORDER FOR DATA TO APPEAR IN ORIG. ORDER. 1$: MOV R2,R4 ;COPY START OF DIRECTORY ADD #4,R4 ;POINT TO 3RD WORD OF ENTRY CLR R5 ;USE R5 AS COUNTER 3$: INC R5 ;BUMP COUNTER MOV R5,(R4) ;INSERT COUNTER ADD #D.SIZ,R4 ;POINT TO NEXT ENTRY CMP R1,R4 ;WATCH FOR END BPL 3$ ;LOOP UNTIL ALL ENTRIES DONE BIC #CNTSW,SWMS1$ ;BE SURE DON'T SORT ON COUNT THIS TIME BR 8$ 5$: BIT #,SWMS1$ ;USING OV OR NV? BEQ 9$ ;NO BRANCH 8$: MOV #DFLT,KEYADD ;USE DEFAULT SORT ORDER FOR THIS 1ST SORT MOV SWMS1$,TMASK ;TEMPORARILY CLEAR SWMS1 MASK CLR SWMS1$ ;TO INSURE ASCENDING SORT BR 10$ ; GO SORT 9$: BIT #CNTSW,SWMS1$ ;DO WE WANT TO SORT ON COUNT? BEQ 10$ ; NO MOV #CNTBUF,KEYADD ; YES INSERT 4 AS SORT ORDER 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 MOV KEYADD,R5 22$: CMPB #1,(R5) ;CHECK KEYTB TO SEE WHAT TO SORT ON BEQ 30$ CMPB #2,(R5) BEQ 32$ CMPB #3,(R5) BEQ 34$ CMPB #4,(R5) BEQ 38$ 30$: BIT #DNSW,SWMS1$ ;COMPARING FILENAMES BNE 31$ ;IF DESCENDING BRANCH C$MP D.FNAM C$MP D.FNAM+2 C$MP D.FNAM+4 BR 37$ ;EQUAL FILENAMES TRY NEXT SORT LEVEL 31$: C$MP2 D.FNAM ;DESCENDING FILENAMES C$MP2 D.FNAM+2 C$MP2 D.FNAM+4 BR 37$ ;EQUAL FILENAMES TRY NEXT SORT KEY 32$: BIT #DTSW,SWMS1$ ;COMPARING FILE TYPES BNE 33$ ;IF DESCENDING BRANCH C$MP D.TYP BR 37$ ;EQUAL TYPES TRY NEXT SORT KEY 33$: C$MP2 D.TYP ;DESCENDING FILE TYPES BR 37$ ;EQUAL TYPES TRY NEXT SORT KEY 34$: BIT #DVSW,SWMS1$ ;COMPARING VERSIONS BNE 35$ ; IF DESCENDING BRANCH C$MP D.VER BR 37$ ;EQUAL VERSIONS TRY NEXT SORT KEY 35$: C$MP2 D.VER ;DESCENDING VERSIONS 37$: INC R5 ;LOOK AT NEXT SORT KEY BR 22$ 38$: CMP 4(R3),4(R4) ;SORTING BY ASCENDING COUNT NUMBERS BLO 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 ; TST SWMS1$ ;DID WE CLEAR THE MASK? BNE WBACK MOV TMASK,SWMS1$ ;RESTORE IT BIT #SRSW,SWMS1$ ;IS THIS SPECIAL CASE OF -SR ? BNE WBACK ;NO BRANCH BIS #CNTSW,SWMS1$ ;SET SWITCH TO SORT ON COUNT NEXT TIME WBACK: MOV #WBTRY,R4 ; RE-TRY LOOP COUNT CLR R5 TSTB SWMSK$ ;WRITE-BACK REQUESTED? BPL 90$ ;BR IF NO CMPB #IE.EOF,F.ERR(R0) ; GOT ENTIRE DIRECTORY?? BEQ 65$ ; YES ; DIAG WBCAN RETURN ; 65$: CLR R5 MOV #1,F.EFBK+2(R0) ;RESET END-OF-FILE 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 WAIT$ R0 ; WAIT FOR COMPLETION BCS 85$ 75$: ADD #512.,F.BKDS+2(R0) ;ADJ. BUFFER TO NEXT BLK CMP F.BKDS+2(R0),R1 ;SEE IF WE'RE PAST END OF DATA BLO 70$ ; CHECK FOR ERROR & RETRY IF NEEDED TST R5 BEQ 80$ ; NO ERRORS THIS TIME SOB R4,65$ 80$: CALLR .CLOSE ;CLOSE THE UFD 85$: DIAG WBERR INC R5 BR 75$ 90$: CMPB #IE.EOF,F.ERR(R0) ; DONE WITH DIRECTORY ?? BEQ 80$ ; YES--CLOSE IT RETURN ; .END