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

@ -1,376 +1,246 @@
NEW NEW
AUTO 3,1 AUTO 3,1
.LIST OFF .LIST OFF
.OP 65C02 .OP 65C02
.OR $2000 .OR $2000
.TF bin/cat .TF bin/cat
*-------------------------------------- *--------------------------------------
.INB inc/macros.i .INB inc/macros.i
.INB inc/a2osx.i .INB inc/a2osx.i
.INB inc/kernel.i .INB inc/kernel.i
.INB inc/mli.i .INB inc/mli.i
.INB inc/mli.e.i .INB inc/mli.e.i
*-------------------------------------- *--------------------------------------
.DUMMY .DUMMY
.OR ZPBIN .OR ZPBIN
ZS.START ZS.START
ZPPtr1 .BS 2 ZPPtr1 .BS 2
ZPBufPtr .BS 2 ZPBufPtr .BS 2
ByteIndex .BS 1 ByteIndex .BS 1
ArgCount .BS 1 ArgCount .BS 1
FileCount .BS 1 FileCount .BS 1
bPause .BS 1 bPause .BS 1
bPrintAll .BS 1 bDummy .BS 1
bLineNum .BS 1 bStdout .BS 1
bSuppressBlankLine .BS 1 ArgIndex .BS 1
ArgIndex .BS 1 hBuf .BS 1
hBuf .BS 1 hFile .BS 1
hFile .BS 1 ZS.END .ED
LineNum .BS 2
bPrintedBlankLine .BS 1
ZS.END .ED
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
CS.START cld CS.START cld
jmp (.1,x) jmp (.1,x)
.DA #$61 6502,Level 1 (65c02) .DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1 .DA #1 BIN Layout Version 1
.DA #S.PS.F.EVENT S.PS.F .DA #S.PS.F.EVENT S.PS.F
.DA #0 .DA #0
.DA CS.END-CS.START CS .DA CS.END-CS.START CS
.DA DS.END-DS.START DS .DA DS.END-DS.START DS
.DA #64 SS .DA #64 SS
.DA #ZS.END-ZS.START Zero Page Size .DA #ZS.END-ZS.START Zero Page Size
.DA 0 .DA 0
*-------------------------------------- *--------------------------------------
* Relocation Table * Relocation Table
*-------------------------------------- *--------------------------------------
.1 .DA CS.INIT .1 .DA CS.INIT
.DA CS.RUN .DA CS.RUN
.DA CS.DOEVENT .DA CS.DOEVENT
.DA CS.QUIT .DA CS.QUIT
L.MSG.USAGE .DA MSG.USAGE L.MSG.USAGE .DA MSG.USAGE
L.MSG.CRLF .DA MSG.CRLF L.MSG.CRLF .DA MSG.CRLF
L.MSG.INIT .DA MSG.INIT L.MSG.INIT .DA MSG.INIT
L.MSG.LINENUM .DA MSG.LINENUM .DA 0
L.MSG.CTRLCHAR .DA MSG.CTRLCHAR
L.ASCII .DA ASCII
.DA 0
*-------------------------------------- *--------------------------------------
CS.INIT clc CS.INIT clc
rts rts
*-------------------------------------- *--------------------------------------
CS.RUN CS.RUN
.1 inc ArgCount .1 stz bStdout
lda ArgCount
>SYSCALL ArgV inc ArgCount
bcs .7 lda ArgCount
>SYSCALL ArgV
bcs .7
>STYA ZPPtr1 >STYA ZPPtr1
lda (ZPPtr1) lda (ZPPtr1)
cmp #'-' cmp #'-'
bne .4 bne .4
ldy #1 ldy #1
lda (ZPPtr1),y lda (ZPPtr1),y
ldx #OptionList.Cnt-1 ldx #OptionList.Cnt-1
.2 cmp OptionList,x .2 cmp OptionList,x
beq .3 beq .3
dex dex
bpl .2 bpl .2
.99 >PUSHW L.MSG.USAGE .99 >PUSHW L.MSG.USAGE
>PUSHBI 0 >PUSHBI 0
>SYSCALL PrintF >SYSCALL PrintF
lda #E.SYN lda #E.SYN
sec sec
.9 rts .9 rts
.3 ldy OptionVars,x .3 ldy OptionVars,x
lda #$80 lda #$80
sta 0,y sta 0,y
bra .1 bra .1
.4 inc FileCount .4 inc FileCount
bra .1 scan for any other args bra .1 scan for any other args
.7 lda FileCount .7 lda FileCount
beq .99 beq .99
>LDYAI 256 >LDYAI 256
>SYSCALL GetMem >SYSCALL GetMem
bcs .9 bcs .9
>STYA ZPBufPtr >STYA ZPBufPtr
stx hBuf stx hBuf
ldy #S.PS.hStdOut ldy #S.PS.hStdOut
lda (pPS),y lda (pPS),y
tax tax
lsr lsr
bcc CS.RUN.LOOP bcc CS.RUN.LOOP
lda Nod.Table.hFD-2,x lda Nod.Table.hFD-2,x
>SYSCALL GetMemPtr >SYSCALL GetMemPtr
>STYA ZPPtr1 >STYA ZPPtr1
lda (ZPPtr1) lda (ZPPtr1)
beq CS.RUN.LOOP beq CS.RUN.LOOP
cmp #S.FD.T.PIPE cmp #S.FD.T.PIPE
beq CS.RUN.LOOP beq CS.RUN.LOOP
>PUSHW L.MSG.INIT lda #$ff
>PUSHBI 0 sta bStdout
>SYSCALL PrintF
>PUSHW L.MSG.INIT
>PUSHBI 0
>SYSCALL PrintF
*-------------------------------------- *--------------------------------------
CS.RUN.LOOP ldy #S.PS.hStdIn CS.RUN.LOOP ldy #S.PS.hStdIn
lda (pPS),y lda (pPS),y
>SYSCALL FEOF >SYSCALL FEOF
bcs .90 IO error bcs .90 IO error
tay tay
bne .10 no char bne .10 no char
>SYSCALL GetChar >SYSCALL GetChar
bcs .9 IO error bcs .9 IO error
cmp #$03 Ctrl-C cmp #$03 Ctrl-C
beq .9 Abort.... beq .9 Abort....
cmp #$13 Ctrl-S cmp #$13 Ctrl-S
bne .10 bne .10
lda bPause lda bPause
eor #$ff eor #$ff
sta bPause sta bPause
bne CS.RUN.LOOP bne CS.RUN.LOOP
.10 lda bPause .10 lda bPause
bne CS.RUN.LOOP Pause... bne CS.RUN.LOOP Pause...
.11 lda hFile .11 lda hFile
bne .2 bne .2
.1 inc ArgIndex .1 inc ArgIndex
lda ArgIndex lda ArgIndex
>SYSCALL ArgV >SYSCALL ArgV
bcs .99 No more arg...the end! bcs .99 No more arg...the end!
>STYA ZPPtr1 >STYA ZPPtr1
lda (ZPPtr1) lda (ZPPtr1)
cmp #'-' cmp #'-'
beq .1 An option, skip... beq .1 An option, skip...
>LDYA ZPPtr1 >LDYA ZPPtr1
jsr CS.RUN.OPEN jsr CS.RUN.OPEN
.90 bcs .9 .90 bcs .9
sta hFile sta hFile
.2 >PUSHA .2 lda hFile
>PUSHW ZPBufPtr >SYSCALL GetC
>PUSHWI 254 Leave room for CRLF bcs .7
>SYSCALL FGetS
bcs .7
jsr CS.RUN.PRINT pha
bcc CS.RUN.LOOP >SYSCALL PutChar
rts pla
.7 cmp #MLI.E.EOF cmp #C.CR
bne .9 bne CS.RUN.LOOP
jsr CS.RUN.CLOSE lda bStdout
jmp CS.RUN.LOOP beq CS.RUN.LOOP
.99 lda #0 Exit with no Error lda #C.LF
.9 sec >SYSCALL PutChar
rts
bra CS.RUN.LOOP
.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 CS.RUN.OPEN >PUSHYA
>PUSHYA >PUSHBI O.RDONLY+O.TEXT
>PUSHBI O.RDONLY+O.TEXT >PUSHBI S.FI.T.TXT
>PUSHBI S.FI.T.TXT >PUSHWZ Aux type
>PUSHWZ Aux type >SYSCALL FOpen
>SYSCALL FOpen rts
rts
*-------------------------------------- *--------------------------------------
CS.RUN.PRINT inc LineNum CS.QUIT lda hBuf
bne .10 beq CS.RUN.CLOSE
>SYSCALL FreeMem
inc LineNum+1 CS.RUN.CLOSE lda hFile
beq .8
.10 lda bSuppressBlankLine stz hFile
bpl .2
lda (ZPBufPtr) >SYSCALL FClose
bne .1 Empty line ? .8 clc
rts
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 CS.DOEVENT sec
lda bLineNum rts
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 CS.END
*-------------------------------------- *--------------------------------------
OptionList .AS "ANSans" OptionList .AS "x"
OptionList.Cnt .EQ *-OptionList OptionList.Cnt .EQ *-OptionList
OptionVars .DA #bPrintAll,#bLineNum,#bSuppressBlankLine,#bPrintAll,#bLineNum,#bSuppressBlankLine OptionVars .DA #bDummy
*-------------------------------------- *--------------------------------------
MSG.USAGE .AS "Usage : CAT File1 [File2...]\r\n" MSG.USAGE .AS "Usage : CAT File1 [File2...]"
.AS " -A : Show All non printable characters\r\n" MSG.CRLF .AZ "\r\n"
.AS " -N : Number all output lines\r\n" MSG.INIT .AZ "\e[?7h" Enable Line Wrap
.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" .DUMMY
>PSTR "SOH" .OR 0
>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.START
DS.END .ED DS.END .ED
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE usr/src/bin/cat.s SAVE usr/src/bin/cat.s