.PAGE 'LOOKUP-OPTSCH'
;OPTSCH  OPTIMAL SEARCH FOR LOOKUP
;  AND FNDFIL
.SKIP
OPTSCH LDA #0 ;DETERMINE OPTIMAL SEARCH
 STA TEMP ;INIT DRIVE MASK
 STA DRVFLG
 PHA
 LDX F2CNT
OS10 PLA
 ORA TEMP
 PHA
 LDA #1
 STA TEMP
 DEX
 BMI OS30
 LDA FILDAT,X
 BPL OS15
 ASL TEMP
 ASL TEMP
 .SKIP
OS15 LSR A
 BCC OS10
 ASL TEMP
 BNE OS10 ;(BRANCH)
 .SKIP
OS30 PLA
 TAX
 LDA SCHTBL-1,X
 PHA
 AND #3
 STA DRVCNT
 PLA
 ASL A
 BPL OS40
 LDA FILDAT
OS35 AND #1
 STA DRVNUM
;*RSR ADD FOR AUTO INIT
 LDA AUTOFG
 BNE OX0000
;
 JSR AUTOIT
 LDA DRVCNT
 BEQ OX0000
 LDA DRVNUM
 PHA ;SAVE DRVNUM
 EOR #1 ;FLIP DRVNUM
 STA DRVNUM
 JSR AUTOIT
 PLA ;RESTORE DRVNUM
 STA DRVNUM
;*
OX0000 JMP SETLDS
 .SKIP
OS40 ROL A
 JMP OS35
 .SKIP
SCHTBL .BYT 0,$80,$41
 .BYT 1,1,1,1
 .BYT $81,$81,$81,$81
 .BYT $42,$42,$42,$42
 .PAGE 'LOOKUP/FNDFIL'
; LOOK UP ALL FILES IN STREAM
;   AND FILL TABLES W/ INFO
 .SKIP
LOOKUP JSR OPTSCH
LK05 LDA #0
 STA DELIND
 JSR SRCHST ;START SEARCH
 BNE LK25
LK10 DEC DRVCNT
 BPL LK15
 RTS ;NO MORE DRIVE SEARCHES
LK15 LDA #1 ;TOGGLE DRIVE #
 STA DRVFLG
 JSR TOGDRV
 JSR SETLDS ; TURN ON LED
 BEQ LK05 ;(BRANCH)
 BNE LK05
LK20 JSR SEARCH ;FIND VALID FN
 BEQ LK30 ;END OF SEARCH
LK25 JSR COMPAR ;COMPARE DIR W/ TABLE
 LDA FOUND ;FOUND FLAG
 BEQ LK26 ;ALL FN'S NOT FOUND, YET
 RTS
.SKIP
LK26 LDA ENTFND
 BMI LK20
 BPL LK25
 .SKIP
LK30 LDA FOUND
 BEQ LK10
 RTS
 .SKIP 2
; FIND NEXT FILE NAME MATCHING
;  ANY FILE IN STREAM & RETURN
;  WITH ENTRY FOUND STUFFED INTO
;  TABLES
FFRE JSR SRRE ;FIND FILE RE-ENTRY
 BEQ FF10
 BNE FF25
 .SKIP
FF15 LDA #1
 STA DRVFLG
 JSR TOGDRV
 JSR SETLDS
 .SKIP
FFST LDA #0 ;FIND FILE START ENTRY
 STA DELIND
 JSR SRCHST
 BNE FF25
 STA FOUND
FF10 LDA FOUND
 BNE FF40
 DEC DRVCNT
 BPL FF15
 RTS
 .SKIP
FNDFIL JSR SEARCH ;FIND FILE CONTINUOUS...
 BEQ FF10 ;... RE-ENTRY, NO CHANNEL ACTIVITY
FF25 JSR COMPAR ;COMPARE FILE NAMES
 LDX ENTFND
 BPL FF30
 LDA FOUND
 BEQ FNDFIL
 BNE FF40
.SKIP
FF30 LDA TYPFLG
 BEQ FF40 ;NO TYPE RESTRICTION
 LDA FILDAT,X
 AND #$1E
 CMP TYPFLG
 BNE FNDFIL
FF40 RTS
 .PAGE 'LOOKUP-COMPAR'
;COMPARE ALL FILENAMES IN STREAM TABLE
;  WITH EACH VALID ENTRY IN THE 
;  DIRECTORY.  MATCHES ARE TABULATED
 .SKIP
COMPAR LDX #$FF
 STX ENTFND
 INX
 STX PATFLG
 JSR CMPCHK
 BEQ CP10
CP02 RTS ;ALL ARE FOUND
 .SKIP
CP05 JSR CC10
 BNE CP02
CP10 LDA DRVNUM
 EOR FILDAT,X
 LSR A
 BCC CP20 ;RIGHT DRIVE
 AND #$40
 BEQ CP05 ;NO DEFAULT
 LDA #2
 CMP DRVCNT
 BEQ CP05 ;DON'T USE DEFAULT
 .SKIP
CP20 LDA FILTBL,X ;GOOD DRIVE MATCH
 TAX
 JSR FNDLMT
 LDY #3
 JMP CP33
