NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/cat
*--------------------------------------
				.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
ZPPtr1			.BS 2
ZPBufPtr		.BS 2
ByteIndex		.BS 1
ArgCount		.BS 1
FileCount		.BS 1
bPause			.BS 1
bPrintAll		.BS 1
bLineNum		.BS 1
bSuppressBlankLine	.BS 1
ArgIndex		.BS 1
hBuf			.BS 1
hFile			.BS 1
LineNum			.BS 2
bPrintedBlankLine	.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 #S.PS.F.EVENT		S.PS.F
				.DA #0
				.DA CS.END-CS.START		CS
				.DA DS.END-DS.START		DS
				.DA #64					SS
				.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.INIT		.DA MSG.INIT
L.MSG.LINENUM	.DA MSG.LINENUM
L.MSG.CTRLCHAR	.DA MSG.CTRLCHAR
L.ASCII			.DA ASCII
				.DA 0
*--------------------------------------
CS.INIT			clc
				rts
*--------------------------------------
CS.RUN			
.1				inc ArgCount
				lda ArgCount
				>SYSCALL ArgV
				bcs .7

				>STYA ZPPtr1

				lda (ZPPtr1)
				cmp #'-'
				bne .4

				ldy #1 
				lda (ZPPtr1),y

				ldx #OptionList.Cnt-1
				
.2				cmp OptionList,x
				beq .3

				dex
				bpl .2

.99				>PUSHW L.MSG.USAGE
				>PUSHBI 0
				>SYSCALL PrintF
				lda #E.SYN
				sec
.9				rts

.3				ldy OptionVars,x
				lda #$80
				sta 0,y
				bra .1

.4				inc FileCount
				bra .1					scan for any other args

.7				lda FileCount
				beq .99

				>LDYAI 256
				>SYSCALL GetMem
				bcs .9

				>STYA ZPBufPtr
				stx hBuf
				
				ldy #S.PS.hStdOut
				lda (pPS),y

				tax
				
				lsr
				bcc CS.RUN.LOOP
				
				lda Nod.Table.hFD-2,x
				>SYSCALL GetMemPtr
				>STYA ZPPtr1

				lda (ZPPtr1)

				beq CS.RUN.LOOP

				cmp #S.FD.T.PIPE
				beq CS.RUN.LOOP
			
				>PUSHW L.MSG.INIT
				>PUSHBI 0
				>SYSCALL PrintF
*--------------------------------------
CS.RUN.LOOP		ldy #S.PS.hStdIn
				lda (pPS),y
				>SYSCALL FEOF
				bcs .90					IO error

				tay
				bne .10					no char

				>SYSCALL GetChar
				bcs .9					IO error

				cmp #$03				Ctrl-C
				beq .9					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...

.11				lda hFile
				bne .2

.1				inc ArgIndex
				lda ArgIndex
				>SYSCALL ArgV
				bcs .99					No more arg...the end!

				>STYA ZPPtr1
				lda (ZPPtr1)
				cmp #'-'
				beq .1					An option, skip...

				>LDYA ZPPtr1
				jsr CS.RUN.OPEN
.90				bcs .9

				sta hFile

.2				>PUSHA
				>PUSHW ZPBufPtr
				>PUSHWI	254				Leave room for CRLF
				>SYSCALL FGetS
				bcs .7

				jsr CS.RUN.PRINT
				bcc CS.RUN.LOOP
				rts

.7				cmp #MLI.E.EOF
				bne .9

				jsr CS.RUN.CLOSE
				jmp CS.RUN.LOOP

.99				lda #0					Exit with no Error
.9				sec
				rts
*--------------------------------------
CS.RUN.OPEN		stz bPrintedBlankLine	Reset this flag for the new file
				>PUSHYA
				>PUSHBI	O.RDONLY+O.TEXT
				>PUSHBI S.FI.T.TXT
				>PUSHWZ				Aux type
				>SYSCALL FOpen
				rts
*--------------------------------------
CS.RUN.PRINT	inc LineNum
				bne .10

				inc LineNum+1

