.TITLE SRDSRT-SORT THE DIRECTRY .IDENT -6.0- ; 28-NOV-80 ;+ ; ; **SRD--SORT DIRECTORY ; ; THIS MODULE SORTS THE DIRECTORY ; ; ; DUKE001 -- 19-NOV-79,-5.0-, HENRY R. TUMBLIN ; MOVED COMPRESS INTO SRDSUB AS A SUBROUTINE ; ; THIS TASK WILL SORT A RSX11/IAS DIRECTORY ; THEN CREATE A LISTING WITH SEVERAL SELECTION OPTIONS ; ; ; ;- ; ; SYSTEM MACRO CALLS ; .MCALL CALLR,WRITE$,WAIT$,CLOSE$ ; ; 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::MOV F.BKDS+2+UFDFDB,R1 ; POINT AT END OF BUFFER MOV DIRBF$,R2 ; POINT AT TOP OF DIRECTORY CALL SRDCOM ; COMPRESS WHAT WE HAVE. .ENABL LSB ; AT THIS POINT, THE DIRECTORY IS DENSE, AND ; R1=LOGICAL END OF DIRECTORY ; R2=FIRST ENTRY ; ; NOW WE SORT THE ENTRIES ; 10$: BIT #SRSW,SWMS2$ ; SORT IT ??? BEQ 63$ ; NO 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 BIT #NASW,SWMSK$ ; ORDER BY NAME? BNE 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 ; ADVANCE TO NEXT ENTRY 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 CLR R5 BIT #WBSW,SWMS2$ ;WRITE-BACK REQUESTED? BEQ 90$ ;BR IF NO CMPB #IE.EOF,F.ERR+UFDFDB ; GOT ENTIRE DIRECTORY?? BEQ 65$ ; YES DIAG WBCAN RETURN 65$: CMP DIRBF$,R1 ; DOES THE DIRECTORY HAVE ANYTHING IN IT? BHIS 100$ ; NO -- DON'T WRITE. CLR R5 MOV #1,F.EFBK+2+UFDFDB ;RESET END-OF-FILE MOV DIRBF$,F.BKDS+2+UFDFDB ;POINT I-O BUFFER TO TOP MOV #1,F.VBN+2+UFDFDB ;AND ALSO VIRT. BLK NUMBER 70$: WRITE$ #UFDFDB ;WRITE OUT A BLOCK BCS 85$ ; ERROR WAIT$ #UFDFDB ; WAIT FOR COMPLETION BCS 85$ 75$: ADD #512.,F.BKDS+2+UFDFDB ;ADJ. BUFFER TO NEXT BLK CMP F.BKDS+2+UFDFDB,R1 ;SEE IF WE'RE PAST END OF DATA BLO 70$ ; CHECK FOR ERROR & RETRY IF NEEDED TST R5 BEQ 100$ ; NO ERRORS THIS TIME SOB R4,65$ BR 100$ ; Close UFD & return 85$: DIAG WBERR INC R5 BR 75$ 90$: CMPB #IE.EOF,F.ERR+UFDFDB ; DONE WITH DIRECTORY ?? BNE 110$ ; If NE no - just return ; 100$: CLOSE$ #UFDFDB ; Close the UFD ; 110$: MOV R1,F.BKDS+2+UFDFDB ; POINT AT END OF BUFFER RETURN ; and return .END