A2osX/BIN/WC.S.txt
2020-05-25 23:03:11 +02:00

575 lines
9.7 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/wc
*--------------------------------------
.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 0
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
ZPFullPath .BS 2
ZPRelPath .BS 2
ZPLineBuf .BS 2
bPause .BS 1
bContinue .BS 1
bRecurse .BS 1
bChar .BS 1
bLine .BS 1
bWord .BS 1
bInWord .BS 1
bTotal .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
.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.ERR .DA MSG.ERR
L.MSG.LONG .DA MSG.LONG
L.MSG.TOTAL .DA MSG.TOTAL
.DA 0
*--------------------------------------
CS.INIT clc
rts
*--------------------------------------
CS.RUN >INC.G ArgIndex
>SYSCALL ArgV
bcs .5
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
jsr CS.RUN.CheckOpt
bcc CS.RUN
.9 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec
rts
.4 >LDA.G hSrcBasePath
bne .9
>LDYA ZPPtr1
jsr InitSrcDirYA
bcc CS.RUN
.99 rts
*--------------------------------------
.5 lda bChar
ora bLine
ora bWord
bne .51
lda #$ff
sta bChar
sta bLine
sta bWord
.51 >LDA.G hSrcBasePath
bne .6
ldy #S.PS.hStdIn
lda (pPS),y
tax
lda OF.Table.hFD-1,x
>SYSCALL GetMemPtr
>STYA ZPPtr1
lda (ZPPtr1)
cmp #S.FD.T.PIPE
bne .9
jmp CS.RUN.PIPE
.6 >LDYAI 256
>SYSCALL GetMem
bcs .99
>STYA ZPFullPath
txa
>STA.G hSrcFullPath
>LDA.G hSrcBasePath
>SYSCALL GetMemPtr
>STYA ZPPtr1
ldy #$ff
.80 iny
lda (ZPPtr1),y
bne .80
tya
clc
adc ZPFullPath
sta ZPRelPath
lda ZPFullPath+1
adc #0
sta ZPRelPath+1
>LDYAI 256
>SYSCALL GetMem
bcs .99
>STYA ZPLineBuf
txa
>STA.G hMem
*--------------------------------------
CS.RUN.LOOP ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL feof
bcs .99
tay
bne .10
>SYSCALL GetChar
bcs .99
cmp #$03 Ctrl-C
beq .99 Abort....
cmp #$13 Ctrl-S
bne .10
lda bPause
eor #$ff
sta bPause
bne CS.RUN.LOOP
.10 lda bPause
bne CS.RUN.LOOP Pause...
jsr GetEntry
bcs .9
ldy #S.STAT.P.DRIVE
lda (ZPFileStat),y ProDOS Device ?
beq .5
jsr CS.RUN.DEV
bcc CS.RUN.LOOP
rts
.5 ldy #S.STAT.P.TYPE
lda (ZPFileStat),y
cmp #$0F Directory ?
bne .6
jsr CS.RUN.DIR
bcs .99
bra .8
.6 jsr CS.RUN.FILE
bcs .99
bra .8
.9 jsr LeaveSubDir
bcs .90
jsr BasePath..
.8 jsr GetNextEntry
jmp CS.RUN.LOOP
.90 jsr CS.RUN.PrintTstat
lda #0
sec
.99 rts
*--------------------------------------
CS.RUN.PIPE >LDYAI 256
>SYSCALL GetMem
bcs .99
>STYA ZPLineBuf
txa
>STA.G hMem
ldy #S.PS.hStdIn
lda (pPS),y
>STA.G hFile
jsr CS.RUN.FILE.LOOP
jsr CS.RUN.PrintFstat
lda #0
sec
.99 rts
*--------------------------------------
CS.RUN.DIR lda bRecurse
bpl .8
lda (ZPFileName)
cmp #'.'
beq .8
>LDYA ZPFileName
jsr EnterSubDirYA
jmp CS.RUN.CheckErr
.8 clc
rts
*--------------------------------------
CS.RUN.DEV
.8 jsr GetNextEntry
CS.RUN.DEV.CLC.RTS
clc
rts
*--------------------------------------
CS.RUN.FILE jsr FilterMatch
bcs CS.RUN.DEV.CLC.RTS no match, skip....
jsr CS.RUN.GetFilePath
jsr CS.RUN.OpenFile
bcs .9
jsr CS.RUN.FILE.LOOP
bcs .7
jsr CS.RUN.CloseFile
jsr CS.RUN.PrintFstat
bcs .99
jsr CS.RUN.AddFstat2Tstat
lda bTotal
bmi .8
beq .61
lda #$fe
.61 inc
sta bTotal
.8 clc
rts
.7 pha
jsr CS.RUN.CloseFile
pla
sec
.9 jmp CS.RUN.CheckErr
.99 rts
*--------------------------------------
CS.RUN.FILE.LOOP
.1 >PUSHWI 256
>PUSHW ZPLineBuf
>LDA.G hFile
>SYSCALL fgets
bcs .8
jsr CS.RUN.IncFLine
ldy #$ff
stz bInWord
.2 iny
lda (ZPLineBuf),y
bne .21
lda bInWord
beq .1
jsr CS.RUN.IncFWord
bra .1
.21 cmp #C.SPACE
beq .3
cmp #C.TAB
bne .4
.3 lda bInWord
beq .5
jsr CS.RUN.IncFWord
stz bInWord
bra .5
.4 inc bInWord
.5 jsr CS.RUN.IncFChar
bra .2
.8 cmp #MLI.E.EOF
bne .9
clc
rts
.9 sec
rts
*--------------------------------------
CS.RUN.CheckErr bcc .9
pha
>PUSHW L.MSG.ERR
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
lda bContinue
eor #$80
asl
pla
.9 rts
*--------------------------------------
CS.RUN.GetFilePath
>LDA.G hSrcBasePath
>SYSCALL GetMemPtr
>PUSHYA
>LDYA ZPFullPath
>SYSCALL StrCpy
>PUSHW ZPFileName
>LDYA ZPFullPath
>SYSCALL StrCat
rts
*--------------------------------------
CS.RUN.OpenFile ldx #12
ldy #fCharCount
lda #0
.1 sta (pData),y
iny
dex
bne .1
>PUSHW ZPFullPath
>PUSHBI O.RDONLY+O.TEXT
>PUSHBI 0 Type
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
>STA.G hFile
.9 rts
*--------------------------------------
CS.RUN.CloseFile
>LDA.G hFile
>SYSCALL FClose
bcs .9
>STZ.G hFile
.9 rts
*--------------------------------------
CS.RUN.IncFChar phy
ldy #fCharCount
bra CS.RUN.IncF
CS.RUN.IncFLine phy
ldy #fLineCount
bra CS.RUN.IncF
CS.RUN.IncFWord phy
ldy #fWordCount
ldx #4
CS.RUN.IncF lda (pData),y
inc
sta (pData),y
bne .8
iny
dex
bne CS.RUN.IncF
.8 ply
rts
*--------------------------------------
CS.RUN.AddFstat2Tstat
>PUSHL.G fWordCount
>PUSHL.G tWordCount
>FPU ADD32
>PULLL.G tWordCount
>PUSHL.G fLineCount
>PUSHL.G tLineCount
>FPU ADD32
>PULLL.G tLineCount
>PUSHL.G fCharCount
>PUSHL.G tCharCount
>FPU ADD32
>PULLL.G tCharCount
rts
*--------------------------------------
CS.RUN.PrintFstat
bit bWord
bpl .1
>PUSHW L.MSG.LONG
>PUSHL.G fWordCount
>PUSHBI 4
>SYSCALL PrintF
bcs .9
.1 bit bLine
bpl .2
>PUSHW L.MSG.LONG
>PUSHL.G fLineCount
>PUSHBI 4
>SYSCALL PrintF
bcs .9
.2 bit bChar
bpl .3
>PUSHW L.MSG.LONG
>PUSHL.G fCharCount
>PUSHBI 4
>SYSCALL PrintF
bcs .9
.3 >LDYA ZPRelPath
>SYSCALL PutS
.9
CS.RUN.PrintFstat.RTS
rts
*--------------------------------------
CS.RUN.PrintTstat
clc
lda bTotal
bpl CS.RUN.PrintFstat.RTS
bit bWord
bpl .1
>PUSHW L.MSG.LONG
>PUSHL.G tWordCount
>PUSHBI 4
>SYSCALL PrintF
bcs .9
.1 bit bLine
bpl .2
>PUSHW L.MSG.LONG
>PUSHL.G tLineCount
>PUSHBI 4
>SYSCALL PrintF
bcs .9
.2 bit bChar
bpl .3
>PUSHW L.MSG.LONG
>PUSHL.G tCharCount
>PUSHBI 4
>SYSCALL PrintF
bcs .9
.3 >LDYA L.MSG.TOTAL
>SYSCALL PutS
.9 rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT jsr LeaveSubDir
bcc CS.QUIT
>LDA.G hFilter
beq .1
>SYSCALL FreeMem
.1 >LDA.G hSrcFullPath
beq .2
>SYSCALL FreeMem
.2 >LDA.G hMem
beq .8
>SYSCALL FreeMem
.8 clc
rts
*--------------------------------------
CS.RUN.CheckOpt ldy #1
lda (ZPPtr1),y
ldx #OptionVars-OptionList-1
.2 cmp OptionList,x
beq .3
dex
bpl .2
sec
rts
.3 ldy OptionVars,x
lda #$ff
sta 0,y
clc
rts
*--------------------------------------
.INB usr/src/bin/x.fileenum.s
*--------------------------------------
CS.END
*--------------------------------------
OptionList .AS "CRMLWcrmlw"
OptionVars .DA #bContinue,#bRecurse,#bChar,#bLine,#bWord
.DA #bContinue,#bRecurse,#bChar,#bLine,#bWord
*--------------------------------------
MSG.USAGE .AS "Usage : WC File(s) (*,? wildcards allowed)\r\n"
.AS " -C : Continue on error\r\n"
.AS " -R : Recurse subdirectories\r\n"
.AS " -M : Print the CHAR counts\r\n"
.AS " -L : Print the LINE counts\r\n"
.AZ " -W : Print the WORD counts\r\n"
MSG.ERR .AZ "[%h]\r\n"
MSG.LONG .AZ "%10L "
MSG.TOTAL .AZ "(total)"
*--------------------------------------
.DUMMY
.OR 0
DS.START
ArgIndex .BS 1
bPrintTotal .BS 1
fCharCount .BS 4
fLineCount .BS 4
fWordCount .BS 4
tCharCount .BS 4
tLineCount .BS 4
tWordCount .BS 4
hSrcFullPath .BS 1
hFile .BS 1
hMem .BS 1
.INB usr/src/bin/x.fileenum.g
DS.END
.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/WC.S
ASM