NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF BIN/LS
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/MLI.I
				.INB INC/MLI.E.I
*--------------------------------------
X.ENTER.SUBDIR	.EQ 1
X.COPY.TO.DEST	.EQ 0
X.DELETE.SOURCE	.EQ 0
*--------------------------------------
MAX.COL			.EQ 4
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPPtr1			.BS 2
ZPPtr2			.BS 2
ZPFileName		.BS 2
ZPFileStat		.BS 2
ZPPW			.BS 2
ZS.END
				.ED
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA #0					S.PS.F.EVENT
				.DA #0
				.DA CS.END-CS.START		Code Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #64					Stack Size
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.MSG.DEVEXT	.DA MSG.DEVEXT
L.MSG.DIR		.DA MSG.DIR
L.MSG.ENTER		.DA MSG.ENTER
L.MSG.DIREXT	.DA MSG.DIREXT
L.MSG.FILE		.DA MSG.FILE
L.MSG.FILEEXT	.DA MSG.FILEEXT
L.MSG.CRLF		.DA MSG.CRLF
L.PRODOS.FT.TXT	.DA PRODOS.FT.TXT
L.FMT.Date		.DA FMT.Date
L.FMT.Time		.DA FMT.Time
L.FMT.int16		.DA FMT.int16
L.MSG.Users		.DA MSG.Users
L.MSG.Root		.DA MSG.Root
				.DA 0
*--------------------------------------
CS.INIT			clc
				rts
*--------------------------------------
CS.RUN
.1				>INC.G ArgCount
				>SYSCALL ArgV
				bcs .6
				>STYA ZPPtr1
				lda (ZPPtr1)
				cmp #'-'
				bne .4
				ldy #1
				lda (ZPPtr1),y
				
				ldx #OptionVars-OptionList-1
				
.2				cmp OptionList,x
				beq .3
				dex
				bpl .2
				
				lda #E.SYN
				sec
				rts
				
.3				ldy OptionVars,x
				lda #$80
				sta (pData),y
				bra .1

.4				>LDYA ZPPtr1
				jsr InitSrcDirYA
				bcc .1					scan for any other args
.9				rts

.6				>LDA.G index			do we have a Source dir ?
				bne .8

				ldy #S.PS.hCWD
				lda (pPs),y
				>SYSCALL GetMemPtr
				jsr InitSrcDirYA
				bcs .9
				
.8				>PUSHEA.G TIME.SysTime
				>SYSCALL time
				
				>LDYAI S.PW
				>SYSCALL getmem
				bcs .9
				>STYA ZPPW
				txa
				>STA.G hPW
*--------------------------------------
CS.RUN.LOOP		ldy #S.PS.hStdIn
				lda (pPS),y
				>SYSCALL feof
				bcs .99					I/O error
				tay
				bne .2					no char
				>SYSCALL GetChar
				cmp #$03				Ctrl-C
				bne .1					Abort....
				rts						CS
.1				cmp #$13				Ctrl-S
				bne .2

				>LDA.G bPause
				eor	#$ff
				sta (pData),y
				bne CS.RUN.LOOP
.2				>LDA.G bPause
				bne CS.RUN.LOOP
				jsr GetEntry
				bcs .9
				jsr FilterMatch
				bcs .8					no match, skip....
.4				ldy #S.STAT.P.DRIVE
				lda (ZPFileStat),y		ProDOS Device ?
				bne .5
				ldy #S.STAT.P.TYPE
				lda (ZPFileStat),y
				cmp #$0F				Directory ?
				bne .6

				jsr CS.RUN.PRINT.DIR
				bcs .99
				bra .8
.5				jsr CS.RUN.PRINT.DEV
				bcs .99
				bra .8

.6				jsr CS.RUN.PRINT.FILE
				bcs .99

.8				jsr GetNextEntry

				bcc .92

.9				ldy #bLong
				lda (pData),y
				bmi .91

				jsr CS.RUN.NewLine
				bcs .99

.91				jsr LeaveSubDir
				bcs .98

				jsr BasePath..
				jsr GetNextEntry
.92				jmp CS.RUN.LOOP
.98				lda #0
				sec
