A2osX/BIN/CUT.S.txt

331 lines
5.3 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/cut
*--------------------------------------
.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
ZPBuf .BS 2
ZPBufPtr .BS 2
ArgIndex .BS 1
ArgLine .BS 1
OptionIdx .BS 1
hBuf .BS 1
FieldNum .BS 1
StartChar .BS 1
EndChar .BS 1
Separator .BS 1
hToClose .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 #0 S.PS.F.EVENT
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data SegmentSize
.DA #32 Stack Size
.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
.DA 0
*--------------------------------------
CS.INIT clc
rts
*--------------------------------------
CS.RUN lda #C.SPACE
sta Separator
.10 jsr CS.RUN.NextArg
bcs .8
lda (ZPPtr1)
cmp #'-'
beq .1
lda ArgIndex
sta ArgLine
bra .10
.1 ldy #1
lda (ZPPtr1),y
ldx #OptionList.Cnt-1
.2 cmp OptionList,x
beq .3
dex
bpl .2
.97 lda #E.SYN
.98 pha
>LDYA L.MSG.USAGE
>SYSCALL PutS
pla
sec
.9 rts
.3 txa
lsr
beq .98 -H
cmp #4 -S
bne .4
jsr CS.RUN.NextArg
bcs .97
lda (ZPPtr1)
sta Separator
bra .10
.4 sta OptionIdx
jsr CS.RUN.NextArg
bcs .97
>SYSCALL AToI
bcs .97
tax
bne .97
tya
ldx OptionIdx
sta FieldNum-1,x
bra .10 scan for any other args
.8 >LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPBuf
>STYA ZPBufPtr
stx hBuf
lda ArgLine
beq .80
>PUSHW ZPBufPtr
lda ArgLine
>SYSCALL ArgV
>PUSHYA
>SYSCALL StrCpy
jsr CS.RUN.OUT
bcs .9
lda #0 Exit with no Error
sec
rts
.80 ldy #S.PS.hStdIn
lda (pPS),y
tay
ldx FILEs.hFD-1,y
ldy FDs.pLO-1,x
lda FDs.pHI-1,x
>STYA ZPPtr1
lda (ZPPtr1)
cmp #S.FD.T.PIPE
bne CS.RUN.LOOP
ldy #S.PS.hStdIn
lda (pPS),y
sta hToClose
*--------------------------------------
CS.RUN.LOOP >SLEEP
ldy #S.PS.hStdIn
lda (pPS),y
>PUSHA
>LDYA ZPBuf
>STYA ZPBufPtr
>PUSHYA
>PUSHWI 255
>SYSCALL FGetS
bcs .8
lda (ZPBufPtr)
beq CS.RUN.LOOP
jsr CS.RUN.OUT
bcc CS.RUN.LOOP
.8 cmp #MLI.E.EOF
bne .90
lda #0
.90 sec
.9 rts
*--------------------------------------
CS.RUN.OUT ldx FieldNum
beq CS.RUN.OUT.MN
ldy #$ff
.1 iny skip spaces
lda (ZPBufPtr),y
beq CS.RUN.PRINTCR
cmp Separator
beq .1
dex
beq .4
.2 iny skip token
lda (ZPBufPtr),y
beq CS.RUN.PRINTCR
eor Separator
bne .2
bra .1
.4 jsr CS.RUN.AddYToBufPtr
ldy #$ff
.6 iny
lda (ZPBufPtr),y
beq .8
eor Separator
bne .6
sta (ZPBufPtr),y
.8 >LDYA ZPBufPtr
>SYSCALL PutS
rts
*--------------------------------------
CS.RUN.PRINTCR >PUSHW L.MSG.CRLF
>PUSHBI 0
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.OUT.MN ldy #0
ldx StartChar
beq .2
.1 dex
beq .2
lda (ZPBufPtr),y
beq CS.RUN.PRINTCR
iny
bra .1
.2 lda EndChar
beq .8
.3 lda (ZPBufPtr),y
beq .8
cpy EndChar
beq .4
iny
bra .3
.4 lda #0
sta (ZPBufPtr),y
.8 ldy StartChar
beq .80
dey
beq .80
jsr CS.RUN.AddYToBufPtr
.80 >LDYA ZPBufPtr
>SYSCALL PutS
rts
*--------------------------------------
CS.RUN.NextArg inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs .9
>STYA ZPPtr1
.9 rts
*--------------------------------------
CS.RUN.AddYToBufPtr
tya
clc
adc ZPBufPtr
sta ZPBufPtr
bcc .8
inc ZPBufPtr+1
.8 rts
*--------------------------------------
CS.QUIT lda hToClose
beq .1
>SYSCALL FClose Close the pipe
.1 lda hBuf
beq .8
>SYSCALL FreeMem
.8 clc
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList .AS "HhFfMmNnSs"
OptionList.Cnt .EQ *-OptionList
*--------------------------------------
MSG.USAGE .CS 'Usage : CUT "line of text"\r\n'
.CS " -H : This help screen\r\n"
.CS " -F nn : Output field nn\r\n"
.CS " -M nn : Output starting at nn\r\n"
.CS " -N nn : Output Ending at nn\r\n"
.CS " -S ch : Change default SPACE separator to 'ch'"
MSG.CRLF .CZ "\r\n"
*--------------------------------------
.DUMMY
.OR 0
DS.START
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/cut.s
ASM