.TITLE SRDOPR-OPEN & READ .IDENT /4.0/ ; 1-SEP-1977 ;+ ; ;**SRD--SORT DIRECTORY ; ;THIS MODULE OPENS THE UFD AND READS IT INTO MEMORY ; ; ; THIS TASK WILL SORT A RSX11M DIRECTORY ;THEN CREATE A LISTING WITH SEVERAL SELECTION OPTIONS ; ;THIS IS THE MAIN ROUTINE, AND IS PURE. ; ; ;- ; ;SYSTEM MACRO CALLS ; .MCALL OFNB$,QIOW$S,EXRG$S SRDOPR::OFNB$ #UFDFDB ; OPEN THE DIRECTORY BCC 10$ ; THIS SHOULD WORK! CMPB #IE.PRI,F.ERR(R0) ; WAS ERROR A PRIVILEGE VIOLATION BEQ 5$ ; FERR OPNI ; 5$: FERR PRIV ; 10$: MOV F.FNB+N.FID(R0),SAVDID ; SAVE DIRECTORY ID MOV F.FNB+N.FID+2(R0),SAVDID+2 MOV F.FNB+N.DVNM(R0),SAVDVN ; ---AND DEVICE NAME MOV F.FNB+N.UNIT(R0),SAVUNM ; ALSO UNIT NUMBER MOV F.EFBK+2(R0),R1 ; GET LENGTH OF FILE TST F.FFBY(R0) ; END OF TOP OF BLOCK? BNE 20$ ; BR IF NO DEC R1 ; DONT COUNT EMPTY BLOCK 20$: SWAB R1 ; MULT BY 256 ASL R1 ; FIND SIZE OF BUFFER NEEDED IN BYTES MOV R1,R2 ; SAVE THAT FOR IO OPERATION BEQ 99$ ; BR ON ZERO LENGTH DIRECTORY MOV DIRBE$,R0 ; GET TOP OF EXISTING BUFFER SUB DIRBF$,R0 ; FIND SIZE OF EXISTING BUFFER BIC #^O77,R0 ; REDUCE BUFFER TO MODULO 64 BYTES SUB R0,R1 ; FIND HOW MUCH DIFERENT THEY ARE BEQ 40$ ; BR IF NO ADJUSTMENT NEEDED MOV R1,R0 ; COPY ACTUAL NUMBER OF BYTES TO ADJUST .REPT 6 ASR R0 ; CONVERT TO 64 BYTE BLOCK COUNT .ENDR EXRG$S R0 ; ASK FOR MORE OR LESS SPACE BCC 30$ ; BR IF REQUEST PURFORMED TST R1 ; WAS REQUEST TO GET SMALLER? BMI 40$ ; BR IF YES-THATS OK TO HAVE TOO MUCH BUFFER FERR 0 ; CANT SORT IF NOT ENOUGH BUFFER 30$: ADD R1,DIRBE$ ; ADJ END OF BUFFER 40$: QIOW$S #IO.RVB,#UFDLUN,#DSKEFN,,#IOSB$,, TSTB IOSB$ ; IO WORK? BPL 50$ ; BR IF YES FERR REDE ; FATAL ERROR READING DIRECTORY 50$: ADD DIRBF$,R2 ; FIND END OF DIRECTORY MOV R2,F.BKDS+2+UFDFDB ; SAVE THAT IN COMMON PLACE RETURN ; RETURN TO MAIN 99$: JMP LSTNX$ ; PROCEED TO NEXT DIRECTORY .END