*
* LDIR: List directories
*
* Copyright 1983-2005 Dave Dunfield
* All rights reserved.
*
DIRLOC	EQU	0		STARTING DIRCTORY LOCATION
	ORG	OSRAM		DOS UTILITY SPACE
LDIR	CMPA	#'?'		IS IT '?' QUERY?
	BNE	QUAL		NO, LOOK FOR QUALIFIERS
	SSR	25		DISPLAY MESSAGE
	FCCZ	'Use: LDIR[/TOTAL] [<filespec>]'
	RTS
* PARSE FOR COMMAND QUALIFIERS
QUAL	LDA	,Y		GET CHAR FROM COMMAND LINE
	CMPA	#'/'		IS IT A QUALIFIER?
	BNE	MAIN		NO, CONTINUE WITH MAIN PROGRAM
	LEAX	QTABLE,PCR	POINT TO QUALIFIER TABLE
	SSR	18		LOOK IT UP
	CMPB	#QMAX		IS IT IN RANGE
	BHS	QERR		IF SO, IT'S INVALID
	LEAX	QFLAGS,PCR	POINT TO QUALIFIER FLAGS
	CLR	B,X		SET THE FLAG
	BRA	QUAL		LOOK FOR ANOTHER QUALIFIER
QERR	SSR	24		DISPLAY MESSAGE
	FCCZ	/Invalid qualifier: '/
	LDA	,Y+		GET CHARACTER
DSQU1	SSR	33		DISPLAY
	LDA	,Y+		GET NEXT CHAR
	BEQ	GOABO		NULL IS DELIMITER
	CMPA	#'/'		START OF ANOTHER QUALIFIER?
	BEQ	GOABO		IF SO, QUIT
	CMPA	#' '		SPACE?
	BEQ	GOABO		IF SO, QUIT
	CMPA	#$0D		END OF LINE?
	BNE	DSQU1		NO, KEEP DUMPING
GOABO	SSR	25		DISPLAY MESSAGE
	FCB	$27,0		CHARACTERS TO DISPLAY
	LDA	#1		INVALID OPERAND RETURN CODE
	LBRA	ABORT		GO HOME
* MAIN PROGRAM
MAIN	PSHS	Y
	LDY	#ALLFIL		ALL FILES
	SSR	9		CLEAR TO '*', GET DEFAULT DRIVE
	LDA	-1,X		GET DEFAULT DRIVE
	LDX	#DEFDIR		PT TO DEFAULT
	STA	,X		SAVE IT
	PULS	Y		RESTORE Y
	SSR	15		GET DIR NAME
	LDA	-9,X		GET ACTUAL DRIVE
	SSR	76		SELECT DRIVE
	SSR	5		ANY MORE?
	BEQ	ENAM		NO, THATS ALL
	LEAY	-1,Y		BACKUP
	CLR	,X		NOWILD
	LDB	#8		8 CHARS/NAME
SUP1	SSR	5		GET CHAR
	BEQ	ENAM		THATS ALL
	CMPA	#'.'		TYPE?
	BEQ	SUP2		GET TYPE
	DECB			BACKUP
	BMI	BADOP		INVALID
	STA	,X+		SAVE
	BRA	SUP1		CONTINUE
SUP2	LEAX	B,X		ADVANCE TO TYPE
	CLR	,X		NO WILDCARD
	LDB	#3		THREE CHARS
SUP3	SSR	5		GET CHAR
	BEQ	ENAM		END
	DECB			REDUCE
	BMI	BADOP		INVALID
	STA	,X+		SAVE
	BRA	SUP3		KEEP GOING
BADOP	SSR	25
	FCCZ	'Bad file pattern'
	LDA	#1
	SSR	0		QUIT
ENAM	LDX	#RAM+512	POINT TO RAM
CLR	CLR	,X+		CLEAR ONE BYTE
	CMPX	#RAM+4098	END OF RAM
	BLO	CLR		KEEP GOING
	LDD	#DIRLOC		GET DIECTORY SECTOR
RDNXT	STD	DIRSEC		SAVE DIRECTORY SECTOR WE ARE IN
	LDX	#RAM		POINT TO WORK AREA
	SSR	92		READ DISK
	LBNE	ABORT
TSTNAM	SSR	19		IS THIS A MATCH?
	BEQ	MATCH		IF SO, HANDLE IT
NXTFIL	LEAX	32,X		ADVANCE TO NEXT FILE ENTRY
	CMPX	#RAM+512	ARE WE OVER LIMIT
	BLO	TSTNAM		IF NOT, TRY THIS ONE
	LDD	DIRSEC		GET SECTOR WE ARE IN
	SSR	77		FIND LINK
	BNE	RDNXT		MORE SECTORS, TRY THEM TOO
