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 <pattern> <File> or CMD|GREP <pattern>\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