A2osX/BIN/LS.S.txt
2019-12-06 16:06:08 +01:00

658 lines
12 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/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
L.UID .DA UID
L.GID .DA GID
.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 OptionList
.2 cmp OptionList,x
beq .3
dex
bne .2
lda #E.SYN
sec
rts
.3 ldy OptionVars-1,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 >LEA.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
ldy #S.STAT.P.DEVBLOCKS+1
>PUSHB (ZPFileStat),y
dey
>PUSHB (ZPFileStat),y
ldy #S.STAT.BLOCKS+1
>PUSHB (ZPFileStat),y
dey
>PUSHB (ZPFileStat),y
ldy #S.STAT.P.DRIVE
>PUSHB (ZPFileStat),y
dey SLOT
>PUSHB (ZPFileStat),y
>PUSHW ZPFileName
>PUSHBI 8
>LDYA L.MSG.DEVEXT
>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
>PUSHBI 0
ldy #hSrcBasePath
lda (pData),y
>SYSCALL GetMemPtr
>SYSCALL printf
.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 ZPFileName
>PUSHBI 2
>LDYA L.MSG.DIR
>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 ZPFileName
jsr CS.RUN.PUSHDATES
jsr CS.RUN.PushGidUid
jsr Mod2CSTR
>PUSHEA.G MOD File Mod
>PUSHBI 12
>LDYA L.MSG.DIREXT
>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
>PUSHBI 0
ldy #hSrcBasePath
lda (pData),y
>SYSCALL GetMemPtr
>SYSCALL printf
.23 >LDYA ZPFileName
>SYSCALL puts
rts
.22 >PUSHW ZPFileName
>PUSHBI 2
>LDYA L.MSG.FILE
>SYSCALL printf
bcs .9
jmp CS.RUN.UpdateColCnt
*--------------------------------------
.1 >PUSHW ZPFileName
ldy #S.STAT.P.AUXTYPE+1
lda (ZPFileStat),y
>PUSHA
dey
lda (ZPFileStat),y
>PUSHA
dey Type
lda (ZPFileStat),y
jsr FileType2PSTR
>PUSHYA
jsr CS.RUN.PUSHDATES
ldy #S.STAT.SIZE+3
ldx #4
.2 lda (ZPFileStat),y
>PUSHA
dey
dex
bne .2
jsr CS.RUN.PushGidUid
jsr Mod2CSTR
>PUSHEA.G MOD File Mod
>PUSHBI 20
>LDYA L.MSG.FILEEXT
>SYSCALL printf
.9 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
>PUSHW ZPPW
ldy #S.STAT.UID
lda (ZPFileStat),y
>SYSCALL GetPWUID
bcs .3
>PUSHW ZPPW
clc
rts
.3 ldy #S.STAT.UID+1
lda (ZPFileStat),y
>PUSHA
dey
lda (ZPFileStat),y
>PUSHA
>PUSHB L.FMT.int16
>PUSHEA.G GID
>SYSCALL sprintf
>PUSHEA.G GID
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
lda ZPFileStat
clc
adc #S.STAT.MTIME
tay
lda ZPFileStat+1
adc #0
jsr CS.RUN.DATEFMT.SELECT
>LEA.G TIME.Mod
>SYSCALL StrFTime
.1 ldy #S.STAT.CTIME+S.TIME.MONTH
lda (ZPFileStat),y
beq .2 Month=0.....invalid date/time
lda ZPFileStat
clc
adc #S.STAT.CTIME
tay
lda ZPFileStat+1
adc #0
jsr CS.RUN.DATEFMT.SELECT
>LEA.G TIME.Create
>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
>PUSHYA
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
rts
.9 >PUSHW L.FMT.Date
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
>PUSHBI 0
>LDYA L.MSG.CRLF
>SYSCALL printf
rts
CS.RUN.NewLine.8
clc
rts
*--------------------------------------
CS.RUN.ENTER.MSG
ldy #hSrcBasePath
lda (pData),y
>SYSCALL GetMemPtr
>PUSHYA
>PUSHBI 2
>LDYA L.MSG.ENTER
>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 >PSTR "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
GID .BS 6
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