A2osX/BIN/CAT.S.txt
2023-10-18 07:41:12 +02:00

379 lines
6.4 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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