A2osX/BIN/CAT.S.txt
2019-02-20 16:07:43 +00:00

365 lines
6.3 KiB
Plaintext
Raw 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
PREFIX
AUTO 4,1
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/CAT
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/MLI.I
.INB INC/MLI.E.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPBufPtr .EQ ZPBIN+2
*--------------------------------------
* 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 #16 SS
.DA #4 ZP
.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.Init .DA MSG.Init
L.MSG.LINENUM .DA MSG.LINENUM
L.MSG.CTRLCHAR .DA MSG.CTRLCHAR
L.ASCII .DA ASCII
.DA 0
*--------------------------------------
CS.INIT
.1 >INC.G ArgCount
>SYSCALL ArgV
bcs .7
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
ldy #1
lda (ZPPtr1),y
ldx OptionList
.2 cmp OptionList,x
beq .3
dex
bne .2
.99 >PUSHBI 0
>LDYA L.MSG.USAGE
>SYSCALL printf
lda #E.SYN
sec
rts
.3 ldy OptionVars-1,x
lda #$80
sta (pData),y
bra .1
.4 >INC.G FileCount
bra .1 scan for any other args
.7 >LDA.G FileCount
beq .99
>LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPBufPtr
txa
>STA.G hBuf
>PUSHBI 0
>LDYA L.MSG.Init
>SYSCALL printf
clc
.9 rts
*--------------------------------------
CS.RUN bra .11
>SYSCALL GetChar
bcs .10 no char
cmp #$03 Ctrl-C
beq .99 Abort....
cmp #$13 Ctrl-S
bne .10
>LDA.G bPause
eor #$ff
sta (pData),y
bne .8
.10 >LDA.G bPause
bne .8 Pause...
.11 >LDA.G hFILE
bne .2
.1 >INC.G 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
bcs .9
>STA.G hFILE
clc
rts
.2 pha
>PUSHWI 256
>PUSHW ZPBufPtr
pla
>SYSCALL FRead
bcc CS.RUN.PRINT
cmp #MLI.E.EOF
bne .9
jsr CS.RUN.CLOSE
.8 clc
rts
.99 lda #0 Exit with no Error
.9 sec
rts
*--------------------------------------
CS.RUN.PRINT sty BytesRead Y,A = Bytes read
stz ByteIndex
>INCW.G LineNum
>LDA.G bSuppressBlankLine
bpl .10
lda BytesRead
beq .12 Empty line ?
dec
bne .1 Only one CR ?
lda (ZPBufPtr)
cmp #13
bne .1
.12 >LDA.G bPrintedBlankLine
bmi .8
lda #$ff
sta (pData),y
bra .10
.1 lda #0
>STA.G bPrintedBlankLine
.10 jsr CS.RUN.PRINTNUM
bcs .9
.20 ldy ByteIndex
lda (ZPBufPtr),y
cmp #' '
bcs .6
cmp #13 Allow printing of CR even if not bPrintAll
beq .4
>LDA.G bPrintAll
bpl .7
>LDYA L.ASCII
>STYA ZPPtr1
ldy ByteIndex
lda (ZPBufPtr),y
tax
.2 dex
bmi .3
lda ZPPtr1
sec
adc (ZPPtr1)
sta ZPPtr1
bcc .2
inc ZPPtr1+1
bra .2
.3 >PUSHW ZPPtr1
>PUSHBI 2
>LDYA L.MSG.CTRLCHAR
>SYSCALL printf
bcs .9
bra .7
.4 lda #13
>SYSCALL PutChar
bcs .9
lda #10
.6 >SYSCALL PutChar
bcs .9
.7 inc ByteIndex
dec BytesRead
bne .20
.8 clc
.9 rts
*--------------------------------------
CS.RUN.PRINTNUM clc
>LDA.G bLineNum
bpl .8
>PUSHW.G LineNum
>PUSHBI 2
>LDYA L.MSG.LINENUM
>SYSCALL printf
.8 rts
*--------------------------------------
CS.RUN.OPEN pha
>PUSHWI 0 Aux type
>PUSHBI S.FI.T.TXT
>PUSHBI O.RDONLY+O.TEXT
pla
>SYSCALL FOpen
bcs .9
pha
lda #0
>STA.G bPrintedBlankLine Reset this flag for the new file
pla
clc
.9 rts
*--------------------------------------
CS.QUIT >LDA.G hBuf
beq CS.RUN.CLOSE
>SYSCALL FreeMem
CS.RUN.CLOSE ldy #hFILE
lda (pData),y
beq .8
pha
lda #0
sta (pData),y
pla
>SYSCALL FClose
.8 clc
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList >PSTR "ANSans"
OptionVars .DA #bPrintAll,#bLineNum,#bSuppressBlankLine,#bPrintAll,#bLineNum,#bSuppressBlankLine
*--------------------------------------
MSG.USAGE .AS "Usage : CAT File1 [File2...]\r\n"
.AS " -A : Show All non printable caracters\r\n"
.AS " -N : Number all output lines\r\n"
.AZ " -S : Suppress repeated empty output lines\r\n"
MSG.Init .AZ "\e[7l"
MSG.LINENUM .AZ "%5D:"
MSG.CTRLCHAR .AZ "[%S]"
*--------------------------------------
ASCII >PSTR "NULL"
>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"
*--------------------------------------
BytesRead .BS 1
ByteIndex .BS 1
*--------------------------------------
.DUMMY
.OR 0
DS.START
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
DS.END
.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/CAT.S
ASM