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			stz ArgIndex
				stz ArgPattern
				stz hFile
				
.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				
				>PUSHBI 0
				>LDYA L.MSG.USAGE
				>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
	
.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
				bne .1
				
				ldy #S.PS.hStdIn
				lda (pPS),y

.1				>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 LineNum
				>PUSHBI 2
				>LDYA L.MSG.NUMLINE
				>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 hBuf
				beq .1

				>SYSCALL FreeMem

.1				lda hFILE
				beq .2

				>SYSCALL FClose
				
.2				
.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
