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
1 changed files with 187 additions and 317 deletions

View File

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