NEW
  AUTO 3,1
                .LIST OFF
                .OP 65C02
                .OR $2000
                .TF bin/du
*--------------------------------------
                .INB inc/macros.i
                .INB inc/a2osx.i
                .INB inc/kernel.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
X.RESET.SRC.DIR	.EQ 1
*--------------------------------------
                .DUMMY
                .OR ZPBIN
ZS.START
ZPPtr1          .BS 2
ZPPtr2          .BS 2
ZPFileName      .BS 2
ZPFileStat      .BS 2

bPass2          .BS 1

bDirLevel       .BS 1
bCRLF			.BS 1

bPause          .BS 1
bSummary        .BS 1
bAllFiles       .BS 1

ArgCount        .BS 1
ArgDir			.BS 1

hFilter			.BS 1

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.USAGE     .DA MSG.USAGE
L.MSG.REG1      .DA MSG.REG1
L.MSG.REG2      .DA MSG.REG2
L.MSG.DIRSUMM   .DA MSG.DIRSUMM
L.MSG.BDEV      .DA MSG.BDEV
L.MSG.BDEVEXT   .DA MSG.BDEVEXT
L.MSG.CWD       .DA MSG.CWD
J.CS.RUN.PRINT  .DA CS.RUN.PRINT.REG
                .DA CS.RUN.PRINT.DIR
                .DA CS.RUN.PRINT.CDEV
                .DA CS.RUN.PRINT.BDEV
                .DA CS.RUN.PRINT.CDEV
                .DA CS.RUN.PRINT.CDEV
                .DA CS.RUN.PRINT.CDEV
                .DA CS.RUN.PRINT.CDEV
                .DA 0
*--------------------------------------
CS.INIT         clc
                rts
*--------------------------------------
CS.RUN          jsr CS.RUN.SetCRLF

.1              inc ArgCount
				lda ArgCount
                >SYSCALL ArgV
                bcs .6

				>STYA ZPPtr1
                lda (ZPPtr1)
                cmp #'-'
                bne .4

				ldy #1
                lda (ZPPtr1),y
				beq .9

                ldy #OptionVars-OptionList-1

.2              cmp OptionList,y
                beq .3

				dey
                bpl .2

.9				>LDYA L.MSG.USAGE
				>SYSCALL PutS

				lda #E.SYN
				sec
.99				rts

.3              ldx OptionVars,y

				sec
				ror $0,x
                bra .1

.4              lda ArgDir
				bne .9

				lda ArgCount
				sta ArgDir
				
				>LDYA ZPPtr1
                jsr X.InitSrcDirYA
                bcc .1					scan for any other args
				
				rts
*--------------------------------------
.6              lda ArgDir		        do we have a Source dir ?
                bne .8

                ldy #S.PS.hCWD
                lda (pPS),y
                >SYSCALL GetMemPtr
                jsr X.InitSrcDirYA
                bcs .99

.8              >PUSHEA.G TIME.SysTime
                >SYSCALL Time
*--------------------------------------
CS.RUN.LOOP     stz bPass2

.1              ldy #S.PS.hStdIn
                lda (pPS),y
                >SYSCALL FEOF
                bcc .2
                rts                     I/O error

.2              tay
                bne .3                  no char

                >SYSCALL GetChar
                cmp #$03                Ctrl-C
                beq .99                 Abort....

                cmp #$13                Ctrl-S
                bne .3

                lda bPause
                eor #$ff
                sta bPause
                bne .1

.3              bit bPause
                bmi .1

                jsr X.GetEntry            First entry
                bcs .9

                jsr X.IncludeMatch      Filter filename
                bcs .8                  no match, skip....

                lda (ZPFileName)
                cmp #'.'
                beq .8

.4              ldy #S.STAT.MODE+1
                lda (ZPFileStat),y

                and #$70
                lsr
                lsr
                lsr
                tax
                jsr CS.RUN.PRINT.JMP
                bcs .99

.8              jsr X.GetNextEntry       Next entry
                bcc .1                 If there is one, go again

                bit bPass2
                bmi .9

                jsr X.ResetSrcDir
                bcs .99

                dec bPass2
                bra .1

.9              bit bSummary
                bmi .91

                jsr CS.RUN.PrintDirSumm
                jsr CS.RUN.PrintCwd
                jsr CS.RUN.NewLine

.91             dec bDirLevel
                jsr X.LeaveSubDir        "cd .."
                bcs .97                This means we are done

                jsr X.BasePath..         Prune pathname

                jsr X.GetNextEntry       Get next entry
                jmp CS.RUN.LOOP        Go again

.97				bit bSummary
                bpl .98

                inc bDirLevel
                jsr CS.RUN.PrintDirSumm
                jsr CS.RUN.PrintBaseDir
                jsr CS.RUN.NewLine

.98             lda #0
                sec
.99             rts
*--------------------------------------
CS.RUN.PRINT.JMP
                jmp (J.CS.RUN.PRINT,x)
*--------------------------------------
CS.RUN.PRINT.REG
				bit bPass2
				bmi .1

				clc
				rts

.1				ldx bDirLevel         X is loop ctr bDirLevel..0