.99				rts
*--------------------------------------
CS.RUN.PRINT.DEV
				>LDA.G bLong
				bpl CS.RUN.PRINT.DIR

				>PUSHW L.MSG.DEVEXT
				>PUSHW ZPFileName
				
				ldy #S.STAT.P.SLOT
				>PUSHB (ZPFileStat),y
				iny						DRIVE
				>PUSHB (ZPFileStat),y

				ldy #S.STAT.BLOCKS+1
				>PUSHB (ZPFileStat),y
				dey
				>PUSHB (ZPFileStat),y

				ldy #S.STAT.P.DEVBLOCKS+1
				>PUSHB (ZPFileStat),y
				dey
				>PUSHB (ZPFileStat),y
				
				>PUSHBI 8

				>SYSCALL printf
				bcs .9

				ldy #bRecurse
				lda (pData),y
				bpl .8
				>LDYA ZPFileName
				jsr EnterSubDirYA
				bcs .9
				jmp CS.RUN.ENTER.MSG

.8				clc
.9				rts
*--------------------------------------
CS.RUN.PRINT.DIR
				>LDA.G bAllmostAll
				bmi .10
				lda (ZPFileName)
				cmp #'.'
				bne .10
				jmp .5

.10				>LDA.G bLong
				bmi .4

				>LDA.G bColumn
				bmi .23
				>LDA.G bFullPath
				bpl .22

				jsr CS.RUN.PRINT.SRCPATH

.23				>LDYA ZPFileName
				>SYSCALL puts
				bcs .9
				>LDA.G bRecurse
				bpl .8
				lda (ZPFileName)
				cmp #'.'
				beq .8
				>LDYA ZPFileName
				jmp EnterSubDirYA		
.8				clc
.9				rts

.22				>PUSHW L.MSG.DIR
				>PUSHW ZPFileName
				>PUSHBI 2
				>SYSCALL printf
				bcs .9

				ldy #0

.1				iny
				lda (ZPFileName),y
				bne .1

.11				iny
				cpy #19
				bcs .2

				lda #' '
				phy
				>SYSCALL PutChar
				ply
				bcc .11
				rts

.2				jsr CS.RUN.UpdateColCnt
				bcc .5
				rts
*--------------------------------------
.4				>PUSHW L.MSG.DIREXT
				
				jsr Mod2CSTR
				>PUSHEA.G MOD				File Mod
				jsr CS.RUN.PushGidUid
				jsr CS.RUN.PUSHDATES
				>PUSHW ZPFileName
				>PUSHBI 12
				>SYSCALL printf

				bcs .90
				
.5				>LDA.G bRecurse
				bpl .80
				lda (ZPFileName)
				cmp #'.'
				beq .80
				jsr CS.RUN.NewLine
				bcs .90
				>LDYA ZPFileName
				jsr EnterSubDirYA
				bcs .90
				jmp CS.RUN.ENTER.MSG
.80				clc
.90				rts
*--------------------------------------
CS.RUN.PRINT.FILE
				ldy #bLong
				lda (pData),y
				bmi .1
				>LDA.G bColumn
				bmi .23

				>LDA.G bFullPath
				bpl .22
				
				jsr CS.RUN.PRINT.SRCPATH
				
.23				>LDYA ZPFileName
				>SYSCALL puts
				rts

.22				>PUSHW L.MSG.FILE
				>PUSHW ZPFileName
				>PUSHBI 2
				>SYSCALL printf
				bcs .9
				jmp CS.RUN.UpdateColCnt
*--------------------------------------
.1				>PUSHW L.MSG.FILEEXT
				
				jsr Mod2CSTR
				>PUSHEA.G MOD			File Mod

				jsr CS.RUN.PushGidUid

				ldy #S.STAT.SIZE+3
				ldx #4

.2				lda (ZPFileStat),y
				>PUSHA
				dey
				dex
				bne .2

				jsr CS.RUN.PUSHDATES

				ldy #S.STAT.P.TYPE
				lda (ZPFileStat),y
				jsr FileType2PSTR
				>PUSHYA

				ldy #S.STAT.P.AUXTYPE+1
				lda (ZPFileStat),y
				>PUSHA
				dey
				lda (ZPFileStat),y
				>PUSHA

				>PUSHW ZPFileName

				>PUSHBI 20
				>SYSCALL printf

