; DIR.SBR ; VERSION 2.0 - 06/18/85 - COMPLETE REWRITE. D. EICHBAUER ; ; RETURNS AN ARRAY FILLED WITH FILENAMES FROM SPECIFIED DEVICE/PPN ; ; PROPRIETARY PROGRAM MATERIAL ; ; THIS MATERIAL IS THE PROPERTY OF DALE A. EICHBAUER, ; 692 E. FREELAND ROAD, MERRILL, MICHIGAN, 48637. PERMISSION ; TO COPY & USE IS GRANTED FOR NON-PROFIT USES ONLY. ; ; ; ; --------------2 OR 3 ARGUMENTS ARE PASSED------------------------- ; THE FIRST ARGUMENT IS THE DEVICE NAME FOLLOWED BY THE PPN ; FOR THE DIRECTORY OF FILES ; THE SECOND ARGUMENT IS THE ARRAY TO FILL WITH FILENAMES ; THE THIRD (OPTIONAL) ARGUMENT IS THE FILENAME TO MATCH. ; IF NOT SUPPLIED, THEN ALL MATCH. STILL WILL PASS ALL 9 BACK. ; ; Be sure to LNKLIT after M68'ing the file ; ; Array of Directory is passed back as 9 characters. ; 6 as filename, 3 as file extension. "Dot" is not passed. ; See DIR.BAS for usage sample ; SEARCH SYS SEARCH SYSSYM AUTOEXTERN OBJNAM DIR.SBR VMAJOR=1. VMINOR=0. VSUB=0. VEDIT=100. VEDIT=101. ; test for :80 under 1.3 VWHO=1. VWHO=2. ; James A. Jarboe IV DEFINE XY A,B ; A CURSOR POSITIONING MACRO MOV #^D,D1 TCRT ENDM ; OFFSETS FROM A3 FOR PARAMETERS PASSED FROM BASIC PARMS=0 TYPE.1=2 ADD.1=4 SIZE.1=10 TYPE.2=14 ADD.2=16 SIZE.2=22 TYPE.3=26 ADD.3=30 SIZE.3=34 PATTERN.X = 0 DDB.X = 12 BUF.X = 162 PHDR -1,PV$RPD,PH$REE!PH$REU BR START ASCII / COPYRIGHT (C) 1984, 1985 DALE A. EICHBAUER / EVEN START: CLEAR PATTERN.X(A4),1156 ; CLEAR THE PATTERN, DDB & BUFFER CMPW PARMS(A3),#3 ; SEE IF 3 PARAMETERS PASSED BNE 20$ MOV ADD.3(A3),A1 ; GET ADDRESS FOR STRING MOV #6,D0 LEA A2,PATTERN.X(A4) ; POINT TO OUR HOLDING AREA CLR D1 10$: TSTB @A1 ; SEE IF END OF STRING BEQ 40$ CMPB (A1),#'. ; SEE IF PERIOD (SHORT FILENAME) BEQ 15$ ; IF SO, DONE WITH FILENAME, NOW FILL MOVB (A1)+,D1 ; GET A CHARACTER UCS ; MAKE SURE IT'S UPPER CASE IF ALPHA MOVB D1,(A2)+ ; NOW PUT IT INTO THE PATTERN SOB D0,10$ BR 20$ 15$: MOVB #' ,(A2)+ ; SPACE FILL SOB D0,15$ BR 30$ ; WE'VE ALREADY FOUND PERIOD 20$: MOV #3,D0 ; SET LOOP FOR SPACE FILL TSTB @A1 ; ARE WE DONE? BEQ 40$ 30$: CMPB (A1)+,#'. ; BYPASS PERIOD IF THERE JNE EXIT ; IF NOT, BAD FILENAME MOV #3,D0 ; NOW THE EXTENSION 35$: TSTB @A1 ; SEE IF END BEQ 40$ MOVB (A1)+,D1 ; GET THE EXTENSION CHARACTER UCS ; COVERT ALL ALPHABETICS TO UPPER CASE MOVB D1,(A2)+ ; AND PUT IT INTO PATTERN SOB D0,35$ 40$: TST D0 ; SEE IF WE SHOULD SPACE FILL BEQ 50$ ; GO AROUND IF NOT 45$: MOVB #' ,(A2)+ SOB D0,45$ 50$: LEA A0,DDB.X(A4) ; POINT TO OUR DDB LEA A2,BUF.X(A4) ; GET ADDRESS FOR BUFFER MOV A2,D.BUF(A0) ; AND PUT IT INTO DDB BUFFER ADDRESS MOVW #41400,@A0 ; SET DDB FLAGS MOV ADD.1(A3),A2 ; GET THE FILESPEC ADDRESS FSPEC DDB.X(A4) ; AND USE IT FOR THE DDB MOV #1000,D.SIZ(A0) ; SET THE RECORD SIZE TO 512 CLR D.IDX(A0) ; CLEAR THE BUFFER INDEX CLR D.DVR(A0) ; MAKE SURE SYSTEM LOADS DRIVER MOV #1,D.REC(A0) ; READ THE FIRST MFD RECORD MFD.READ: READ DDB.X(A4) JNE BADIO ; ON ERROR, POP BACK TO BASIC MOV #77,D0 ; LOOP THROUGH 63 ENTRIES LEA A2,BUF.X(A4) ; POINT TO THE BUFFER MFD.LOOP: CMMW @A2,D.PPN(A0) ; SEE IF THE PPNS MATCH JEQ MATCH.UFD ; IF SO, FOUND UFD ADD #10,A2 ; IF NOT, POINT TO NEXT SOB D0,MFD.LOOP ; AND BRANCH BACK IF POSSIBLE TSTW 2(A2) ; CHECK MF.NXT FOR ADDITIONAL JEQ BADIO ; IF NOT THERE, ERROR EXIT CLR D0 MOVW 2(A2),D0 ; GET NEXT MFD RECORD # MOV D0,D.REC(A0) ; AND PUT IT INTO THE RECORD # IN DDB CLR D.IDX(A0) ; AND ALSO SET THE INDEX BACK TO ZERO BR MFD.READ ; AND FINALLY LOOP BACK FOR MORE MATCH.UFD: TSTW 2(A2) ; CHECK UFD WITH FILES IN IT JEQ EXIT ; IF EMPTY, EXIT CLR D0 MOVW 2(A2),D0 ; GET FIRST UFD RECORD # MOV ADD.2(A3),A2 ; USE A2 NOW TO INDEX ARRAY UFD.READ: PUSH A2 MOV D0,D.REC+DDB.X(A4) ; AND PUT IT INTO THE RECORD # IN DDB CLR D.IDX+DDB.X(A4) ; AND ALSO SET THE INDEX BACK TO ZERO READ DDB.X(A4) BEQ 10$ ; GO AROUND IF OK POP ; ELSE CLEAR STACK FIRST ON ERROR JMP BADIO ; THEN POP BACK TO BASIC 10$: MOV #52,D0 ; LOOP THROUGH 42 ENTRIES LEA A1,BUF.X(A4) ; POINT TO THE BUFFER ADD #2,A1 ; POINT PAST LINK WORD POP A2 ; RECOVER INDEX POINTER UFD.LOOP: ; CMPW @A1,#17777 ; CHECK FOR DELETED FILE CMPW @A1,#177777 ; [101] full word to bypass deleted file BEQ UFD.SKIP TSTW @A1 JEQ EXIT ; IF ZERO, END OF UFD PUSH A2 UNPACK ; UNPACK THE FIRST TRIPLET UNPACK ; AND THE SECOND TRIPLET UNPACK ; AND THE EXTENSION TRIPLET ADD #6,A1 ; NOW GO AROUND REST OF ENTRY IN UFD CMPW PARMS(A3),#3 ; SEE IF OPTIONAL THIRD PARAMETER BNE OK ; IF NOT, NO FURTHER CHECKING DONE POP A2 ; POINT TO FIRST CHARACTER AGAIN PUSH A2 LEA A0,PATTERN.X(A4) ; POINT TO OUR STRING TO CHECK MOV #6,D1 ; CHECK UP TO 6 CHARACTERS FOR FILENAME F.LOOP: CMPB @A0,#'? ; CHECK FOR WILDCARD (1 CHARACTER) BEQ WILD1 ; IF SO, ALL FIRST CHARACTERS MATCH CMPB @A0,#'* ; CHECK FOR GLOBAL WILDCARD BEQ EXT ; IF SO, ALL DONE WITH FILENAME CMMB @A2,@A0 ; SEE IF CHARACTER MATCHES BNE BLANKS ; IF NOT, BLANK IT OUT WILD1: INC A2 ; POINT TO NEXT CHARACTER IN ARRAY INC A0 ; AND NEXT CHARACTER IN PATTERN SOB D1,F.LOOP ; AND LOOP BACK TILL DONE EXT: ADD D1,A2 ; IN CASE OF GLOBAL WILDCARD ADD D1,A0 ; SAME HERE MOV #3,D1 ; ONLY CHECKING 3 IN EXTENSION E.LOOP: CMPB @A0,#'? ; IS IT SINGLE CHARACTER WILDCARD? BEQ WILD2 ; IF SO, IGNORE THIS CHARACTER CMPB @A0,#'* ; OR HOW ABOUT GLOBAL WILDCARD BEQ OK ; THEN ALL DONE WITH CHECKING CMMB @A2,@A0 ; DOES THE CHARACTER MATCH? BNE BLANKS ; IF NOT, BAD MATCH WILD2: INC A2 ; POINT TO NEXT IN ARRAY INC A0 ; AND NEXT IN PATTERN SOB D1,E.LOOP ; AND LOOP BACK TILL EXTENSION DONE OK: ADD D1,A2 ; MAKE SURE A2 NOW POINTS TO NEXT ONE POP ; CLEAR STACK BR UFD.END BLANKS: MOV #9.,D1 ; CLEAR OUR NON-MATCH FROM ARRAY POP A2 ; GET ENTRY STARTING ADDRESS PUSH A2 10$: MOVB #' ,(A2)+ SOB D1,10$ POP A2 ; AND GET BACK TO BEGINNING OF LAST BR UFD.END UFD.SKIP: ADD #14,A1 ; GO AROUND ENTIRE UFD ENTRY UFD.END: MOV ADD.2(A3),A0 ; GET THE ADDRESS OF BEGINNING OF ARRAY ADD SIZE.2(A3),A0 ; ADD THE LENGTH OF ARRAY CMP A0,A2 ; SEE IF AT END JLE EXIT ; IF SO, THEN DONE DEC D0 ; DECREMENT OUR COUNTER JGT UFD.LOOP ; AND LOOP BACK TILL DONE LEA A1,BUF.X(A4) ; POINT BACK TO BEGINNING OF RECORD TSTW @A1 ; CHECK THE LINK JEQ EXIT ; IF ZERO, THEN DONE CLR D0 MOVW @A1,D0 ; GET THE LINK WORD JMP UFD.READ ; AND GO GET THE NEXT RECORD BADIO: XY 24,1 XY -1,9 XY -2,4 ; RED FOR COLOR TERMINALS TYPE XY -2,1 ; BACK TO WHITE TTYI BYTE 7,0 EVEN SLEEP #30000. ; WAIT 3 SECONDS EXIT: RTN ; BACK TO BASIC ASCII / COPYRIGHT (C) 1984, 1985 DALE A. EICHBAUER / EVEN END .