A2osX/BIN/DU.S.txt
2023-10-18 07:41:12 +02:00

475 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
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 FILEs.hFD-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 hInclude
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