A2osX/BIN/SH.S.CMD.txt
burniouf 04a83f00f3 SH:new ALIAS cmd, new && operator
MKDIR:completely implemented
LS/RM/MV/CP: combined switches
KERNEL:SList API now handle options to handle several languages/parsers
2022-10-07 21:21:37 +02:00

1320 lines
21 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
AUTO 3,1
.LIST OFF
*--------------------------------------
* https://linuxize.com/post/how-to-create-bash-aliases/
*--------------------------------------
CMD.ALIAS lda (ZPArgVBufPtr)
bne CMD.ALIAS.ADD
>LDA.G hAliases
beq .8
ldy #0
lda #1
.1 >STYA ZPTmpW Save KeyID
clc
jsr CMD.ALIAS.Push
>SYSCALL SListGetByID
bcs .8
>STYA ZPPtr1 NextID
>LDYA ZPCLBuf
jsr PrintYANoCR
bcs .9
sec
jsr CMD.ALIAS.Push
>SYSCALL SListGetData
bcs .9
>PUSHW L.MSG.ALIAS
>PUSHW ZPCLBuf
>PUSHBI 2
>SYSCALL PrintF
bcs .9
>LDYA ZPPtr1
bra .1
.8 clc
.9 rts
*--------------------------------------
CMD.ALIAS.ADD >LDYA ZPArgVBufPtr
>STYA ZPVarNamePtr
jsr CORE.ArgV.Next
beq .9
cmp #'='
bne .99
jsr CORE.ArgV.Next
beq .9
>LDA.G hAliases
bne .1
lda #0
>SYSCALL SListNew
bcs .99
>STA.G hAliases
.1 >PUSHA
>PUSHW ZPVarNamePtr
>SYSCALL SListNewKey
bcs .99
>STYA ZPTmpW Save KeyID
>PUSHB.G hAliases
>PUSHW ZPTmpW KeyID
>PUSHW ZPArgVBufPtr DataPtr
>PUSHWZ String Mode
>SYSCALL SListAddData
rts
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
CMD.ALIAS.Push >PUSHB.G hAliases
>PUSHW ZPTmpW KeyID
>PUSHW ZPCLBuf
bcc .8
>PUSHWI $ffff All
>PUSHWZ from Start
.8 rts
*--------------------------------------
CMD.. lda (ZPArgVBufPtr)
beq CMD...9
>LDYA ZPArgVBufPtr
>SYSCALL LoadTxtFile
bcs CMD.SHIFTA.RTS
>LDYA ZPArgVBufPtr Exec . file
CMD..EXEC.YAX jsr CORE.Load.YAX Y,A = Args, X = Code
bcs CMD.SHIFTA.RTS
lda #$C0+C..
jmp CORE.StkPush
CMD...9 jmp CMD.E.CSYN
*--------------------------------------
CMD.NOHUP lda (ZPArgVBufPtr)
beq CMD...9
lda #S.PS.F.NOHUP
tsb CORE.PSFlags
jmp CORE.ExecExtCmd
*--------------------------------------
CMD.SHIFT lda (ZPArgVBufPtr)
beq CMD.SHIFT.1
jsr EXP.GetInt8Exp
bcs CMD.SHIFTA.RTS
.HS B0 BCS
CMD.SHIFT.1 inc
CMD.SHIFTA >SYSCALL Shift
CMD.SHIFTA.RTS rts
*--------------------------------------
CMD.PUSHD >LDA.G PUSHD.STACK
cmp #PUSHD.STACK+PUSHD.STACK.MAX
beq CMD.POPD.CSYN
jsr GetCWD
>SYSCALL StrDup
bcs CMD.POPD.CSYN
>INC.G PUSHD.STACK
tay
txa
sta (pData),y
lda (ZPArgVBufPtr)
bne CMD.CD.0
* clc
.9 rts
*--------------------------------------
CMD.POPD >LDA.G PUSHD.STACK
cmp #PUSHD.STACK
beq CMD.POPD.CSYN
tay
lda (pData),y
jsr CMD.SetCWDA
>DEC.G PUSHD.STACK
clc
CMD.POPD.RTS rts
CMD.POPD.CSYN jmp CMD.E.CSYN
*--------------------------------------
CMD... lda (ZPArgVBufPtr)
bne CMD.POPD.CSYN
>LDYA L.CD..
bra CMD.CD.YA
*--------------------------------------
CMD.CD lda (ZPArgVBufPtr)
beq CMD.CD.HOME
CMD.CD.0 >LDYA ZPArgVBufPtr
bra CMD.CD.YA
CMD.CD.HOME >LDYA L.HOME
CMD.CD.YA >PUSHYA
>PUSHWZ Allocate
>SYSCALL RealPath
bcs CMD.POPD.RTS
>STYA ZPPtr1
stx ZPTmpW Save hMem
ldy #1
lda (ZPPtr1),y
bne .12
txa
jmp CMD.SetCWDA we have '/'
.12 >LDYA ZPPtr1
jsr IO.StatYA
bcs .19
cmp /S.STAT.MODE.DIR
beq .11
lda #MLI.E.INVPATH
.19 pha
lda ZPTmpW
>SYSCALL FreeMem
pla
sec
rts
.11 jsr GetPtr1LenY
dey
lda #'/'
cmp (ZPPtr1),y
beq .14
iny
sta (ZPPtr1),y
iny
lda #0
sta (ZPPtr1),y
.14 lda ZPTmpW
*--------------------------------------
CMD.SetCWDA pha
ldy #S.PS.hCWD
lda (pPS),y
>SYSCALL FreeMem
pla
ldy #S.PS.hCWD
sta (pPS),y
lda #0
* clc
rts
*--------------------------------------
CMD.SET lda (ZPArgVBufPtr)
bne CMD.SET.1
* No arg, print all ENV
>PUSHWZ
>PUSHWZ
>SYSCALL GetEnv
>STYA ZPPtr1
stx ZPTmpW
.1 lda (ZPPtr1)
beq .8 Ending 0 ?
>LDYA ZPPtr1
>SYSCALL PutS
bcs .9
jsr GetPtr1NextString
bra .1
.8 lda ZPTmpW
>SYSCALL FreeMem
* clc
.9 rts
*--------------------------------------
* SET +X VAR = VALUE1 op VALUE2 op VALUE3 ...
*--------------------------------------
CMD.SET.1
.1 jsr CMD.IsSwitch
bcs .6
ldx #SET.VARS-SET.FLAGS-1
.2 cmp SET.FLAGS,x
bne .3
lda SET.VARS,x
eor bState
sta bState
bra .5
.3 dex
bpl .2
.4 cmp #'F'
bne .99
jsr CORE.FUNCRESET
.5 jsr CORE.ArgV.Next
bne .1
clc
rts
*--------------------------------------
.6 >LDYA ZPArgVBufPtr
>STYA ZPVarNamePtr
jsr CORE.ArgV.Next
beq CMD.SET.GET
cmp #'='
bne .99
ldy #1
lda (ZPArgVBufPtr),y
bne .99
jsr CORE.ArgV.Next
beq CMD.SET.UNSET
cmp #'`'
beq CMD.SET.EXEC
jsr EXP.GET
bcc CMD.SET.YA
rts
.99 jmp CMD.E.CSYN
CMD.SET.YA pha
>PUSHW ZPVarNamePtr
pla
>PUSHYA
>SYSCALL SetEnv
rts
CMD.SET.UNSET >PUSHW ZPVarNamePtr
>SYSCALL UnsetEnv
rts
CMD.SET.GET >PUSHW ZPVarNamePtr
>PUSHW ZPCLBuf
>SYSCALL GetEnv
bcs .8
>LDYA ZPCLBuf
>SYSCALL PutS
rts
.8 clc
CMD.SET.RTS rts
*--------------------------------------
CMD.SET.EXEC jsr CORE.ArgV.NextChar skip "`"
jsr IO.Pipe.Out
bcs CMD.SET.RTS
jsr IO.Exec
bcs CMD.SET.RTS
jsr IO.Pipe.In
bcs CMD.SET.RTS
* clc Silent Mode
jsr CL.ReadReset
jmp CMD.READ.VAR
*--------------------------------------
CMD.DATE >PUSHEA.G TimeBuf
>SYSCALL Time
>PUSHW ZPCLBuf
lda (ZPArgVBufPtr)
beq .1
>LDYA ZPArgVBufPtr
bra .2
.1 >LDYA L.FMT.DATE
.2 >PUSHYA
>PUSHEA.G TimeBuf
>SYSCALL StrFTime
CMD.DATE.PRINT >LDYA ZPCLBuf
>SYSCALL PutS
rts
*--------------------------------------
CMD.ECHO stz ZPPtr1 echo -N
stz ZPPtr1+1 Token Cnt
lda (ZPArgVBufPtr)
beq .7
.1 jsr CMD.IsSwitch
bcs .2
cmp #'N'
bne CMD.ECHO.CSYN
lda #$ff
eor ZPPtr1
sta ZPPtr1
bra .4
.2 lda ZPPtr1+1
beq .3
lda #C.SPACE
>SYSCALL PutChar
.3 >LDYA ZPArgVBufPtr
jsr PrintYANoCR
bcs .9
inc ZPPtr1+1
.4 jsr CORE.ArgV.Next
bne .1
.7 bit ZPPtr1
bmi .8
>LDYA L.MSG.ECHOCRLF
jmp PrintYANoCR
.8 clc
.9 rts
CMD.ECHO.CSYN lda #E.CSYN
sec
CMD.ECHO.RTS rts
*--------------------------------------
CMD.READ lda (ZPArgVBufPtr)
beq CMD.ECHO.CSYN
stz ZPVarNamePtr+1
jsr CL.ReadResetV
.1 jsr CMD.IsSwitch
bcs .4
cmp #'S'
bne .2
lda #$ff
>STA.G CL.bSilent
bra .5
.2 cmp #'P'
bne .3
jsr CORE.ArgV.Next
beq CMD.ECHO.CSYN
>LDYA ZPArgVBufPtr
jsr PrintYANoCR
bcs CMD.ECHO.RTS
bra .5
.3 cmp #'N'
bne CMD.ECHO.CSYN
jsr CORE.ArgV.Next
beq CMD.ECHO.CSYN
jsr EXP.GetInt8Arg
bcs CMD.ECHO.RTS
>STA.G CL.MaxCnt
bra .5
.4 >LDYA ZPArgVBufPtr
>STYA ZPVarNamePtr
.5 jsr CORE.ArgV.Next
bne .1
lda ZPVarNamePtr+1
beq CMD.ECHO.CSYN
*--------------------------------------
CMD.READ.VAR jsr CL.Reset
.1 >SYSCALL GetChar
bcs CMD.SLEEP.RTS
jsr CL.CHARIN
>LDA.G CL.bReady
bpl .1
lda (ZPCLBuf)
bne .2
jmp CMD.SET.UNSET
.2 >LDYA ZPCLBuf
jmp CMD.SET.YA
*--------------------------------------
CMD.SLEEP lda (ZPArgVBufPtr)
beq CMD.REN.CSYN
jsr EXP.GetInt32Arg
bcs CMD.SLEEP.RTS
>PULLL.G Sleep
CMD.SLEEP.RTS rts
*--------------------------------------
CMD.PAUSE lda #bState.Pause
tsb bState
clc
rts
*--------------------------------------
CMD.MD lda (ZPArgVBufPtr)
beq CMD.REN.CSYN
>PUSHW ZPArgVBufPtr
>PUSHWI S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.FU
>SYSCALL MKDir
rts
*--------------------------------------
CMD.PWD jsr GetCWD
>SYSCALL PutS
rts
*--------------------------------------
CMD.RD lda (ZPArgVBufPtr)
beq CMD.REN.CSYN
jsr IO.StatArgVBufPtr
bcs .99
cmp /S.STAT.MODE.DIR
bne CMD.REN.CSYN
>LDYA ZPArgVBufPtr
>SYSCALL Remove
.99 rts
*--------------------------------------
CMD.REN.CSYN jmp CMD.E.CSYN
CMD.REN lda (ZPArgVBufPtr)
beq CMD.REN.CSYN
jsr CORE.ArgV.Next
lda (ZPArgVBufPtr)
beq CMD.REN.CSYN
>PUSHW ZPArgVBufPrev old path
>PUSHWZ Allocate
>SYSCALL RealPath
bcs CMD.REN.CSYN
>STYA ZPPtr1
stx ZPTmpW
ldy #$ff
.1 iny
lda (ZPPtr1),y
beq .2
cmp #'/'
bne .1
tya
tax
bra .1
.2 ldy #$ff
.3 iny
inx
lda (ZPArgVBufPtr),y
bne .3
txa
tay
lda #0
>SYSCALL GetMem
bcs .90
>STYA ZPPtr2
stx ZPTmpW+1
ldy #$ff
.4 iny
lda (ZPPtr1),y
beq .5
sta (ZPPtr2),y
cmp #'/'
bne .4
tya
inc
tax
bra .4
.5 txa
tay
lda #0
sta (ZPPtr2),y
>PUSHW ZPPtr2
>PUSHW ZPArgVBufPtr
>SYSCALL StrCat
lda ZPTmpW
>SYSCALL FreeMem
lda ZPTmpW+1
sta ZPTmpW
>PUSHW ZPPtr1
>PUSHW ZPPtr2
>SYSCALL Rename
.90 php
pha
lda ZPTmpW
>SYSCALL FreeMem
pla
plp
rts
*--------------------------------------
CMD.FUNCTION lda (ZPArgVBufPtr)
beq .9
jsr CORE.StkGetCtx
bcc .9 No context allowed
>LDA.G hFunctions
bne .1
lda #SL..+SL._
>SYSCALL SListNew
bcs .99
>STA.G hFunctions
.1 >PUSHA
>PUSHW ZPArgVBufPtr
>SYSCALL SListNewKey
bcs .99
>STYA ZPTmpW Save KeyID
jsr CORE.ArgV.Next nothing after function name
beq .10
cmp #'{'
bne .9
ldy #1
lda (ZPArgVBufPtr),y
beq .11
.9 jmp CMD.E.CSYN
.99 rts
*--------------------------------------
.10 jsr CORE.GetCharNB
bcs .9
cmp #'{'
bne .9
jsr CORE.GetNextCharNB
bcs .9
.11 >LDYA ZPInputBufPtr
>STYA ZPPtr1
stz ZPPtr2
stz ZPPtr2+1 DataLen
ldx #0 '{' counter
lda (ZPInputBufPtr)
beq .6
.12 cmp #'{'
bne .13
inx
bra .14
.13 cmp #'}'
bne .14
dex
bmi .7
.14 inc ZPPtr2
bne .15
inc ZPPtr2+1
.15 jsr CORE.GetNextChar
bcc .12
.6 txa
bpl .9
.7 jsr CORE.GetNextChar skip ending '}'
>PUSHB.G hFunctions
>PUSHW ZPTmpW KeyID
>PUSHW ZPPtr1 DataPtr
>PUSHW ZPPtr2 DataLen
>SYSCALL SListAddData
bcs .99
>PUSHB.G hFunctions
>PUSHW ZPTmpW KeyID
>PUSHW L.PtrZero DataPtr
>PUSHWI 1 DataLen
>SYSCALL SListAddData Add Ending \0
rts
*--------------------------------------
CMD.CALL jsr CMD.CALL.GETFUNC
bcs CMD.CALL.RTS
>STYA ZPTmpW KeyID
>PUSHB.G hFunctions
>PUSHW ZPTmpW KeyID
>PUSHWZ Allocate..
>PUSHWI $ffff all
>PUSHWZ From Start
>SYSCALL SListGetData X = hMem
bcs CMD.CALL.RTS
>LDYA ZPArgVBufPtr FUNC PARAM1 PARAM2...
jsr CORE.Load.YAX Exec FUNC
bcs CMD.CALL.RTS
lda #$C0+C.CALL
jmp CORE.StkPush
*--------------------------------------
CMD.CALL.GETFUNC
>LDA.G hFunctions
beq CMD.CALL.UNDEF
>PUSHB.G hFunctions
>PUSHW ZPArgVBufPtr
>SYSCALL SListLookup
bcc CMD.CALL.RTS
CMD.CALL.UNDEF lda #E.FUNDEF
sec
CMD.CALL.RTS rts
*--------------------------------------
CMD.EXIT lda (ZPArgVBufPtr)
beq .1 no arg, exit 0
jsr EXP.GetInt8Exp
bcs .9
.1 ldy #S.PS.RC
sta (pPS),y
.2 jsr CORE.StkPull Pull everything until CALL . CL...
bcs .9
cmp #$C0+C.. in CALL, "." or CL context ?
beq CMD.EXIT.FILE
cmp #$C0+C.CALL
beq CMD.EXIT.FILE
cmp #$C0+C.CLEXEC
beq .8
jsr CORE.StkPopCtxA
bcc .2
rts
.8 jsr CMD.EXIT.FILE
lda #bState.ExitOnEOF
tsb bState
clc
.9 rts
*--------------------------------------
CMD.EXIT.FILE jsr CORE.StkPullFree Code buffer
ldy #S.PS.hARGV
lda (pPS),y
>SYSCALL FreeMem ArgV buffer
jsr CORE.StkPull
ldy #S.PS.hARGV
sta (pPS),y
jsr CORE.StkPull
ldy #S.PS.ARGC
sta (pPS),y
jsr CORE.StkPullInputBufPtr
jsr CORE.StkPull
sta ZPInputBuf
jsr CORE.StkPull
sta ZPInputBuf+1
ldy #S.PS.RC
lda (pPS),y
clc
rts
*--------------------------------------
CMD.BREAK jsr CORE.StkGetCtx Get context in CORE.TestResult
bcs .9
tax
and #$3F
cmp #C.CASE
bne .9
txa
bpl .8
jsr CORE.StkPull remove C.CASE
jsr CORE.StkGet
and #$7F
sta (pData),y
.8 clc
rts
.9 jmp CMD.E.CSYN
*--------------------------------------
* stack-1 hVALUE
* stack SWITCH TOKEN
*--------------------------------------
CMD.SWITCH jsr CORE.StkGetCtx
lda #2
jsr CORE.StkCheck
bcs .9
jsr EXP.GET
bcs .9
>SYSCALL StrDup
bcs .9
txa
jsr CORE.StkPush Push EXP hVALUE
lda CORE.TestResult
beq .1
ora #$80
.1 ora #C.SWITCH
jmp CORE.StkPush
.9 rts
*--------------------------------------
CMD.CASE jsr CORE.StkGetCtx Get context in CORE.TestResult
bcs .9
tax
and #$3F
cmp #C.SWITCH
beq .1
cmp #C.CASE
bne .9
txa previous case was true ?
bpl .10
jsr EXP.GET skip expression
bcs .9
rts keep existing context
.10 jsr CORE.StkPull remove previous C.CASE
bra CMD.CASE
.1 jsr EXP.GET
bcs .9
>PUSHYA
lda (pData)
tay
dey get hVALUE
lda (pData),y
>SYSCALL GetMemPtr
>PUSHYA
>SYSCALL StrCmp
ror CS if !=
and #$80
eor #$80
ora CORE.TestResult
ora #C.CASE
jmp CORE.StkPush
.9
CMD.E.CSYN lda #E.CSYN
sec
rts
*--------------------------------------
CMD.DEFAULT jsr CORE.StkGetCtx Get context in CORE.TestResult
bcs CMD.E.CSYN
and #$3F
cmp #C.SWITCH
beq .1
cmp #C.CASE
bne CMD.E.CSYN
jsr CORE.StkPull remove C.CASE
.1 jsr CORE.StkGet
and #$C0
ora #C.DEFAULT
jmp CORE.StkPush
*--------------------------------------
CMD.END jsr CORE.StkGetCtx Get context in CORE.TestResult
bcs CMD.E.CSYN
and #$3F
cmp #C.SWITCH
beq .8
cmp #C.CASE
beq .8
cmp #C.DEFAULT
bne CMD.E.CSYN
.8 jmp CORE.StkPopCtx
*--------------------------------------
CMD.FOR jsr CORE.StkGetCtx
lda (ZPArgVBufPtr)
beq CMD.E.CSYN
>LDYA ZPArgVBufPtr
>STYA ZPVarNamePtr
jsr CORE.ArgV.Next
beq CMD.E.CSYN
>PUSHW L.IN
>PUSHW ZPArgVBufPtr
>SYSCALL StrCaseCmp
bcs CMD.E.CSYN
jsr CORE.ArgV.Next
beq CMD.E.CSYN
lda #8 Make sure 8 bytes free on stack
jsr CORE.StkCheck
bcs FOR.FILE.9
lda (ZPArgVBufPtr)
cmp #'('
beq CMD.FOR.FILE
cmp #'`'
beq CMD.FOR.EXEC
*--------------------------------------
CMD.FOR.LIST >LDYA ZPArgVBufPtr
>SYSCALL StrDup
bcs FOR.FILE.9
phy
pha
jsr CORE.StkPushInputBufPtr Push CmdPtr AFTER FOR
pla
ply
jsr CORE.StkPushYAX Push listPtr,hList
jsr CORE.PushVarName Push hVARNAME
lda #C.FOR.LIST
jsr CORE.StkPush
lda #C.FOR
jsr CORE.StkPush
jsr CMD.NEXT.LIST.TOKEN
bcc CMD.FOR.LOOP
rts
*--------------------------------------
CMD.FOR.FILE jsr CORE.ArgV.NextChar skip "("
>LDYA ZPArgVBufPtr
ldx #O.RDONLY+O.TEXT
jsr IO.FOpenYAX
bcc CMD.FOR.PUSH
FOR.FILE.9 rts
*--------------------------------------
CMD.FOR.EXEC jsr CORE.ArgV.NextChar skip "`"
jsr IO.Pipe.Out
bcs FOR.FILE.9
jsr IO.Exec
bcs FOR.FILE.9
jsr IO.Pop.Out Restore OUT (NO close)
jsr IO.Pipe.OpenR
bcs FOR.FILE.9
CMD.FOR.PUSH pha save hFILE/hPIPE
jsr CORE.StkPushInputBufPtr Push CmdPtr AFTER FOR
pla
jsr CORE.StkPush push hPIPE for read
jsr CORE.PushVarName Push hVARNAME
* bcs FOR.FILE.9
lda #C.FOR.FILEEXEC
jsr CORE.StkPush
lda #C.FOR
jsr CORE.StkPush
jsr CMD.NEXT.LINE
bcs FOR.FILE.9
CMD.FOR.LOOP ora CORE.TestResult
ora #C.FOR Push FOR
pha
lda (pData)
tay
pla
sta (pData),y
* clc
rts
*--------------------------------------
CMD.NEXT jsr CORE.StkGet Y = StkPtr
bcs .9
and #$3F
cmp #C.FOR
bne .9
dey
lda (pData),y
iny
tax
beq CMD.NEXT.LIST
jmp CMD.NEXT.FILEEXEC
.9 lda #E.NOFOR
sec
rts
*--------------------------------------
* stack-6 CmdPtr
* stack-4 ListPtr
* stack-3 hLIST
* stack-2 hVARNAME
* stack-1 FOR SUB TOKEN
* stack FOR TOKEN
*--------------------------------------
CMD.NEXT.LIST lda (pData),y Y = StkPtr
bpl .1
jsr CMD.NEXT.LIST.TOKEN
bcs .9
bpl .1
lda (pData)
sec
sbc #6
jmp CMD.NEXT.FILEEXEC.LOOPY
.1 lda (pData)
tay
sec
sbc #8
sta (pData)
dey
dey
lda (pData),y hVARNAME
pha
dey
lda (pData),y hLIST
>SYSCALL FreeMem
pla
>SYSCALL FreeMem
* clc
.9 rts
*--------------------------------------
CMD.NEXT.LIST.TOKEN
jsr CMD.NEXT.GetVarNamePtr
dey skip hLIST
dey
lda (pData),y
sta ZPPtr1
dey
lda (pData),y
sta ZPPtr1+1
ldy #0
.10 jsr GetPtr1NextChar
beq .3
cmp #C.SPACE
beq .10
sta (ZPCLBuf),y
iny
.1 jsr GetPtr1NextChar
beq .3
cmp #C.SPACE
beq .3
sta (ZPCLBuf),y
iny
bra .1
.3 lda #0
sta (ZPCLBuf),y
tya
beq .8
>LDYA ZPCLBuf
jsr CMD.SET.YA
bcs .9
lda (pData)
sec
sbc #4
tay
lda ZPPtr1
sta (pData),y
dey
lda ZPPtr1+1
sta (pData),y
lda #$80
clc
.9 rts
.8 jmp CMD.NEXT.END
*--------------------------------------
* stack-4 CmdPtr
* stack-3 hFILE/hPIPE
* stack-2 hVARNAME
* stack-1 FOR SUB TOKEN
* stack FOR TOKEN
*--------------------------------------
CMD.NEXT.FILEEXEC
lda (pData),y Y = StkPtr
bpl CMD.NEXT.FILEEXEC.POP
jsr CMD.NEXT.LINE
bcs CMD.NEXT.FILEEXEC.9
bpl CMD.NEXT.FILEEXEC.POP end of file/pipe
lda (pData)
sec
sbc #4
CMD.NEXT.FILEEXEC.LOOPY
tay
lda (pData),y
sta ZPInputBufPtr
dey
lda (pData),y
sta ZPInputBufPtr+1
clc
CMD.NEXT.FILEEXEC.9
rts
CMD.NEXT.FILEEXEC.POP
lda (pData)
tay
sec
sbc #6
sta (pData)
dey
dey
lda (pData),y hVARNAME
pha
dey
lda (pData),y hFILE/hPIPE
>SYSCALL FClose
pla
>SYSCALL FreeMem
* clc
rts
*--------------------------------------
CMD.NEXT.LINE jsr CMD.NEXT.GetVarNamePtr
dey
lda (pData),y hFILE/hPIPE
>PUSHA
>PUSHW ZPCLBuf
>PUSHWI 256
>SYSCALL FGetS
bcs CMD.NEXT.END
>LDYA ZPCLBuf
jsr CMD.SET.YA
bcs CMD.NEXT.LINE.RTS
lda #$80
* clc
rts
CMD.NEXT.END jsr CMD.SET.UNSET
bcs .9
lda #0
clc keep this CLC for CMD.NEXT.LIST.TOKEN
.9
CMD.NEXT.LINE.RTS
rts
*--------------------------------------
CMD.NEXT.GetVarNamePtr
lda (pData)
dec skip FOR
dec skip SUB TOKEN
tay
lda (pData),y
phy
>SYSCALL GetMemPtr hVARNAME
>STYA ZPVarNamePtr
ply
rts
*--------------------------------------
CMD.WHILE
CMD.IF jsr CORE.StkGetCtx
bit #$40 Parent is true ?
beq .3
jsr EXP.TEST
bcs CMD.NEXT.LINE.RTS
.3 lda CORE.IntCmd
cmp #C.WHILE
bne .8
lda #3
jsr CORE.StkCheck
bcs CMD.NEXT.LINE.RTS
>LDYA ZPInputCmdPtr
jsr CORE.StkPushYA Push BEFORE WHILE/IF
.8 lda CORE.TestResult
ora CORE.IntCmd
jmp CORE.StkPush
*--------------------------------------
CMD.LOOP jsr CORE.StkPull
bcs .9
tax
and #$3F
cmp #C.WHILE
bne .9
txa
bmi .8 true, loop
jmp CORE.StkPopCtxA false, Discard loop Ptr
.8 jmp CORE.StkPullInputBufPtr
.9 lda #E.NOWHILE
sec
rts
*--------------------------------------
CMD.ELSE jsr CORE.StkGet
bcs .9
bit #$40 parent is true ?
beq .8 no, skip
tax
and #$3F
cmp #C.IF
bne .9
txa
eor #$80 toggle and store at stack ptr
sta (pData),y
.8 clc
rts
.9
CMD.ELSE.NOIF lda #E.NOIF
sec
rts
*--------------------------------------
CMD.FI jsr CORE.StkPull
bcs CMD.ELSE.NOIF
and #$3F
cmp #C.IF
bne CMD.ELSE.NOIF
clc
rts
*--------------------------------------
CMD.IsSwitch lda (ZPArgVBufPtr)
cmp #'-'
bne .9
ldy #1
lda (ZPArgVBufPtr),y
beq .9
cmp #'0' is -0 ... -9 ?
bcc .9
cmp #'9'+1
bcc .9
tax
iny
lda (ZPArgVBufPtr),y
bne .9
txa
jmp ToUpperCase
.9 sec
rts
*--------------------------------------
MAN
SAVE usr/src/bin/sh.s.cmd
LOAD usr/src/bin/sh.s
ASM