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.FILE1		.DA MSG.FILE1
L.MSG.FILE2		.DA MSG.FILE2
L.MSG.FILE3		.DA MSG.FILE3
L.MSG.TOTAL1	.DA MSG.TOTAL1
L.MSG.TOTAL2	.DA MSG.TOTAL2
L.MSG.TOTAL3	.DA MSG.TOTAL3
				.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				>PUSHBI 0
				>LDYA L.MSG.USAGE
				>SYSCALL printf
				lda #E.SYN
				sec
				rts
*--------------------------------------
.4				>LDA.G hSrcBasePath
				bne .9
				>LDYA ZPPtr1
				jsr InitSrcDirYA
				bcc CS.RUN
.99				rts

.5				>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
				>PUSHA
				>PUSHBI 1
				>LDYA L.MSG.ERR
				>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
				>PUSHWZ					Aux type
				>PUSHBI 0				Type
				>PUSHBI	O.RDONLY+O.TEXT
				>LDYA ZPFullPath

				>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
				>PUSHW ZPRelPath
				ldx #0

				bit bWord
				bpl .1
				
				>PUSHL.G fWordCount
				inx
				
.1				bit bLine
				bpl .2

				>PUSHL.G fLineCount
				inx
				
.2				bit bChar
				bpl .3
				
				>PUSHL.G fCharCount
				inx

.3				txa
				beq .4

				asl
				tax
				asl
*				clc				
				adc #2
				>PUSHA
				>LDYA L.MSG.FILE1-2,x
				>SYSCALL printf
				rts
				
.4				>PUSHL.G fWordCount
				>PUSHL.G fLineCount
				>PUSHL.G fCharCount
				>PUSHBI 14
				>LDYA L.MSG.FILE3
				>SYSCALL printf
				rts
*--------------------------------------
CS.RUN.PrintTstat
				lda bTotal
				bpl .8
				
				ldx #0
				
				bit bWord
				bpl .1
				
				>PUSHL.G tWordCount
				inx
				
.1				bit bLine
				bpl .2

				>PUSHL.G tLineCount
				inx
				
.2				bit bChar
				bpl .3
				
				>PUSHL.G tCharCount
				inx

.3				txa
				beq .4

				asl
				tax
				asl
				>PUSHA
				>LDYA L.MSG.TOTAL1-2,x
				>SYSCALL printf
.8				rts
				
.4				>PUSHL.G tWordCount
				>PUSHL.G tLineCount
				>PUSHL.G tCharCount
				>PUSHBI 12
				>LDYA L.MSG.TOTAL3
				>SYSCALL printf
				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.FILE3		.AS "%10L "
MSG.FILE2		.AS "%10L "
MSG.FILE1		.AZ "%10L %s\r\n"
MSG.TOTAL3		.AS "%10L "
MSG.TOTAL2		.AS "%10L "
MSG.TOTAL1		.AZ "%10L (total)\r\n"
*--------------------------------------
				.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
