; 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<A_8.+B>,D1
TCRT
ENDM
; OFFSETS FROM A3 FOR PARAMETERS PASSED FROM BASIC
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 <ERROR WHILE READING MFD OR UFD IN DIR.SBR>
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