.TITLE SRDOPR-OPEN & READ ; ;**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 MANY SELECTION OPTIONS ; ;THIS IS THE MAIN ROUTINE, AND IS PURE. ; ; ; ;SYSTEM MACRO CALLS ; .MCALL OFNB$,READ$,WAIT$,FDOF$L FDOF$L ; SRDOPR:: MOV #UFDFDB,R0 TST F.BDB(R0) ; DIRECTORY ALREADY OPEN (FROM LAST PIECE)?? BNE 10$ ; YES MOVB #FO.RD!FA.SHR,F.FACC(R0) ;ASSUME ONLY READ ACCESS TSTB SWMSK$ ;DOES HE WANT IT WRITTEN BACK? BPL 5$ ;BR IF NO MOVB #FO.MFY,F.FACC(R0) ;REQUEST ACCESS OF FILE FOR MODIFY 5$: OFNB$ R0 ;OPEN THE DIRECTORY BCC 10$ ;THIS SHOULD WORK! CMPB #IE.PRI,F.ERR(R0) ; PRIV ERROR ??? BEQ 6$ FERR DOERR ; NO--SOME OTHER ERROR ; 6$: FERR DPRIV ; YES ; 10$: MOV DIRBF$,F.BKDS+2(R0) ;POINT AT START OF BUFFER CLR @DIRBF$ MOV F.EFBK+2(R0),R1 ; IS BUFFER LARGE ENOUGH ? SUB F.BKVB+2(R0),R1 INC R1 BEQ 15$ TST F.FFBY(R0) BNE 15$ DEC R1 15$: SWAB R1 ASL R1 ; R1 = DIRECTORY SIZE IN BYTES MOV DIRBE$,R2 ; R2 = # OF BYTES AVAILABLE SUB DIRBF$,R2 CMP R2,R1 BHI 20$ ; BR IF BUFFER IS LARGE ENOUGH ; ; ELSE WE NEED TO EXTEND THE TASK SUB R1,R2 ; R2 = NUMBER OF BYTES SHORT NEG R2 ADD #77+2,R2 ; ALLOW FOR AN EXTRA WORD AT END BIC #77,R2 MOV R2,R5 ASR R5 ; CONVERT TO # OF 64. BYTE BLOCKS ASR R5 ASR R5 ASR R5 ASR R5 ASR R5 EXTK$S R5 BCS 17$ ; EXTEND TASK DID NOT WORK ADD R2,DIRBE$ ; UPDATE IN-CORE BUFFER SIZE BR 20$ ; 17$: EXTK$S #010 ; TRY TO EXTEND 1 BLOCK BCS 20$ ; NOPE ADD #01000,DIRBE$ ; YUP 20$: READ$ R0 ;READ IT BCS 30$ ;BR IF ABNORMAL RETURN WAIT$ R0 BCS 30$ ; ADD #512.,F.BKDS+2(R0) ;ADVANCE I-O BUFFER PTR SUB #512.,R1 ; QUIT WHEN NO MORE DIRECTORY LEFT BEQ 40$ MOV F.BKDS+2(R0),R5 ;GET START OF BUFFER ADD #512.,R5 ;FIND END CMP R5,DIRBE$ ;ROOM? BLOS 20$ ; TRY TO EXTEND 1 BLOCK AT A TIME EXTK$S #010 BCS 28$ ; NOPE ADD #01000,DIRBE$ ; YUP BR 20$ 28$: RETURN ; OOPS--CAN ONLY READ IN PART OF THE DIRECTORY 30$: CMPB #IE.EOF,F.ERR(R0) ;END-OF FILE??? BEQ 40$ ;CONTINUE IF YES! FERR REDE ;READ ERROR OF INPUT FILE 40$: MOVB #IE.EOF,F.ERR(R0) RETURN .END