CP30
 LDA CMDBUF,X
 CMP (DIRBUF)Y
 BEQ CP32 ;CHARS ARE =
;
 CMP #'?
 BNE CP05 ;NO SINGLE PATTERN
 LDA (DIRBUF)Y
 CMP #$A0
 BEQ CP05 ;END OF FILENAME
CP32
 INX
 INY
CP33
 CPX LIMIT
 BCS CP34 ;END OF PATTERN
;
 LDA CMDBUF,X
 CMP #'*
 BEQ CP40 ;STAR MATCHES ALL
 BNE CP30 ;KEEP CHECKING
CP34
 CPY #19
 BCS CP40 ;END OF FILENAME
;
 LDA (DIRBUF)Y
 CMP #$A0
 BNE CP05
 .SKIP
CP40 LDX F2PTR ;FILENAMES MATCH
 STX ENTFND
 LDA FILTRK,X ;STORE INFO IN TABLES
 AND #$80
 STA PATFLG
 STA FILTRK,X
 LDA INDEX
 AND #$E0
 STA TEMP
 LDA SECTOR
 ORA TEMP
 STA FILENT,X
 LDY #0
 LDA (DIRBUF),Y
 INY
 PHA
 AND #$40
 STA TEMP
 PLA
 ASL A
 AND #$1E
 BCS CP42
 ORA #$20
CP42 ORA TEMP
 STA TEMP
 LDA #$80
 AND FILDAT,X
 ORA DRVNUM
 ORA TEMP
 STA FILDAT,X
 LDA (DIRBUF),Y
 ORA FILTRK,X
 STA FILTRK,X
 INY
 LDA (DIRBUF),Y
 STA FILSEC,X
 LDA REC
 BNE CP50
 LDY #21
 LDA (DIRBUF)Y
 STA REC
CP50
 ;JMP CMPCHK
 ;RTS
 .SKIP
;CHECK TABLE FOR UNFOUND FILES
 .SKIP
CMPCHK LDA #$FF
 STA FOUND
 LDA F2CNT
 STA F2PTR
 .SKIP
CC10 DEC F2PTR
 BPL CC15
 RTS ;TABLE EXHAUSTED
 .SKIP
CC15 LDX F2PTR
 LDA FILTRK,X
 BMI CC20
 BNE CC10
CC20 LDA #0
 STA FOUND
 RTS
 .PAGE 'LOOKUP-SEARCH'
;SEARCH DIRECTORY 
;  RETURNS WITH VALID ENTRY W/ DELIND=0
;  OR RETURNS W/ 1ST DELETED ENTRY
;  W/ DELIND=1 
;
;  SRCHST WILL INITIATE A SEARCH
;  SEARCH WILL CONTINUE A SEARCH
 .SKIP
SRCHST LDY #0 ;INIT DELETED SECTOR
 STY DELSEC
 DEY
 STY ENTFND
 .SKIP
 LDA #18 ;START SEARCH AT BEGINNING
 STA TRACK
 LDA #1
 STA SECTOR
 STA LSTBUF
 JSR OPNIRD ;OPEN INTERNAL READ CHNL
.SKIP
SR10 LDA LSTBUF ;LAST BUFFER IF 0
 BNE SR15
 RTS ;(Z=1)
 .SKIP
SR15 LDA #7
 STA FILCNT
 LDA #0 ;READ TRACK #
 JSR DRDBYT
 STA LSTBUF ;UPDATE END FLAG
 .SKIP
SR20 JSR GETPNT
 DEC FILCNT
 LDY #0
 LDA (DIRBUF),Y ;READ FILE TYPE
 BNE SR30
 .SKIP
 LDA DELSEC ;DELETED ENTRY FOUND
 BNE SEARCH ;DELETED ENTRY ALREADY FOUND
 JSR CURBLK ;GET CURRENT SECTOR
 LDA SECTOR
 STA DELSEC
 .SKIP
 LDA DIRBUF ;GET CURRENT INDEX
 LDX DELIND ;BIT1: WANT DELETED ENTRY
 STA DELIND
 BEQ SEARCH ;NEED VALID ENTRY
 RTS ;(Z=0)
 .SKIP
SR30 LDX #1
 CPX DELIND ;?LOOKING FOR DELETED?
 BNE SR50 ; NO!
 BEQ SEARCH
 .SKIP
SRRE LDA #18
 STA TRACK
 LDA DIRSEC
 STA SECTOR
 JSR OPNIRD
 LDA INDEX
 JSR SETPNT
 .SKIP
SEARCH LDA #$FF
 STA ENTFND
 LDA FILCNT ;ADJUST FILE COUNT
 BMI SR40
 LDA #32 ;INCR BY 32
 JSR INCPTR
 JMP SR20
 .SKIP
SR40 JSR NXTBUF ;NEW BUFFER
 JMP SR10 ;(BRANCH)
 .SKIP
SR50 LDA DIRBUF ;FOUND VALID ENTRY
 STA INDEX ;SAVE INDEX
 JSR CURBLK ;GET SECTOR
 LDA SECTOR
 STA DIRSEC
 RTS ;(Z=0)
 .SKIP
 .END
