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