CAT: Simplified. More correct. Less bloat.

This commit is contained in:
Bobbi Webber-Manners 2021-07-02 20:49:04 -04:00
parent 45d654382a
commit 57aaff90ec

View File

@ -20,14 +20,11 @@ ByteIndex .BS 1
ArgCount .BS 1
FileCount .BS 1
bPause .BS 1
bPrintAll .BS 1
bLineNum .BS 1
bSuppressBlankLine .BS 1
bDummy .BS 1
bStdout .BS 1
ArgIndex .BS 1
hBuf .BS 1
hFile .BS 1
LineNum .BS 2
bPrintedBlankLine .BS 1
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
@ -53,16 +50,15 @@ CS.START cld
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
.1 stz bStdout
inc ArgCount
lda ArgCount
>SYSCALL ArgV
bcs .7
@ -128,6 +124,9 @@ CS.RUN
cmp #S.FD.T.PIPE
beq CS.RUN.LOOP
lda #$ff
sta bStdout
>PUSHW L.MSG.INIT
>PUSHBI 0
>SYSCALL PrintF
@ -176,15 +175,24 @@ CS.RUN.LOOP ldy #S.PS.hStdIn
sta hFile
.2 >PUSHA
>PUSHW ZPBufPtr
>PUSHWI 254 Leave room for CRLF
>SYSCALL FGetS
.2 lda hFile
>SYSCALL GetC
bcs .7
jsr CS.RUN.PRINT
bcc CS.RUN.LOOP
rts
pha
>SYSCALL PutChar
pla
cmp #C.CR
bne CS.RUN.LOOP
lda bStdout
beq CS.RUN.LOOP
lda #C.LF
>SYSCALL PutChar
bra CS.RUN.LOOP
.7 cmp #MLI.E.EOF
bne .9
@ -196,113 +204,13 @@ CS.RUN.LOOP ldy #S.PS.hStdIn
.9 sec
rts
*--------------------------------------
CS.RUN.OPEN stz bPrintedBlankLine Reset this flag for the new file
>PUSHYA
CS.RUN.OPEN >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
@ -321,51 +229,13 @@ CS.DOEVENT sec
*--------------------------------------
CS.END
*--------------------------------------
OptionList .AS "ANSans"
OptionList .AS "x"
OptionList.Cnt .EQ *-OptionList
OptionVars .DA #bPrintAll,#bLineNum,#bSuppressBlankLine,#bPrintAll,#bLineNum,#bSuppressBlankLine
OptionVars .DA #bDummy
*--------------------------------------
MSG.USAGE .AS "Usage : CAT File1 [File2...]\r\n"
.AS " -A : Show All non printable characters\r\n"
.AS " -N : Number all output lines\r\n"
.AS " -S : Suppress repeated empty output lines"
MSG.USAGE .AS "Usage : CAT File1 [File2...]"
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