A2osX/BIN/LS.S.txt

881 lines
31 KiB
Plaintext
Raw Normal View History

NEW
2019-09-19 15:22:14 +00:00
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/ls
*--------------------------------------
.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
*--------------------------------------
MAX.COL .EQ 4
*--------------------------------------
.DUMMY
.OR ZPBIN
2018-12-19 16:45:09 +00:00
ZS.START
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPFileName .BS 2
ZPFileStat .BS 2
ZPLineBuf .BS 2
ZPPWBuf .BS 2
ArgCount .BS 1
ColCount .BS 1
bPass2 .BS 1
bPause .BS 1
bAllmostAll .BS 1
bColumn .BS 1
bFullPath .BS 1
bLong .BS 1
bRecurse .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
2015-06-03 18:30:57 +00:00
*--------------------------------------
* Relocation Table
2019-10-03 06:25:27 +00:00
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.USAGE .DA MSG.USAGE
L.MSG.REG .DA MSG.REG
L.MSG.REGEXT .DA MSG.REGEXT
L.MSG.DIR .DA MSG.DIR
L.MSG.DIREXT .DA MSG.DIREXT
L.MSG.BDEV .DA MSG.BDEV
L.MSG.BDEVEXT .DA MSG.BDEVEXT
L.MSG.ENTER .DA MSG.ENTER
L.PRODOS.FT.TXT .DA PRODOS.FT.TXT
L.FMT.Date .DA FMT.Date
L.FMT.Time .DA FMT.Time
L.FMT.string6 .DA FMT.string6
L.FMT.int16 .DA FMT.int16
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
2018-12-19 16:45:09 +00:00
*--------------------------------------
CS.RUN
stz bIsTTY
jsr CS.RUN.ISATTY
.1 inc ArgCount
lda ArgCount
>SYSCALL ArgV
bcs .6
2020-07-20 15:19:32 +00:00
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
2020-07-20 15:19:32 +00:00
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 $0,y
bra .1
.4 >LDYA ZPPtr1
jsr InitSrcDirYA
bcc .1 scan for any other args
.9 rts
2019-10-03 06:25:27 +00:00
.6 >LDA.G index do we have a Source dir ?
bne .8
2019-11-29 15:36:54 +00:00
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 ZPPWBuf
txa
>STA.G hPWBuf
>LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPLineBuf
txa
>STA.G hLineBuf
2016-08-17 06:25:58 +00:00
*--------------------------------------
CS.RUN.LOOP stz bPass2
.1 ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL FEOF
bcs .99 I/O error
2020-03-17 16:03:32 +00:00
tay
bne .2 no char
2020-03-17 16:03:32 +00:00
>SYSCALL GetChar
cmp #$03 Ctrl-C
beq .99 Abort....
2020-03-17 16:03:32 +00:00
cmp #$13 Ctrl-S
bne .2
lda bPause
eor #$ff
sta bPause
bne .1
2020-03-17 16:03:32 +00:00
.2 bit bPause
bmi .1
2020-03-17 16:03:32 +00:00
jsr GetEntry
bcs .9
2020-03-17 16:03:32 +00:00
jsr FilterMatch
bcs .8 no match, skip....
bit bAllmostAll
bmi .4
2020-03-17 16:03:32 +00:00
lda (ZPFileName)
cmp #'.'
beq .8
2018-12-19 16:45:09 +00:00
.4 ldy #S.STAT.MODE+1
lda (ZPFileStat),y
2020-07-13 19:29:31 +00:00
and #$70
lsr
lsr
lsr
tax
jsr CS.RUN.PRINT.JMP
bcs .99
2018-12-19 16:45:09 +00:00
.8 jsr GetNextEntry
bcc .1
2018-12-19 16:45:09 +00:00
bit bPass2
bmi .9
2018-12-19 16:45:09 +00:00
jsr ResetSrcDir
bcs .99
dec bPass2
bra .1
.9 bit bLong
bmi .91
jsr CS.RUN.NewLine
bcs .99
.91 jsr LeaveSubDir
bcs .98
2016-10-30 18:19:43 +00:00
jsr BasePath..
jsr CS.RUN.ENTER.MSG
bcs .99
jsr GetNextEntry
jmp CS.RUN.LOOP
.98 lda #0
sec
.99 rts
*--------------------------------------
2020-02-29 14:06:28 +00:00
CS.RUN.PRINT.JMP
jmp (J.CS.RUN.PRINT,x)
2020-02-29 14:06:28 +00:00
*--------------------------------------
CS.RUN.PRINT.REG
bit bPass2
bpl .8
bit bLong
bmi .1
bit bColumn
bmi .23
2020-02-29 14:06:28 +00:00
bit bFullPath
bpl .22
jsr CS.RUN.PRINT.SRCPATH
.23 >LDYA ZPFileName
>SYSCALL PutS
rts
2020-02-14 07:21:56 +00:00
.22 >PUSHW L.MSG.REG
>PUSHW ZPFileName
>PUSHBI 2
>SYSCALL PrintF
bcs .9
jmp CS.RUN.UpdateColCnt
.8 clc
.9 rts
2020-02-29 14:06:28 +00:00
*--------------------------------------
.1 >PUSHW L.MSG.REGEXT
jsr Mod2CSTR (2)
2020-07-13 19:29:31 +00:00
jsr CS.RUN.PushUidGid (4)
2020-02-29 14:06:28 +00:00
ldy #S.STAT.SIZE+3
ldx #4
2020-02-29 14:06:28 +00:00
.2 lda (ZPFileStat),y
>PUSHA
dey
dex
bne .2 (4)
jsr CS.RUN.PUSHDATES (4)
2020-02-29 14:06:28 +00:00
ldy #S.STAT.P.TYPE
lda (ZPFileStat),y
jsr FileType2PSTR
>PUSHYA (2)
2020-02-29 14:06:28 +00:00
ldy #S.STAT.P.AUXTYPE+1
lda (ZPFileStat),y
>PUSHA
dey
lda (ZPFileStat),y
>PUSHA (2)
2020-02-14 07:21:56 +00:00
>PUSHW ZPFileName (2)
>PUSHBI 20
>SYSCALL PrintF
bcs .9
jmp CS.RUN.NewLine.1
*--------------------------------------
2018-12-19 16:45:09 +00:00
CS.RUN.PRINT.DIR
bit bPass2
bmi .8
bit bLong
bmi .4
bit bColumn
bmi .23
bit bFullPath
bpl .22
2020-02-14 07:21:56 +00:00
jsr CS.RUN.PRINT.SRCPATH
2020-02-14 07:21:56 +00:00
.23 >LDYA ZPFileName
>SYSCALL PutS
bcs .9
bit bRecurse
bpl .8
lda (ZPFileName)
cmp #'.'
beq .8
>LDYA ZPFileName
jmp EnterSubDirYA
.8 clc
.9 rts
2018-08-22 15:23:27 +00:00
.22 >PUSHW L.MSG.DIR
>PUSHW ZPFileName
>PUSHBI 2
>SYSCALL PrintF
bcs .9
2020-02-14 07:21:56 +00:00
ldy #0
2020-02-14 07:21:56 +00:00
.1 iny
lda (ZPFileName),y
bne .1
2020-02-14 07:21:56 +00:00
.11 iny
cpy #19
bcs .2
2020-02-14 07:21:56 +00:00
lda #C.SPACE
phy
>SYSCALL PutChar
ply
bcc .11
rts
2020-02-14 07:21:56 +00:00
.2 jsr CS.RUN.UpdateColCnt
bcc .5
rts
2019-12-06 13:50:32 +00:00
*--------------------------------------
.4 >PUSHW L.MSG.DIREXT
jsr Mod2CSTR
jsr CS.RUN.PushUidGid
jsr CS.RUN.PUSHDATES
>PUSHW ZPFileName
>PUSHBI 12
>SYSCALL PrintF
bcs .90
jsr CS.RUN.NewLine.1
bcs .90
.5 bit 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
2020-02-29 14:06:28 +00:00
.80 clc
.90 rts
*--------------------------------------
2020-02-29 14:06:28 +00:00
CS.RUN.PRINT.CDEV
clc
rts
2020-02-29 14:06:28 +00:00
*--------------------------------------
CS.RUN.PRINT.BDEV
bit bPass2
bmi .8
bit bLong
bmi .20
2020-02-29 14:06:28 +00:00
bit bColumn
bmi .23
bit bFullPath
bpl .22
2020-02-29 14:06:28 +00:00
jsr CS.RUN.PRINT.SRCPATH
2020-02-29 14:06:28 +00:00
.23 >LDYA ZPFileName
>SYSCALL PutS
bcs .9
bit bRecurse
bpl .8
lda (ZPFileName)
cmp #'.'
beq .8
>LDYA ZPFileName
jmp EnterSubDirYA
2021-01-12 21:14:13 +00:00
.8 clc
.9 rts
2019-03-11 15:43:33 +00:00
.22 >PUSHW L.MSG.BDEV
>PUSHW ZPFileName
>PUSHBI 2
>SYSCALL PrintF
bcs .9
2019-12-06 13:50:32 +00:00
ldy #0
2019-12-06 13:50:32 +00:00
.1 iny
lda (ZPFileName),y
bne .1
2019-12-06 13:50:32 +00:00
.11 iny
cpy #19
bcs .2
2019-12-06 13:50:32 +00:00
lda #C.SPACE
phy
>SYSCALL PutChar
ply
bcc .11
rts
2019-12-06 13:50:32 +00:00
.2 jsr CS.RUN.UpdateColCnt
* bcc .5
rts
2020-02-29 14:06:28 +00:00
*--------------------------------------
.20 >PUSHW L.MSG.BDEVEXT
>PUSHW ZPFileName
ldy #S.STAT.P.SLOT
>PUSHB (ZPFileStat),y
iny DRIVE
>PUSHB (ZPFileStat),y
2020-02-14 07:21:56 +00:00
ldy #S.STAT.BLOCKS+1
>PUSHB (ZPFileStat),y
dey
>PUSHB (ZPFileStat),y
2020-02-14 07:21:56 +00:00
ldy #S.STAT.P.DEVBLOCKS+1
>PUSHB (ZPFileStat),y
dey
>PUSHB (ZPFileStat),y
>PUSHBI 8
2019-12-06 13:50:32 +00:00
>SYSCALL PrintF
bcs .90
jsr CS.RUN.NewLine.1
bcs .90
2018-12-19 16:45:09 +00:00
bit bRecurse
bpl .80
>LDYA ZPFileName
jsr EnterSubDirYA
bcs .90
jmp CS.RUN.ENTER.MSG
.80 clc
.90 rts
*--------------------------------------
2020-02-14 07:21:56 +00:00
CS.RUN.PRINT.SRCPATH
ldy #hSrcBasePath
lda (pData),y
>SYSCALL GetMemPtr
>PUSHYA
>PUSHBI 0
>SYSCALL PrintF
rts
2020-02-14 07:21:56 +00:00
*--------------------------------------
2020-07-13 19:29:31 +00:00
CS.RUN.PushUidGid
ldy #S.STAT.UID
lda (ZPFileStat),y
>PUSHA
>PUSHW ZPPWBuf
>SYSCALL GetPWUID
bcs .2
>PUSHEA.G USER
jsr CS.RUN.PushUidGidStr
bra .3
.2 >PUSHEA.G USER
>PUSHW L.FMT.int16
ldy #S.STAT.UID+1
lda (ZPFileStat),y
>PUSHA
dey
lda (ZPFileStat),y
>PUSHA
>PUSHBI 2
>SYSCALL SPrintF
.3 ldy #S.STAT.GID
lda (ZPFileStat),y
>PUSHA
>PUSHW ZPPWBuf
>SYSCALL GetGRGID
bcs .5
>PUSHEA.G GROUP
jsr CS.RUN.PushUidGidStr
bra .8
.5 >PUSHEA.G GROUP
>PUSHW L.FMT.int16
ldy #S.STAT.GID+1
lda (ZPFileStat),y
>PUSHA
dey
lda (ZPFileStat),y
>PUSHA
>PUSHBI 2
>SYSCALL SPrintF
.8 >PUSHEA.G USER
>PUSHEA.G GROUP
clc
rts
2020-07-13 19:29:31 +00:00
CS.RUN.PushUidGidStr
>PUSHW L.FMT.string6
>PUSHW ZPPWBuf
>PUSHBI 2
>SYSCALL SPrintF
rts
2019-12-06 13:50:32 +00:00
*--------------------------------------
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
*--------------------------------------
2019-11-29 15:36:54 +00:00
CS.RUN.NODATES.INIT
ldx #$ff
2019-11-29 15:36:54 +00:00
.1 inx
iny
lda MSG.NODATE,x
sta (pData),y
bne .1
rts
2019-11-29 15:36:54 +00:00
*--------------------------------------
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
2019-11-29 15:36:54 +00:00
*--------------------------------------
CS.RUN.UpdateColCnt
inc ColCount
lda ColCount
cmp #MAX.COL
bne CS.RUN.NewLine.8
stz ColCount
bra CS.RUN.NewLine.1
*--------------------------------------
2016-10-30 22:23:18 +00:00
CS.RUN.ENTER.MSG
>PUSHW L.MSG.ENTER
ldy #hSrcBasePath
lda (pData),y
>SYSCALL GetMemPtr
>PUSHYA
>PUSHBI 2
>SYSCALL PrintF
bcc CS.RUN.NewLine.1
rts
*--------------------------------------
CS.RUN.NewLine lda ColCount
beq CS.RUN.NewLine.8
2020-07-21 05:26:07 +00:00
CS.RUN.NewLine.1
lda #C.CR
>SYSCALL PutChar
lda bIsTTY
beq CS.RUN.NewLine.8
lda #C.LF
>SYSCALL PutChar
2020-07-21 05:26:07 +00:00
CS.RUN.NewLine.8
clc
rts
*--------------------------------------
CS.RUN.ISATTY ldy #S.PS.hStdOut
lda (pPS),y
tax
lsr
bcc .9
lda Nod.Table.hFD-2,x
>SYSCALL GetMemPtr
>STYA ZPPtr1
lda (ZPPtr1)
beq .9
inc bIsTTY
.9 rts
2016-10-30 22:23:18 +00:00
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT jsr LeaveSubDir
bcc CS.QUIT
2019-12-06 13:50:32 +00:00
ldy #hFilter
jsr .7
2018-08-11 10:57:57 +00:00
ldy #hPWBuf
jsr .7
ldy #hLineBuf
.7 lda (pData),y
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 #'9'+1
bcc .2
adc #6
.2 sta PRODOS.FT.DFLT+1
pla
and #$0F
ora #$30
cmp #'9'+1
bcc .3
adc #6
.3 sta PRODOS.FT.DFLT+2
.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
php C = RU
2020-07-13 19:29:31 +00:00
lsr
lsr
lsr
tax
lda TYPES,x
>STA.G MOD
2020-07-13 19:29:31 +00:00
plp
2020-07-13 19:29:31 +00:00
ldy #S.STAT.MODE
lda (ZPFileStat),y
2019-04-15 05:40:13 +00:00
ldy #MOD+1
ldx #8
2020-07-13 19:29:31 +00:00
.1 pha
lda #'-'
bcc .2
lda ACCESS,x
2020-07-13 19:29:31 +00:00
.2 sta (pData),y
iny
pla
asl
dex
bpl .1
>PUSHEA.G MOD
rts
*--------------------------------------
.INB usr/src/shared/x.fileenum.s
*--------------------------------------
CS.END
*--------------------------------------
OptionList .AS "ACFLRacflr"
OptionVars .DA #bAllmostAll,#bColumn,#bFullPath,#bLong,#bRecurse,#bAllmostAll,#bColumn,#bFullPath,#bLong,#bRecurse
*--------------------------------------
MSG.USAGE .AS "Usage : LS [-A] [-C] [-F] [-L] [-R] [filespec]\r\n"
.AS " -A : Show dot files\r\n"
.AS " -C : List in multiple columns\r\n"
.AS " -F : Show full paths\r\n"
.AS " -L : Use long listing format\r\n"
.AZ " -R : Recursively list subdirectories\r\n"
MSG.REGEXT .AZ "%s %6s %6s %10u %s %s %s %H %s"
MSG.REG .AZ "%19s"
MSG.DIREXT .AZ "%s %6s %6s %s %s <dir> %s"
MSG.DIR .AZ "\e[32m%s/\e[0m"
MSG.BDEVEXT .AZ "/%15s s%dd%d Blocks Used:%5D Total:%5D"
MSG.BDEV .AZ "\e[32m%s/\e[0m"
MSG.ENTER .AZ "Directory:%s"
*--------------------------------------
PRODOS.FT.HEX .HS 0406FAFCFDE2CBCCCFFF
PRODOS.FT.TXT .AZ "txt"
.AZ "bin"
.AZ "asm"
.AZ "bas"
.AZ "var"
.AZ "atk"
.AZ "pix"
.AZ "fon"
.AZ "pak"
.AZ "sys"
PRODOS.FT.DFLT .AZ "$ "
MSG.NODATE .AZ "<no-date>"
FMT.Date .AZ "%d-%b-%y"
FMT.Time .AZ "%H:%M:%S "
FMT.string6 .AZ "%6s"
FMT.int16 .AZ "%6D"
TYPES .AS "-dbclssp"
ACCESS .AS "xwrxwrxwr"
*--------------------------------------
.DUMMY
.OR 0
DS.START
MOD .BS 11 drwxrwxrwx0
USER .BS 7
GROUP .BS 7
2020-07-13 19:29:31 +00:00
TIME.Create .BS 20
TIME.Mod .BS 20
TIME.SysTime .BS S.TIME
hLineBuf .BS 1
hPWBuf .BS 1
2017-10-04 15:12:03 +00:00
.INB usr/src/shared/x.fileenum.g
DS.END .ED
*--------------------------------------
MAN
2020-07-13 19:29:31 +00:00
SAVE usr/src/bin/ls.s
ASM