NEW
  PREFIX
AUTO 4,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
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
.10				jsr CS.RUN.NextArg
				bcs .8
				lda (ZPPtr1)
				cmp #'-'
				beq .1
				lda ArgPattern
				bne .11
				lda ArgIndex
				sta ArgPattern
				>LDYA ZPPtr1
				>STYA ZPPatternPtr
				bra .10

.11				lda hFile
				bne .97

				>LDYA ZPPtr1
				jsr CS.RUN.OPEN
				bcs .9
				sta hFile
				bra .10

.1				ldy #1 
				lda (ZPPtr1),y

				ldx #OptionList.Cnt-1
.2				cmp OptionList,x
				beq .3
				dex
				bpl .2
				bra .97
.3				txa
				beq .98
				lsr
				tax
				lda #$80
				sta bIgnoreCase-1,x 
				bra .10					scan for any other args
.97				lda #E.SYN
.98				pha
				>PUSHW L.MSG.USAGE
				>PUSHBI 0
				>SYSCALL printf
				pla
				sec
.9				rts

.8				lda hFile
				bne .80

				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 .97
				
				ldy #S.PS.hStdIn
				lda (pPS),y
				sta hFile
	
.80				>LDYAI 256
				>SYSCALL GetMem
				bcs .9
				>STYA ZPBufPtr
				stx hBuf
				stz LineNum
				stz LineNum+1
CS.RUN.LOOP		>SLEEP

				>PUSHWI	256
				>PUSHW ZPBufPtr

				lda hFile
				>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
				rts
*--------------------------------------
CS.RUN.OPEN		pha
				>PUSHWZ				Aux type
				>PUSHBI S.FI.T.TXT
				>PUSHBI	O.RDONLY+O.TEXT
				pla
				>SYSCALL FOpen
				bcs .9
				sta hFile

.9				rts
*--------------------------------------
CS.RUN.PRINT	>LDYA ZPBufPtr
				>STYA ZPPtr1
.1				lda (ZPPtr1)
				beq .8
				ldy #$ff

.2				iny
				lda (ZPPtr1),y
				bne .3

				lda (ZPPatternPtr),y
				bne .8
.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

.6				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.NextArg	inc ArgIndex
				lda ArgIndex
				>SYSCALL ArgV
				bcs .9
				>STYA ZPPtr1

.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		.AZ "HhIiNn"
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"
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