.9				rts
*--------------------------------------
CS.RUN.PRINT.SRCPATH
				ldy #hSrcBasePath
				lda (pData),y
				>SYSCALL GetMemPtr
				>PUSHYA
				>PUSHBI 0
				>SYSCALL printf
				rts
*--------------------------------------
CS.RUN.PushGidUid
				ldy #S.STAT.GID
				lda (ZPFileStat),y
				beq .1
				
				>LDYA L.MSG.Users
				bra .2
				
.1				>LDYA L.MSG.Root
								
.2				>PUSHYA

				ldy #S.STAT.UID
				lda (ZPFileStat),y
				>PUSHA
				>PUSHW ZPPW
				>SYSCALL GetPWUID
				bcs .3
				
				>PUSHW ZPPW
*				clc
				rts
				
.3				>PUSHEA.G UID
				>PUSHW L.FMT.int16
				
				ldy #S.STAT.UID+1
				lda (ZPFileStat),y
				>PUSHA
				dey
				lda (ZPFileStat),y
				>PUSHA
				>PUSHBI 2
				>SYSCALL sprintf
				
				>PUSHEA.G UID
				clc
				rts
*--------------------------------------
CS.RUN.PUSHDATES
				ldy #TIME.Mod-1			Set NODATE as default
				jsr CS.RUN.NODATES.INIT
				
				ldy #TIME.Create-1		Set NODATE as default
				jsr CS.RUN.NODATES.INIT
				
				ldy #S.STAT.MTIME+S.TIME.MONTH
				lda (ZPFileStat),y
				beq .1					Month=0.....invalid date/time

				>PUSHEA.G TIME.Mod
				
				lda ZPFileStat
				clc
				adc #S.STAT.MTIME
				tay
				lda ZPFileStat+1
				adc #0
				jsr CS.RUN.DATEFMT.SELECT
				>SYSCALL StrFTime

.1				ldy #S.STAT.CTIME+S.TIME.MONTH
				lda (ZPFileStat),y
				beq .2					Month=0.....invalid date/time

				>PUSHEA.G TIME.Create
				
				lda ZPFileStat
				clc
				adc #S.STAT.CTIME
				tay
				lda ZPFileStat+1
				adc #0
				jsr CS.RUN.DATEFMT.SELECT
				>SYSCALL StrFTime

.2				>PUSHEA.G TIME.Mod
				>PUSHEA.G TIME.Create
				rts
*--------------------------------------
CS.RUN.NODATES.INIT
				ldx #$ff

.1				inx
				iny
				lda MSG.NODATE,x
				sta (pData),y
				bne .1
				
				rts
*--------------------------------------
CS.RUN.DATEFMT.SELECT
				>STYA ZPPtr1

				ldy #S.TIME.CENTURY
				lda (ZPPtr1),y
				ldy #TIME.SysTime+S.TIME.CENTURY
				cmp (pData),y
				bne .9

				ldy #S.TIME.YEAR
				lda (ZPPtr1),y
				ldy #TIME.SysTime+S.TIME.YEAR
				cmp (pData),y
				bne .9

				ldy #S.TIME.MONTH
				lda (ZPPtr1),y
				ldy #TIME.SysTime+S.TIME.MONTH
				cmp (pData),y
				bne .9

				ldy #S.TIME.DAY
				lda (ZPPtr1),y
				ldy #TIME.SysTime+S.TIME.DAY
				cmp (pData),y
				bne .9
				
.8				>PUSHW L.FMT.Time
				>PUSHW ZPPtr1
				rts
				
.9				>PUSHW L.FMT.Date
				>PUSHW ZPPtr1
				rts
*--------------------------------------
CS.RUN.UpdateColCnt
				>INC.G ColCount
				cmp #MAX.COL
				bne CS.RUN.NewLine.8
	
				lda #0
				sta (pData),y
				bra CS.RUN.NewLine.1
*--------------------------------------
CS.RUN.NewLine	>LDA.G ColCount
				beq CS.RUN.NewLine.8
CS.RUN.NewLine.1
				>PUSHW L.MSG.CRLF
				>PUSHBI 0
				>SYSCALL printf
				rts
CS.RUN.NewLine.8
				clc
				rts
