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			inc ArgCount
				lda ArgCount
				>SYSCALL ArgV
				bcs .7

				>STYA ZPPtr1

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

				ldy #1 
				lda (ZPPtr1),y
				beq .99

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

				dex
				bpl .2

.99				>LDYA L.MSG.USAGE
				>SYSCALL PutS
				lda #E.SYN
				sec
.9				rts

.3				lda OptionVars,x
				tax
*				sec				
				ror 0,x
				iny
				lda (ZPPtr1),y
				bne .1
				
				bra CS.RUN

.4				inc FileCount
				bra CS.RUN				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
				tay
				ldx FILEs.hFD-1,y
				ldy FDs.pLO-1,x
				lda FDs.pHI-1,x
				>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"
OptionVars		.DA #bPrintAll,#bLineNum,#bSuppressBlankLine,#bPrintAll,#bLineNum,#bSuppressBlankLine
*--------------------------------------
MSG.USAGE		.CS "Usage : CAT File1 [File2...]\r\n"
				.CS "   -A : Show All non printable characters\r\n"
				.CS "   -N : Number all output lines\r\n"
				.CS "   -S : Suppress repeated empty output lines"
MSG.CRLF		.CZ "\r\n"
MSG.INIT		.CZ "\e[?7h"			Enable Line Wrap
MSG.LINENUM		.CZ "%5D:"
MSG.CTRLCHAR	.CZ "[%S]"
*--------------------------------------
ASCII			.PS "NUL"
				.PS "SOH"
				.PS "STX"
				.PS "ETX"
				.PS "EOT"
				.PS "ENQ"
				.PS "ACK"
				.PS "BEL"
				.PS "BS"
				.PS "TAB"
				.PS "LF"
				.PS "VT"
				.PS "FF"
				.PS "CR"
				.PS "SO"
				.PS "SI"
				.PS "DLE"
				.PS "DC1"
				.PS "DC2"
				.PS "DC3"
				.PS "DC4"
				.PS "NAK"
				.PS "SYN"
				.PS "ETB"
				.PS "CAN"
				.PS "EM"
				.PS "SUB"
				.PS "ESC"
				.PS "FS"
				.PS "GS"
				.PS "RS"
				.PS "US"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
DS.END			.ED
*--------------------------------------
MAN
SAVE usr/src/bin/cat.s
ASM