DISDIR	LDA	TOTAL		TOTALS ONLY?
	BEQ	END2		IF SO, DON'T DISPLAY
	SSR	25		DISPLAY MESSAGE
	FCCZ	'Directories:'
	LDX	#RAM+512	POINT TO FREE SPACE
DSPLIN	SSR	22		NEW LINE
	LDB	#6		SIX NAMES/LINE
	STB	TEMP		SAVE IN TEMP SPACE
DSPNAM	TST	,X		GET CHARACTER FROM NAME
	BEQ	ENDIT		THATS IS LAST ONE
	LDB	#8		EIGHT CHARACTERS/NAME
DS8	LDA	,X+		GET CHARACTER FROM NAME
	BNE	NOSPA		NO SPACE NEEDED
	LDA	#' '		GET A SPACE
NOSPA	SSR	33		DISPLAY
	DECB			REDUCE	COUNT
	BNE	DS8		KEEP DISPLAYING
	SSR	21		SPACE
	SSR	21		SPACE
	DEC	TEMP		THIS IS THE END
	BNE	DSPNAM		KEEP GOING TILL WE DO ALL
	BRA	DSPLIN		KEEP GOING
ENDIT	LDA	TEMP		GET POSITION INDICATOR
	CMPA	#6		ARE WE AT BEGINNING
	BEQ	END1		YES, SKIP EXTRA CRLF
	SSR	22		NEW LINE
END1	SSR	22		NEW LINE
END2	SSR	24		DISPLAY MESSAGE
	FCCZ	'Total of '
	LDD	DTOTAL		GET TOTAL NUMBER OF DIRECTORIES
	SSR	26		DISPLAY NUMBER
	SSR	25		DISPLAY MESSAGE
	FCCZ	' directories.'
	CLRA			ZERO RETURN CODE
ABORT	SSR	0		BACK OFF
*
* NAMES MATCHED, INSERT INTO TABLE
*
MATCH	LDY	#RAM+512	POINT TO START OF TABLE
CMPN	PSHS	X,Y		SAVE REGISTERS
	TST	,Y		ARE WE AT END
	BEQ	INLST		IF SO, INSERT IT HERE
	LDB	#8		EIGHT CHARACTERS
CMP8	LDA	,X+		GET CHARACTER FROM OUR NAME
	CMPA	,Y+		TEST FOR SAME AS DEST
	BLO	INSMOV		IF DIFFERENT, THEN TRY HERE
	BNE	NOTSAM		THEY ARE DIFFERENT
	DECB			REDUCE COUNT
	BNE	CMP8		TRY AGAIN
	BRA	NXTONE		IGNORE IT, WE ALREADY HAVE IT
NOTSAM	PULS	X,Y		RESTORE REGISTERS
	LEAY	8,Y		ADVANCE TO NEXT
	BRA	CMPN		TRY AGAIN
INSMOV	LDY	2,S		GET OLD Y POINTER BACK
FNDEOF	LEAY	8,Y		ADVANCE TO NEXT NAME
	LDA	,Y		IS THIS THE END
	BNE	FNDEOF		KEEP LOOKING TILL WE FIND
	LEAY	8,Y		ADVANCE TO END OF FIELD
	LEAX	-8,Y		BACKUP TO LAST
MOVE	LDA	,-X		GET CHARACTER
	STA	,-Y		SAVE IN HIGHER MEMORY
	CMPX	2,S		ARE WE AT START YET
	BNE	MOVE		IF NOT, FORGET IT
	LDX	,S		RESTORE X REGISTER
	LDY	2,S		GET Y POINTER BACK
INLST	LDB	#8		MOVE EIGHT CHARACERS
MOV8	LDA	,X+		GET CHARACTER
	STA	,Y+		SAVE IN TABLE
	DECB			REDUCE COUNT
	BNE	MOV8		KEEP MOVEING
	LDD	DTOTAL		GET TOTAL COUNT
	ADDD	#1		INCREMENT COUNT
	STD	DTOTAL		RESAVE
NXTONE	PULS	X,Y		RESTORE REGISTERS
	LBRA	NXTFIL		TRY NEXT FILE IN DIRECTORY
* STRINGS
DEFDIR	FCB	0,'*',0,0,0,0,0,0,0
ALLFIL	FCC	'*.*'
	FCB	$0D
* QUALIFIER TABLE
QTABLE	FCB	$82
	FCC	'/TOTAL'	TOTAL NUMBER OF DIRECTORIES ONLY
	FCB	$80
QMAX	EQU	1		NUMBER OF QUALIFIERS
*
QFLAGS	EQU	*
TOTAL	FCB	$FF
* TEMP AND DEFINED STORAGE
DTOTAL	FDB	0		TOTAL COUNT OF DIRECTORIES
TEMP	RMB	1		A BYTE OF FREE STORAGE
DIRSEC	RMB	2		AND SOME MORE
RAM	EQU	*		FREE RAM
