-1,1 $BEGIN DIRFND,<28.P>, -34 ; RJDK 28-DEC-82 ; ADD PRO350 named directories. ; -50 .IF DF PRONAM .IFF -73 .ENDC .IFT ; GK001 MOV #4,N.DID(R1) ; START SEARCH WITH MFD ; GK001 MOV #4,N.DID+2(R1) ; ... ; GK001 CLR N.DID+4(R1) ; ... ; GK003 MOV (R2)+,R3 ; PICK UP SIZE OF DIRECTORY STRING ; GK001 MOV (R2),R2 ; PICK UP ADDRESS OF STRING ; GK001 DEC R3 ; COUNT FIRST CHARACTER ; GK001 BLE 15$ ; STRING MUST BE AT LEAST 1 CHAR! ; GK002 CMPB (R2)+,#'[ ; AND MUST START WITH BRACKET BNE 15$ ; ... ; GK002 CMPB (R2),#'] ; IS 2ND CHAR OF SPEC A BRACKET? BNE 20$ ; IF NE NO, DON'T GET DEFAULT ; GK001 10$: MOV @#.FSRPT,R2 ; Get FSR area pointer ADD #A.DFDR,R2 ; point to default directory area TST (R2) BGT 13$ ; -hurrah- a default string exists MOV R2,R3 ; sorry - got to create one ADD #4,R3 ; GDIR$S ,R3,#12.,R2 ; in FSR2 BCS 14$ MOV R3,2(R2) ; set address 13$: MOV (R2),R3 ; get length of default back MOV 2(R2),R2 ; and its address INC R2 DEC R3 ; account for "[" BR 20$ ; and now we have a named directory 14$: MOV (SP),R2 ; R2 from entry stack MOV (R2)+,R3 MOV (R2),R2 INC R2 DEC R3 MOV R3,-(SP) ; SAVE CHARACTER COUNT ; GK001 MOV R2,-(SP) ; SAVE R2 ; GK001 CLR -(SP) ; SET LAST 3 CHARS OF FNAME TO BLANKS ;BJL003 MOV @#.FSRPT,R3 ; POINT AT FILE STORAGE REGION ; GK001 MOV A.DFUI(R3),R3 ; PICK UP DEFAULT UIC ; GK001 BR 50$ ; AND GO CREATE A DIRECTORY NAME ; GK001 ; GK002 15$: JMP BADSYN ; COME HERE FOR SYNTAX ERRORS ; GK002 ; GK001 ; STACK CONTENTS AT THIS POINT: ; GK001 ; 00(SP) SAVED R2 ; GK001 ; 02(SP) SAVED R3 ; GK001 ; 04(SP) RETURN ADDRESS ; GK001 ; ; GK001 20$: MOV R1,R4 ; POINT R4 AT WHERE TO PUT RAD50 STRING ; GK001 ADD #N.FNAM,R4 ; ... ; GK001 CLR 2(R4) ; CLEAR 2ND & 3RD WDS OF NAME (..SCR5 ; GK001 CLR 4(R4) ; ..CLEARS THE FIRST ALWAYS) ; GK001 MOV #DIRTYP,N.FTYP(R1) ; SET FILE TYPE TO ".DIR" ; GK002 MOV R0,-(SP) ; SAVE SOME REGISTERS ; GK001 MOV R1,-(SP) ; ... ; GK001 CLR -(SP) ; THIS WILL BE CHARACTER COUNT ; GK001 MOV PC,-(SP) ; PUT ADDR OF ..SCR5 ON STACK ; GK001 ADD #..SCR5-.,(SP) ; ... ; GK001 ; GK001 ; STACK CONTENTS AT THIS POINT: ; GK001 ; 00(SP) CO-ROUTINE ADDRESS IN ..SCR5 ; GK001 ; 02(SP) COUNT OF CHARACTERS CHANGED TO RAD50 ; GK001 ; 04(SP) SAVED R1 (FNB POINTER) ; GK001 ; 06(SP) SAVED R0 (FDB POINTER) ; GK001 ; 10(SP) SAVED R2 (DIRECTORY DESCRIPTOR POINTER) ; GK001 ; 12(SP) SAVED R3 ; GK001 ; 14(SP) RETURN ADDRESS ; GK001 ; ; GK001 30$: DEC R3 ; COUNT NEXT CHAR ; GK001 BLE 100$ ; IF LE, NO MORE - ERROR ; GK001 MOVB (R2)+,R5 ; PICK UP NEXT CHARACTER ; GK001 CALL @(SP)+ ; CONVERT & STORE IT IN N.FNAM ; GK001 BCS 110$ ; BRANCH IF ERROR ; GK001 CMPB (R2),#'] ; HAVE WE HIT END OF STRING? ; GK001 BEQ 60$ ; IF EQ YES ; GK001 CMPB (R2),#'. ; NO, HAVE WE HIT END OF SUBSTR? ; GK001 BEQ 100$ ; ONLY ONE LEVEL ALLOWED ;BJL002 CMPB (R2),#', ; NO, DOES THIS TURN OUT TO BE X,Y FMT? ; GK001 BEQ 40$ ; IF EQ YES ; GK001 INC 2(SP) ; COUNT CHARACTERS CONVERTED SO FAR ; GK001 CMP #9.,2(SP) ; TOO MANY? ; GK001 BLE 100$ ; IF LE YES, ERROR ; GK001 BR 30$ ; NO, CONTINUE CONVERSION ; GK001 ; GK001 40$: MOV 10(SP),R2 ; RECOVER DIRECTORY DESCRIPTOR PTR ; GK001 CMP (SP)+,(SP)+ ; POP UNNEEDED GARBAGE FROM STACK ; GK001 MOV (SP)+,R1 ; RECOVER REGISTERS SAVED DURING LOOP ; GK001 MOV (SP),R0 ; ... ; GK001 MOV SP,R3 ; POINT R3 AT A SCRATCH WORD ; GK001 CALL .ASCPP ; CONVERT ASCII DIRECTORY TO PPN ; GK001 BCS 120$ ; IF CS, SYNTAX IS BAD ; GK001 MOV (SP),R3 ; PICK UP CONVERTED PPN IN R3 ; GK001 CLR (SP) ; CLEAR COUNT OF CHARS LEFT ; GK001 CLR -(SP) ; CLEAR PTR TO DIRECTORY POS ; GK001 CLR -(SP) ; SET LAST 3 CHARS OF NAME TO NULL ; GK001 ; GK001 ; STACK CONTENTS AT THIS POINT: ; GK001 ; 00(SP) LAST 3 CHARS OF DIR NAME (RAD50) (" ") ; GK001 ; 02(SP) CHR PTR TO CURRENT POS IN DIRECTORY STRING (OR ZERO) ; GK001 ; 04(SP) NO. OF CHARACTERS LEFT IN DIRECTOYR STRING ; GK001 ; 06(SP) SAVED R2 (DIRECTORY DESCRIPTOR POINTER) ; GK001 ; 10(SP) SAVED R3 ; GK001 ; 12(SP) RETURN ADDRESS ; GK001 ; ; GK001 50$: MOV R1,R2 ; COPY FNB PTR ; GK001 ADD #N.FNAM+2,R2 ; POINT AT WHERE TO PUT PPN ; GK001 MOV #PP.ZER!PP.SEP,R4 ; SELECT FILL, NO SEPARATORS ; GK001 CALL .PPASC ; ... ; GK001 MOV #6,R3 ; LENGTH OF STRING TO CONVERT ; GK001 SUB R3,R2 ; RECOVER PTR TO START OF ASCII STRING ; GK001 MOV R2,R4 ; COPY IT TO GET OUTPUT PTR ; GK001 TST -(R4) ; POINT AT N.FNAM OF THE FDB ; GK001 CALL ..SGR5 ; CONVERT THE ASCII INTO RADIX 50 ; GK001 MOV (SP)+,(R4)+ ; SET LAST RAD50 WORD TO PROPER VALUE (0) ; GK001 MOV #DIRTYP,N.FTYP(R1) ; SET FILE TYPE TO ".DIR" ; GK002 BR 70$ ; GO TRY TO FIND THE DIRECTORY ; GK001 ; GK001 60$: CMP (SP)+,(SP)+ ; CLEAN GARBAGE OFF STACK ; GK001 MOV (SP)+,R1 ; RECOVER R1 ; GK001 MOV (SP)+,R0 ; RECOVER R0 ; GK001 ; GK002 65$: MOV R3,-(SP) ; SAVE CURRENT STRING DESCRIPTOR ; GK002 MOV R2,-(SP) ; ... ; GK001 ; GK001 ; STACK CONTENTS AT THIS POINT: ; GK001 ; 00(SP) CHR PTR TO CURRENT POS IN DIRECTORY STRING ; GK001 ; 02(SP) NO. OF CHARACTERS LEFT IN DIRECTORY STRING ; GK001 ; 04(SP) SAVED R2 (DIRECTORY DESCRIPTOR POINTER) ; GK001 ; 06(SP) SAVED R3 ; GK001 ; 10(SP) RETURN ADDRESS ; GK001 ; ; GK001 70$: MOV #1,N.FVER(R1) ; SET VERSION TO ";1" ; GK002 CALL ..FIND ; TRY TO FIND THIS DIRECTORY MOV (SP)+,R2 ; RECOVER STRING POINTERS ; GK001 MOV (SP)+,R3 ; ... ; GK001 BCS FNDERR ; BRANCH IF COULDN'T FIND DIRECTORY ; GK001 BEQ 90$ ; BRANCH IF THIS WAS LAST SEARCH ; GK001 DEC R3 ; COUNT NEXT CHARACTER ; GK001 BNE BADSYN ; NOT SINGLE-LEVEL SYNTAX ;BJL002 80$: CMPB (R2),#'] ; AT END, LAST CHAR MUST BE BRACKET ; GK001 BNE BADSYN ; IF NE, TOO BAD ; GK001 ; GK001 90$: CALLR ..MLD ; GO FINISH UP AND CLEAN UP FNB ; GK001 ; GK001 100$: TST (SP)+ ; CLEAN STACK ; GK001 ; GK001 110$: TST (SP)+ ; CLEAN STACK ; GK001 MOV (SP)+,R1 ; RESTORE REGISTERS ; GK001 MOV (SP)+,R0 ; ... ; GK001 BR BADSYN ; GK001 ; GK001 120$: TST (SP)+ ; CLEAN STACK ; GK001 -87 ; GK001 /