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

ArgIndex		.BS 1
hSrcFullPath	.BS 1
hFile			.BS 1
hMem			.BS 1

bTabbed			.BS 1

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.LONGTAB	.DA MSG.LONGTAB
L.MSG.LONG		.DA MSG.LONG
L.MSG.TOTAL		.DA MSG.TOTAL
				.DA 0
*--------------------------------------
CS.INIT			clc
				rts
*--------------------------------------
CS.RUN			inc ArgIndex
				lda 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 Nod.Table.hFD-2,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
				stx 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
				stx 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.MODE+1
				lda (ZPFileStat),y
				and #$F0
				cmp /S.STAT.MODE.DIR
				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
				stx hMem

				ldy #S.PS.hStdIn
				lda (pPS),y
				
				sta 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				>PUSHB hFile
				>PUSHW ZPLineBuf
				>PUSHWI 256
				>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
				>PUSHW ZPFullPath
				>LDA.G hSrcBasePath
				>SYSCALL GetMemPtr
				>PUSHYA
				>SYSCALL StrCpy

				>PUSHW ZPFullPath
				>PUSHW ZPFileName
				>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 hFile

.9				rts
*--------------------------------------
CS.RUN.CloseFile
				lda hFile
				>SYSCALL FClose
				bcs .9
				
				stz 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 uADD
				>PULLL.G tWordCount

				>PUSHL.G fLineCount
				>PUSHL.G tLineCount
				>FPU uADD
				>PULLL.G tLineCount

				>PUSHL.G fCharCount
				>PUSHL.G tCharCount
				>FPU uADD
				>PULLL.G tCharCount
				rts
*--------------------------------------
CS.RUN.PrintFstat
				sec
				bit bTotal
				bmi .19
				
				ldx #0
				
				bit bWord
				bpl .10
				
				inx
				
.10				bit bLine
				bpl .11
				
				inx
				
.11				bit bChar

				inx

.12				cpx #2
.19				ror bTabbed
				
				bit bWord
				bpl .1
				
				jsr CS.RUN.PUSHFMT
				>PUSHL.G fWordCount
				>PUSHBI 4
				>SYSCALL PrintF
				bcs .9
				
.1				bit bLine
				bpl .2

				jsr CS.RUN.PUSHFMT
				>PUSHL.G fLineCount
				>PUSHBI 4
				>SYSCALL PrintF
				bcs .9
				
.2				bit bChar
				bpl .3
				
				jsr CS.RUN.PUSHFMT
				>PUSHL.G fCharCount
				>PUSHBI 4
				>SYSCALL PrintF
				bcs .9
				
.3				>LDYA ZPRelPath
				>SYSCALL PutS
.9				
CS.RUN.PrintFstat.RTS
				rts
*--------------------------------------
CS.RUN.PUSHFMT	bit bTabbed
				bmi .1
				
				>PUSHW L.MSG.LONG
				rts
				
.1				>PUSHW L.MSG.LONGTAB
				rts
*--------------------------------------
CS.RUN.PrintTstat
				clc
				bit 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 hSrcFullPath
				beq .2

				>SYSCALL FreeMem
.2				lda 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/shared/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 "%L"
MSG.LONGTAB		.AZ "%10L "
MSG.TOTAL		.AZ "(total)"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
fCharCount		.BS 4
fLineCount		.BS 4
fWordCount		.BS 4

tCharCount		.BS 4
tLineCount		.BS 4
tWordCount		.BS 4

				.INB usr/src/shared/x.fileenum.g

DS.END			.ED
*--------------------------------------
MAN
SAVE usr/src/bin/wc.s
ASM
