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
*--------------------------------------
                         .DUMMY
                         .OR ZPBIN
ZS.START
ZPPtr1                   .BS 2
ZPPtr2                   .BS 2
ZPFileName               .BS 2
ZPFileStat               .BS 2
ZPPW                     .BS 2
hLineBuf                 .BS 1
ZPLineBuf                .BS 2
bPass2                   .BS 1
bDirLevel                .BS 1
bIsTTY                   .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
                         stz bIsTTY
                         jsr CS.RUN.ISATTY

.1                       stz bDirLevel
                         >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

                         >PUSHW L.MSG.USAGE
                         >PUSHBI 0
                         >SYSCALL PrintF
                         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

                         >LDYAI 256
                         >SYSCALL GetMem
                         bcs .9
                         >STYA ZPLineBuf
                         stx hLineBuf
*--------------------------------------
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.G bPause
                         eor #$ff
                         sta (pData),y
                         bne .1

.3                       >LDA.G bPause
                         bne .1

                         jsr GetEntry            First entry
                         bcs .9

                         jsr FilterMatch         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 GetNextEntry       Next entry
                         bcc .1                 If there is one, go again

                         bit bPass2
                         bmi .9

                         jsr ResetSrcDir
                         bcs .99

                         dec bPass2
                         bra .1

.9                       >LDA.G bSummary
                         bne .91

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

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

                         jsr BasePath..         Prune pathname

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

.97                      >LDA.G bSummary
                         beq .98
                         inc bDirLevel
                         jsr CS.RUN.PrintDirSumm
                         jsr CS.RUN.PrintCwd
                         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

                         >LDA.G bAllFiles
                         beq .8

                         >PUSHW L.MSG.REG1
                         ldy #S.STAT.BLOCKS+3
                         ldx #4
.3                       lda (ZPFileStat),y
                         >PUSHA
                         dey
                         dex
                         bne .3     (4)
                         >PUSHBI 4
                         >SYSCALL PrintF
                         bcs .9
                         jsr CS.RUN.PrintCwd
                         >PUSHW L.MSG.REG2
                         >PUSHW ZPFileName  (2)
                         >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 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 EnterSubDirYA
                         bcs .9

.8                       clc
.9                       rts
*--------------------------------------
CS.RUN.PrintDirSumm      >LEA.G BlkCounters
                         >STYA ZPPtr1
                         lda bDirLevel
                         asl
                         asl
                         clc
                         adc ZPPtr1
                         sta ZPPtr1
                         lda #$00
                         adc ZPPtr1+1
                         sta ZPPtr1+1
                         >PUSHW L.MSG.DIRSUMM
                         ldy #$03
                         lda (ZPPtr1),y
                         >PUSHA
                         dey
                         lda (ZPPtr1),y
                         >PUSHA
                         dey
                         lda (ZPPtr1),y
                         >PUSHA
                         dey
                         lda (ZPPtr1),y
                         >PUSHA
                         >PUSHBI 4
                         >SYSCALL PrintF

                         ldy #$03
                         lda #$00
                         sta (ZPPtr1),y
                         dey
                         sta (ZPPtr1),y
                         dey
                         sta (ZPPtr1),y
                         dey
                         sta (ZPPtr1),y

                         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 bIsTTY
                         beq .9
                         lda #C.LF
                         >SYSCALL PutChar
.9                       rts
*--------------------------------------
CS.RUN.ISATTY           ldy #S.PS.hStdOut
                        lda (pPS),y
                        tax
                        lda hFDs-1,x
                        >SYSCALL GetMemPtr
                        >STYA ZPPtr1
                        lda (ZPPtr1)
                        beq .9
                        inc bIsTTY
.9                      rts
*--------------------------------------
CS.DOEVENT               sec
                         rts
*--------------------------------------
CS.QUIT                  jsr LeaveSubDir
                         bcc CS.QUIT
                         >LDA.G hFilter
                         beq .3
                         >SYSCALL FreeMem
.3                       >LDA.G hPW
                         beq .4
                         >SYSCALL FreeMem
.4                       lda hLineBuf
                         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           .AS "Usage : DU [-A] [-S] [filespec]\r\n"
                    .AS "   -A : Show all files (not only directories)\r\n"
                    .AZ "   -S : Show only summary\r\n"
MSG.REG1            .AZ "%5u  "
MSG.REG2            .AZ "%s"
MSG.CWD             .AZ "%s"
MSG.DIRSUMM         .AZ "%5u  "
MSG.BDEVEXT         .AZ "/%15s s%dd%d Blocks Used:%5D Total:%5D"
MSG.BDEV            .AZ "\e[32m%s/\e[0m"
*--------------------------------------
                    .DUMMY
                    .OR 0
DS.START
ArgCount            .BS 1
TIME.SysTime        .BS S.TIME
bPause              .BS 1
bSummary            .BS 1
bAllFiles           .BS 1
hPW                 .BS 1
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