.10				lda bSuppressBlankLine
				bpl .2

				lda (ZPBufPtr)
				bne .1					Empty line ?

				lda bPrintedBlankLine
				bmi .8

				lda #$ff
				sta bPrintedBlankLine
				bra .2

.1				stz bPrintedBlankLine

.2				jsr CS.RUN.PRINTNUM
				bcs .99

				lda bPrintAll
				bmi .3
	
				ldy #$ff

.20				iny
				lda (ZPBufPtr),y
				beq .21

				cmp #C.SPACE
				bcs .20

				lda #C.SPACE
				sta (ZPBufPtr),y
				bra .20
	
.21				>LDYA ZPBufPtr
				>SYSCALL PutS
				rts
	
.3				stz ByteIndex

.4				ldy ByteIndex
				lda (ZPBufPtr),y
				beq .7

				cmp #C.SPACE
				bcc .5

				>SYSCALL PutChar
.99				bcs .9

				bra .62

.8				clc
				rts

.5				tax

				>LDYA L.ASCII
				>STYA ZPPtr1
.6				dex
				bmi .61
				lda ZPPtr1
				sec
				adc (ZPPtr1)
				sta ZPPtr1
				bcc .6
				inc ZPPtr1+1
				bra .6

.61				>PUSHW L.MSG.CTRLCHAR
				>PUSHW ZPPtr1
				>PUSHBI 2
				>SYSCALL PrintF
				bcs .9

.62				inc ByteIndex
				bne .4
				
.7				>PUSHW L.MSG.CRLF
				>PUSHBI 0
				>SYSCALL PrintF

.9				rts
*--------------------------------------
CS.RUN.PRINTNUM	clc
				lda bLineNum
				bpl .8

				>PUSHW L.MSG.LINENUM
				>PUSHW LineNum
				>PUSHBI 2
				>SYSCALL PrintF
.8				rts
*--------------------------------------
CS.QUIT			lda hBuf
				beq CS.RUN.CLOSE
				>SYSCALL FreeMem

CS.RUN.CLOSE	lda hFile
				beq .8

				stz hFile

				>SYSCALL FClose
.8				clc
				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList		.AS "ANSans"
OptionList.Cnt	.EQ *-OptionList
OptionVars		.DA #bPrintAll,#bLineNum,#bSuppressBlankLine,#bPrintAll,#bLineNum,#bSuppressBlankLine
*--------------------------------------
MSG.USAGE		.AS "Usage : CAT File1 [File2...]\r\n"
				.AS "   -A : Show All non printable caracters\r\n"
				.AS "   -N : Number all output lines\r\n"
				.AS "   -S : Suppress repeated empty output lines"
MSG.CRLF		.AZ "\r\n"
MSG.INIT		.AZ "\e[?7h"			Enable Line Wrap
MSG.LINENUM		.AZ "%5D:"
MSG.CTRLCHAR	.AZ "[%S]"
*--------------------------------------
ASCII			>PSTR "NUL"
				>PSTR "SOH"
				>PSTR "STX"
				>PSTR "ETX"
				>PSTR "EOT"
				>PSTR "ENQ"
				>PSTR "ACK"
				>PSTR "BEL"
				>PSTR "BS"
				>PSTR "TAB"
				>PSTR "LF"
				>PSTR "VT"
				>PSTR "FF"
				>PSTR "CR"
				>PSTR "SO"
				>PSTR "SI"
				>PSTR "DLE"
				>PSTR "DC1"
				>PSTR "DC2"
				>PSTR "DC3"
				>PSTR "DC4"
				>PSTR "NAK"
				>PSTR "SYN"
				>PSTR "ETB"
				>PSTR "CAN"
				>PSTR "EM"
				>PSTR "SUB"
				>PSTR "ESC"
				>PSTR "FS"
				>PSTR "GS"
				>PSTR "RS"
				>PSTR "US"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
DS.END			.ED
*--------------------------------------
MAN
SAVE usr/src/bin/cat.s
ASM
