NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/grep *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/kernel.i .INB inc/mli.i .INB inc/mli.e.i *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ArgIndex .BS 1 ArgPattern .BS 1 ZPPtr1 .BS 2 ZPPatternPtr .BS 2 ZPBufPtr .BS 2 hFile .BS 1 hBuf .BS 1 LineNum .BS 2 char .BS 1 bIgnoreCase .BS 1 bLineNum .BS 1 bInvertMatch .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 S.PS.F.EVENT .DA #0 .DA CS.END-CS.START Code Size (without Constants) .DA DS.END-DS.START Data SegmentSize .DA #16 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.CRLF .DA MSG.CRLF L.MSG.NUMLINE .DA MSG.NUMLINE .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN jsr CS.RUN.CheckArgs bcs CS.RUN.LOOP.RTS stz LineNum stz LineNum+1 CS.RUN.LOOP >SLEEP >PUSHB hFile >PUSHW ZPBufPtr >PUSHWI 256 >SYSCALL FGetS bcs .9 inc LineNum bne .2 inc LineNum+1 .2 jsr CS.RUN.PRINT bcc CS.RUN.LOOP rts .9 cmp #MLI.E.EOF bne .99 lda #0 Exit with no Error .99 sec CS.RUN.LOOP.RTS rts *-------------------------------------- CS.RUN.CheckArgs jsr CS.RUN.NextArg bcs .4 lda (ZPPtr1) cmp #'-' beq .1 lda ArgPattern bne .11 lda ArgIndex sta ArgPattern >LDYA ZPPtr1 >STYA ZPPatternPtr bra CS.RUN.CheckArgs .11 lda hFile bne .97 >LDYA ZPPtr1 jsr CS.RUN.OPEN bcs .9 sta hFile bra CS.RUN.CheckArgs .1 ldy #1 lda (ZPPtr1),y ldx #OptionList.Cnt-1 .2 cmp OptionList,x beq .3 dex bpl .2 bra .97 .3 txa lsr beq .98 tax lda #$80 sta bIgnoreCase-1,x bra CS.RUN.CheckArgs .4 lda hFile bne .80 ldy #S.PS.hStdIn lda (pPS),y tax lda hFDs-1,x >SYSCALL GetMemPtr >STYA ZPPtr1 lda (ZPPtr1) cmp #S.FD.T.PIPE bne .97 ldy #S.PS.hStdIn lda (pPS),y sta hFile .80 >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPBufPtr stx hBuf * clc .9 rts .97 lda #E.SYN .98 pha >PUSHW L.MSG.USAGE >PUSHBI 0 >SYSCALL PrintF pla sec rts *-------------------------------------- CS.RUN.NextArg inc ArgIndex lda ArgIndex >SYSCALL ArgV bcs .9 >STYA ZPPtr1 .9 rts *-------------------------------------- CS.RUN.OPEN >PUSHYA >PUSHBI O.RDONLY+O.TEXT >PUSHBI S.FI.T.TXT >PUSHWZ Aux type >SYSCALL FOpen bcs .9 sta hFile .9 rts *-------------------------------------- CS.RUN.PRINT >LDYA ZPBufPtr >STYA ZPPtr1 .1 lda (ZPPtr1) beq .4 ldy #$ff .2 iny lda (ZPPtr1),y bne .3 lda (ZPPatternPtr),y bne .4 .3 lda (ZPPatternPtr),y beq .6 jsr CS.RUN.toUpper sta char lda (ZPPtr1),y jsr CS.RUN.toUpper cmp char beq .2 inc ZPPtr1 bne .1 inc ZPPtr1+1 bra .1 .4 clc not matching .HS B0 BCS .6 sec matching ror eor bInvertMatch bpl .8 lda bLineNum bpl .7 >PUSHW L.MSG.NUMLINE >PUSHW LineNum >PUSHBI 2 >SYSCALL PrintF bcs .9 .7 >LDYA ZPBufPtr >SYSCALL PutS rts .8 clc .9 rts *-------------------------------------- CS.RUN.toUpper bit bIgnoreCase bpl .9 cmp #'a' bcc .9 cmp #'z'+1 bcs .9 eor #$20 .9 rts *-------------------------------------- CS.QUIT lda hFile beq .1 >SYSCALL FClose .1 lda hBuf beq .8 >SYSCALL FreeMem .8 clc rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.END *-------------------------------------- OptionList .AS "HhIiNnVv" OptionList.Cnt .EQ *-OptionList *-------------------------------------- MSG.USAGE .AS "Usage : GREP or CMD|GREP \r\n" .AS " -H : This help screen\r\n" .AS " -I : Ignore Case\r\n" .AS " -N : Print line Number\r\n" .AS " -V : Invert Match" MSG.CRLF .AZ "\r\n" MSG.NUMLINE .AZ "%5D:" *-------------------------------------- .DUMMY .OR 0 DS.START DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/grep.s ASM