OD: Now works with pipes (based on GREP code)

This commit is contained in:
Bobbi Webber-Manners 2021-07-03 12:45:36 -04:00
parent 920caca000
commit 1262246050

View File

@ -12,317 +12,281 @@
.DUMMY .DUMMY
.OR ZPBIN .OR ZPBIN
ZS.START ZS.START
ArgIndex .BS 1
ArgPattern .BS 1
ZPPtr1 .BS 2 ZPPtr1 .BS 2
ZPBufPtr .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 hFile .BS 1
hBuf .BS 1
char .BS 1
ByteCount .BS 3 ByteCount .BS 3
ZS.END .ED bTemp .BS 1
bDummy .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 #0 S.PS.F.EVENT
.DA #0 .DA #0
.DA CS.END-CS.START CS .DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START DS .DA DS.END-DS.START Data Segment Size
.DA #64 SS .DA #16 Stack Size
.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.OFFSET .DA MSG.OFFSET
L.MSG.OFFSET .DA MSG.OFFSET L.MSG.HEXBYTE .DA MSG.HEXBYTE
L.MSG.HEXBYTE .DA MSG.HEXBYTE .DA 0
.DA 0
*-------------------------------------- *--------------------------------------
CS.INIT clc CS.INIT clc
rts rts
*-------------------------------------- *--------------------------------------
CS.RUN CS.RUN jsr CS.RUN.CheckArgs
.1 stz bStdout bcs CS.RUN.LOOP.RTS
stz ByteCount
stz ByteCount+1
stz ByteCount+2
inc ArgCount
lda ArgCount
>SYSCALL ArgV
bcs .7
>STYA ZPPtr1 stz ByteCount
stz ByteCount+1
stz ByteCount+2
lda (ZPPtr1) CS.RUN.LOOP >SLEEP
cmp #'-'
bne .4
ldy #1 lda hFile
lda (ZPPtr1),y >SYSCALL GetC
bcs .7
ldx #OptionList.Cnt-1 jsr CS.RUN.PRINTBYTE
bra CS.RUN.LOOP
.7 cmp #MLI.E.EOF
bne .9
jsr CS.RUN.FINISHUP
.8 lda #0 Exit with no Error
.9 sec
CS.RUN.LOOP.RTS rts
*--------------------------------------
CS.RUN.CheckArgs jsr CS.RUN.NextArg
bcs .4
lda (ZPPtr1)
cmp #'-'
beq .1
.11 lda hFile
bne .97
>LDYA ZPPtr1
jsr CS.RUN.OPEN
bcs .9
sta hFile
bra CS.RUN.CheckArgs
.1 ldy #1
lda (ZPPtr1),y
ldx #OptionList.Cnt-1
.2 cmp OptionList,x
beq .3
dex
bpl .2
bra .97
.3 txa
lsr
beq .98
tax
lda #$80
sta bDummy-1,x
bra CS.RUN.CheckArgs
.2 cmp OptionList,x .4 lda hFile
beq .3 bne .80
dex ldy #S.PS.hStdIn
bpl .2 lda (pPS),y
tax
.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
.4 inc FileCount
bra .1 scan for any other args
.7 lda FileCount
beq .99
>LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPBufPtr
stx hBuf
ldy #S.PS.hStdOut lsr
lda (pPS),y bcs .97
tax
lsr lda Nod.Table.hFD-2,x
bcc CS.RUN.LOOP >SYSCALL GetMemPtr
>STYA ZPPtr1
lda (ZPPtr1)
cmp #S.FD.T.PIPE
bne .97
lda Nod.Table.hFD-2,x ldy #S.PS.hStdIn
>SYSCALL GetMemPtr lda (pPS),y
>STYA ZPPtr1 sta hFile
lda (ZPPtr1) .80 >LDYAI 256
>SYSCALL GetMem
bcs .9
beq CS.RUN.LOOP >STYA ZPBufPtr
stx hBuf
cmp #S.FD.T.PIPE * clc
beq CS.RUN.LOOP
lda #$ff .9 rts
sta bStdout
.97 lda #E.SYN
>PUSHW L.MSG.INIT
>PUSHBI 0 .98 pha
>SYSCALL PrintF >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
pla
sec
rts
*-------------------------------------- *--------------------------------------
CS.RUN.LOOP ldy #S.PS.hStdIn CS.RUN.NextArg inc ArgIndex
lda (pPS),y lda ArgIndex
>SYSCALL FEOF >SYSCALL ArgV
bcs .90 IO error bcs .9
tay >STYA ZPPtr1
bne .10 no char
>SYSCALL GetChar .9 rts
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 lda hFile
>SYSCALL GetC
bcs .7
jsr CS.RUN.PRINTBYTE
bra CS.RUN.LOOP
.7 cmp #MLI.E.EOF
bne .9
jsr CS.RUN.CLOSE
jsr CS.RUN.FINISHUP
jmp CS.RUN.LOOP
.99 lda #0 Exit with no Error
.9 sec
rts
*-------------------------------------- *--------------------------------------
CS.RUN.OPEN >PUSHYA CS.RUN.OPEN >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 bcs .9
sta hFile
.9 rts
*-------------------------------------- *--------------------------------------
CS.RUN.PRINTBYTE pha Char is in A CS.QUIT lda hFile
beq .1
lda ByteCount Divisible by 16 >SYSCALL FClose
and #$0f .1 lda hBuf
pha beq .8
bne .2 >SYSCALL FreeMem
.8 clc
>PUSHW L.MSG.OFFSET Print offset rts
lda ByteCount+2
>PUSHA
lda ByteCount+1
>PUSHA
lda ByteCount
>PUSHA
>PUSHBI 3
>SYSCALL PrintF
.2 ply Offset mod 16
pla Character
pha
sta (ZPPtr1),y
>PUSHW L.MSG.HEXBYTE
pla
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
.6 lda ByteCount
and #$0f
cmp #$0f
bne .8
jsr CS.RUN.PRINTASCII
.8 inc ByteCount
bne .9
inc ByteCount+1
bne .9
inc ByteCount+2
.9 rts
*-------------------------------------- *--------------------------------------
CS.RUN.PRINTASCII lda ByteCount CS.RUN.PRINTBYTE
and #$0f pha Char is in A
sta bDummy
lda #'>' lda ByteCount Divisible by 16
>SYSCALL PutChar and #$0f
sta bTemp
bne .2
ldy #$00 >PUSHW L.MSG.OFFSET Print offset
.7 lda (ZPPtr1),y lda ByteCount+2
phy >PUSHA
cmp #C.SPACE lda ByteCount+1
bcs .8 >PUSHA
lda #'.' lda ByteCount
>PUSHA
>PUSHBI 3
>SYSCALL PrintF
.8 >SYSCALL PutChar .2 ldy bTemp Offset mod 16
ply pla Character
iny pha
cpy bDummy sta (ZPBufPtr),y
bne .7
>PUSHW L.MSG.HEXBYTE
pla
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
lda #'<' .6 inc ByteCount
>SYSCALL PutChar bne .7
inc ByteCount+1
bne .7
inc ByteCount+2
lda #C.CR .7 lda bTemp
>SYSCALL PutChar cmp #$0f
lda bStdout bne .9
beq .9
lda #C.LF
>SYSCALL PutChar
.9 rts jsr CS.RUN.PRINTASCII
.9 rts
*-------------------------------------- *--------------------------------------
CS.RUN.FINISHUP lda ByteCount CS.RUN.PRINTASCII
and #$0f lda #'>'
bne .1 >SYSCALL PutChar
rts
.1 pha ldy #$00
lda #' ' .7 lda (ZPBufPtr),y
>SYSCALL PutChar phy
lda #' ' cmp #C.SPACE
>SYSCALL PutChar bcs .8
lda #' ' lda #'.'
>SYSCALL PutChar
pla .8 >SYSCALL PutChar
inc ply
cmp #$10 cpy bTemp
bne .1 beq .85
.2 jsr CS.RUN.PRINTASCII iny
rts bra .7
.85 lda #'<'
>SYSCALL PutChar
lda #C.CR
>SYSCALL PutChar
lda #C.LF
>SYSCALL PutChar
.9 rts
*-------------------------------------- *--------------------------------------
CS.QUIT lda hBuf CS.RUN.FINISHUP
beq CS.RUN.CLOSE lda ByteCount
>SYSCALL FreeMem and #$0f
bne .1
CS.RUN.CLOSE lda hFile rts
beq .8 .1 pha
lda #' '
stz hFile >SYSCALL PutChar
lda #' '
>SYSCALL FClose >SYSCALL PutChar
.8 clc lda #' '
rts >SYSCALL PutChar
pla
inc
cmp #$10
bne .1
.2 jsr CS.RUN.PRINTASCII
rts
*-------------------------------------- *--------------------------------------
CS.DOEVENT sec CS.DOEVENT sec
rts rts
*-------------------------------------- *--------------------------------------
CS.END CS.END
*-------------------------------------- *--------------------------------------
OptionList .AS "x" OptionList .AS "x"
OptionList.Cnt .EQ *-OptionList OptionList.Cnt .EQ *-OptionList
OptionVars .DA #bDummy
*-------------------------------------- *--------------------------------------
MSG.USAGE .AS "Usage : CAT File1 [File2...]" MSG.USAGE .AS "Usage : OD <File> or CMD|OD"
MSG.CRLF .AZ "\r\n" MSG.CRLF .AZ "\r\n"
MSG.INIT .AZ "\e[?7h" Enable Line Wrap
MSG.OFFSET .AZ "%h%h%h " MSG.OFFSET .AZ "%h%h%h "
MSG.HEXBYTE .AZ "%h " MSG.HEXBYTE .AZ "%h "
*-------------------------------------- *--------------------------------------