.2              >LEA.G BlkCounters
				>STYA ZPPtr1
				ldy #S.STAT.BLOCKS+3  Read 32-bit number of blocks
				lda (ZPFileStat),y
				pha                   And push to stack
				dey
				lda (ZPFileStat),y
				pha
				dey
				lda (ZPFileStat),y
				pha
				dey
				lda (ZPFileStat),y
				pha
				txa                   Get loop counter
				asl                   x2
				asl                   x2 again
				tay
				pla                   Do 32-bit add
				clc
				adc (ZPPtr1),y        LSB
				sta (ZPPtr1),y
				pla
				iny
				adc (ZPPtr1),y
				sta (ZPPtr1),y
				pla
				iny
				adc (ZPPtr1),y
				sta (ZPPtr1),y
				pla
				iny
				adc (ZPPtr1),y        MSB
				sta (ZPPtr1),y
				dex                   Decrement loop counter
				cpx #$ff              Stop if -1
				bne .2

				bit bAllFiles
				bpl .8

				>PUSHW L.MSG.REG1
				ldy #S.STAT.BLOCKS+3
				ldx #4

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

                >PUSHBI 4
                >SYSCALL PrintF
                bcs .9

                jsr CS.RUN.PrintCwd
                >PUSHW L.MSG.REG2
                >PUSHW ZPFileName
                >PUSHBI 2
                >SYSCALL PrintF
                bcs .9

                jmp CS.RUN.NewLine

.8              clc
.9              rts
*--------------------------------------
CS.RUN.PRINT.DIR
				bit bPass2
                bmi .8

                lda (ZPFileName)
                cmp #'.'
                beq .8

                inc bDirLevel
                >LDYA ZPFileName
                jmp X.EnterSubDirYA

.8              clc
.9              rts
*--------------------------------------
CS.RUN.PRINT.CDEV
				clc
                rts
*--------------------------------------
CS.RUN.PRINT.BDEV
				bit bPass2
                bmi .8

                >PUSHW L.MSG.BDEVEXT
                >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

                jsr CS.RUN.NewLine
                bcs .9

                inc bDirLevel

                >LDYA ZPFileName
                jsr X.EnterSubDirYA
                bcs .9

.8              clc
.9              rts
*--------------------------------------
CS.RUN.PrintDirSumm
                >PUSHW L.MSG.DIRSUMM

                lda bDirLevel
                asl
                asl
				ora #3
                clc
                adc #BlkCounters
				tay

				ldx #3

.1				>PUSHB (pData),y
				lda #0
				sta (pData),y
				dey
				dex
				bpl .1

                >PUSHBI 4
                >SYSCALL PrintF

                rts
*--------------------------------------
CS.RUN.PrintBaseDir
				lda ArgDir
				beq .1

				>SYSCALL ArgV
				>SYSCALL PutS
				rts

.1				ldy #S.PS.hCWD
                lda (pPS),y
                >SYSCALL GetMemPtr
				>SYSCALL PutS
				rts
*--------------------------------------
CS.RUN.PrintCwd >PUSHW L.MSG.CWD
                ldy #hSrcBasePath
                lda (pData),y
                >SYSCALL GetMemPtr
                >PUSHYA
                >PUSHBI 2
                >SYSCALL PrintF
                rts
*--------------------------------------
CS.RUN.NewLine  lda #C.CR
                >SYSCALL PutChar
                lda bCRLF
                beq .9

                lda #C.LF
                >SYSCALL PutChar
.9              rts
*--------------------------------------
CS.RUN.SetCRLF	ldy #S.PS.hStdOut
				lda (pPS),y
				tax
				lda hFDs-1,x
				>SYSCALL GetMemPtr
				>STYA ZPPtr1
				lda (ZPPtr1)			#S.FD.T.REG ?
				beq .9					no CRLF if REG 

				inc bCRLF

.9				rts
*--------------------------------------
CS.DOEVENT      sec
                rts
*--------------------------------------
CS.QUIT        	jsr X.LeaveSubDir
				bcc CS.QUIT

				>LDA.G hFilter
				beq .8

				>SYSCALL FreeMem

.8             	clc
				rts
*--------------------------------------
                 .INB usr/src/shared/x.fileenum.s
*--------------------------------------
CS.END
*--------------------------------------
OptionList       .AS "SAsa"
OptionVars       .DA #bSummary,#bAllFiles,#bSummary,#bAllFiles
*--------------------------------------
MSG.USAGE       .CS "Usage : DU [-A] [-S] [filespec]\r\n"
                .CS "   -A : Show all files (not only directories)\r\n"
                .CZ "   -S : Show only summary\r\n"
MSG.REG1        .CZ "%5u  "
MSG.REG2        .CZ "%s"
MSG.CWD         .CZ "%s"
MSG.DIRSUMM     .CZ "%5u  "
MSG.BDEVEXT     .CZ "/%15s s%dd%d Blocks Used:%5D Total:%5D"
MSG.BDEV        .CZ "\e[32m%s/\e[0m"
*--------------------------------------
                 .DUMMY
                 .OR 0
DS.START
TIME.SysTime     .BS S.TIME
BlkCounters      .BS 64           		Array of 32 bit integers, size 16
                 .INB usr/src/shared/x.fileenum.g
DS.END           .ED
*--------------------------------------
MAN
SAVE usr/src/bin/du.s
ASM
