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