;      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

      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    <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

      END