*--------------------------------------
CS.RUN.ENTER.MSG
				>PUSHW L.MSG.ENTER
				ldy #hSrcBasePath
				lda (pData),y
				>SYSCALL GetMemPtr
				>PUSHYA
				>PUSHBI 2
				
				>SYSCALL printf
				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.QUIT			jsr LeaveSubDir
				bcc CS.QUIT
				>LDA.G hFilter
				beq .3

				>SYSCALL FreeMem

.3				>LDA.G hPW
				beq .8
				
				>SYSCALL FreeMem
				
.8				clc
				rts
*--------------------------------------
FileType2PSTR	ldy #0
.1				cmp PRODOS.FT.HEX,y
				beq .8
				iny
				cpy #PRODOS.FT.TXT-PRODOS.FT.HEX
				bne .1
				pha
				lsr
				lsr
				lsr
				lsr
				ora #$30
				cmp #$3A
				bcc .2
				adc #6
.2				sta PRODOS.FT.DFLT+2
				pla
				and #$0F
				ora #$30
				cmp #$3A
				bcc .3
				adc #6
.3				sta PRODOS.FT.DFLT+3
.8				tya
				asl
				asl						CC
				adc L.PRODOS.FT.TXT
				tay
				lda L.PRODOS.FT.TXT+1
				adc #0
				rts
*--------------------------------------
Mod2CSTR		ldy #S.STAT.MODE+1
				lda (ZPFileStat),y
				lsr
				lsr
				lsr
				lsr
				tax
				lda TYPES,x
				>STA.G MOD
				ldx #0
				ldy #S.STAT.MODE
				lda (ZPFileStat),y

				ldy #MOD+1
.1				lsr
				pha
				lda #'-'
				bcc .2
				lda ACCESS,x
.2				sta (pData),y
				iny
				pla
				inx
				cpx #8
				bne .1
.3				ldy #S.STAT.MODE+1
				lda (ZPFileStat),y
				lsr
				lda #'-'
				bcc .4
				lda ACCESS,x
.4				>STA.G MOD+9

				rts
*--------------------------------------
				.INB USR/SRC/BIN/X.FILEENUM.S
*--------------------------------------
CS.END
*--------------------------------------
OptionList		.AS "ACFLRacflr"
OptionVars		.DA #bAllmostAll,#bColumn,#bFullPath,#bLong,#bRecurse,#bAllmostAll,#bColumn,#bFullPath,#bLong,#bRecurse
*--------------------------------------
MSG.DEVEXT		.AZ "/%15s S%dD%d Blocks Used:%5D Total:%5D\r\n"
MSG.DIR			.AZ "\e[32m%s/\e[0m"
MSG.ENTER		.AZ "Directory:%s\r\n"
MSG.DIREXT		.AZ "%s %6s %6s            %s %s  <dir>   \e[32m%s/\e[0m\r\n"
MSG.FILE		.AZ "%19s"
MSG.FILEEXT		.AS "%s %6s %6s %10u %s %s %S %H %s"
MSG.CRLF		.AZ "\r\n"
*--------------------------------------
PRODOS.FT.HEX	.HS 0406FAFCFDE2CBCCCFFF
PRODOS.FT.TXT	>PSTR "txt"
				>PSTR "bin"
				>PSTR "asm"
				>PSTR "bas"
				>PSTR "var"
				>PSTR "atk"
				>PSTR "pix"
				>PSTR "fon"
				>PSTR "pak"
				>PSTR "sys"
PRODOS.FT.DFLT	>PSTR "$  "
MSG.Users		.AZ "users"
MSG.Root		.AZ "root"
MSG.NODATE		.AZ "<no-date>"
FMT.Date		.AZ "%d-%b-%y"
FMT.Time		.AZ "%H:%M:%S "
FMT.int16		.AZ "%i"
TYPES			.AS "-dbclssp"
ACCESS			.AS "rwxrwxrwx"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
ArgCount		.BS 1

MOD				.BS 11					drwxrwxrwx0
TIME.Create		.BS 20
TIME.Mod		.BS 20
TIME.SysTime	.BS S.TIME
UID				.BS 6

bPause			.BS 1
bAllmostAll		.BS 1
bColumn			.BS 1
bFullPath		.BS 1
bLong			.BS 1
bRecurse		.BS 1

ColCount		.BS 1
hPW				.BS 1

				.INB USR/SRC/BIN/X.FILEENUM.G
DS.END
				.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/LS.S
ASM
