NEW
  AUTO 3,1
*--------------------------------------
CMD.ALIAS		lda (ZPArgVBufPtr)
				beq .10

				jmp CMD.ALIAS.ADD

.10				>LDA.G hAliases
				beq .8

				ldy #0
				lda #1

.1				>STYA ZPTmpW			Save KeyID

				>PUSHB.G hAliases
				>PUSHW ZPTmpW			KeyID
				>PUSHW ZPCLBuf
				>SYSCALL SListGetByID
				bcs .8

				>STYA ZPPtr1			NextID

				ldy #hAliases
				jsr CORE.SListGetData
				bcs .9

				phx

				>PUSHW L.MSG.ALIAS
				>PUSHW ZPCLBuf
				txa
				>SYSCALL GetMemPtr
				>PUSHYA
				>PUSHBI 4
				>SYSCALL PrintF

				pla
				>SYSCALL FreeMem

				>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
				>PUSHWZ					ScopeID
				>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..			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 STK.Push

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 -E
				stz ZPPtr1+1			echo -N

				stz ZPPtr2				index in buffer

				lda (ZPArgVBufPtr)
				beq .7

.1				jsr CMD.IsSwitch
				bcs .3

				ldx #0
				cmp #'E'
				beq .2

				inx

				cmp #'N'
				bne CMD.ECHO.CSYN

.2				ror ZPPtr1,x
				bra .6

.3				ldy ZPPtr2
				beq .4

				lda #C.SPACE
				sta (ZPCLBuf),y
				inc ZPPtr2

.4				ldy #$ff

.5				iny
				lda (ZPArgVBufPtr),y
				beq .6

				phy
				ldy ZPPtr2
				sta (ZPCLBuf),y
				inc ZPPtr2
				ply
				bra .5

.6				jsr CORE.ArgV.Next
				bne .1

.7				ldy ZPPtr2

				bit ZPPtr1+1			-N
				bmi .8

				lda #C.CR
				sta (ZPCLBuf),y
				iny
				lda #C.LF
				sta (ZPCLBuf),y
				iny

.8				lda #0
				sta (ZPCLBuf),y

				>LDYA ZPCLBuf
				bit ZPPtr1
				bmi .80

				jmp IO.OutYA

.80				jmp IO.EscOutYA

.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 IO.OutYA
				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 STK.GetCtx
				bcc .9					No context allowed

				>LDA.G hFunctions
				bne .1

				lda #SL..+SL._
				>SYSCALL SListNew
				bcs .99

				>STA.G hFunctions

.1				>PUSHA
				>PUSHW ZPArgVBufPtr
				>PUSHWZ					ScopeID
				>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

				ldy #hFunctions
				jsr CORE.SListGetData
				bcs CMD.CALL.RTS

				>LDYA ZPArgVBufPtr		FUNC PARAM1 PARAM2...
				jsr CORE.Load.YAX		Exec FUNC
				bcs CMD.CALL.RTS

				lda #$C0+C.CALL
				jmp STK.Push
*--------------------------------------
CMD.CALL.GETFUNC
				>LDA.G hFunctions
				beq CMD.CALL.UNDEF

				>PUSHB.G hFunctions
				>PUSHW ZPArgVBufPtr
				>PUSHWZ					ScopeID
				>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 STK.Pull		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 STK.PopCtxA
				bcc .2
				rts

.8				jsr CMD.EXIT.FILE
				lda #bState.ExitOnEOF
				tsb bState

				clc
.9				rts
*--------------------------------------
CMD.EXIT.FILE	jsr STK.PullFree		Code buffer

				ldy #S.PS.hARGV
				lda (pPS),y
				>SYSCALL FreeMem		ArgV buffer

				jsr STK.Pull
				ldy #S.PS.hARGV
				sta (pPS),y

				jsr STK.Pull
				ldy #S.PS.ARGC
				sta (pPS),y

				jsr STK.PullInputBufPtr

				jsr STK.Pull
				sta ZPInputBuf
				jsr STK.Pull
				sta ZPInputBuf+1

				ldy #S.PS.RC
				lda (pPS),y

				cmp #1
				
				rts
*--------------------------------------
CMD.BREAK		jsr STK.GetCtx			Get context in CORE.TestResult
				bcs .9

				tax
				and #$3F

				cmp #C.CASE
				bne .1

				txa
				bpl .8					already FALSE

				jsr STK.Pull			remove C.CASE
				jsr STK.Get				get SWITCH
				bra .7
*--------------------------------------
.1				cmp #C.IF
				bne .2

				sta (pData),y			IF=false to skip until FI

				dey						get parent context
				beq .9

				lda (pData),y
				and #$3F

.2				cmp #C.WHILE
				beq .6

.3				cmp #C.FOR
				bne .9

.6				lda (pData),y

.7				and #%01111111
				sta (pData),y			WHILE/FOR=false, Parent=unchanged

.8				clc
				rts

.9				jmp CMD.E.CSYN
*--------------------------------------
* stack-1		hVALUE
* stack			SWITCH TOKEN
*--------------------------------------
CMD.SWITCH		jsr STK.GetCtx

				lda #2
				jsr STK.Check
				bcs .9

				jsr EXP.GET
				bcs .9

				>SYSCALL StrDup
				bcs .9

				txa
				jsr STK.Push			Push EXP hVALUE

				lda CORE.TestResult
				beq .1

				ora #$80

.1				ora #C.SWITCH
				jmp STK.Push

.9				rts
*--------------------------------------
CMD.CASE		jsr STK.GetCtx			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 STK.Pull			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 STK.Push
.9
CMD.E.CSYN		lda #E.CSYN
				sec
				rts
*--------------------------------------
CMD.DEFAULT		jsr STK.GetCtx			Get context in CORE.TestResult
				bcs CMD.E.CSYN

				and #$3F

				cmp #C.SWITCH
				beq .1

				cmp #C.CASE
				bne CMD.E.CSYN

				jsr STK.Pull			remove C.CASE

.1				jsr STK.Get
				and #$C0
				ora #C.DEFAULT
				jmp STK.Push
*--------------------------------------
CMD.END			jsr STK.GetCtx			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 STK.PopCtx
*--------------------------------------
CMD.FOR			jsr STK.GetCtx

				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 STK.Check
				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 STK.PushInputBufPtr  Push CmdPtr AFTER FOR

				pla
				ply

				jsr STK.PushYAX			Push listPtr,hList

				jsr CORE.PushVarName	Push hVARNAME

				lda #C.FOR.LIST
				jsr STK.Push
				lda #C.FOR
				jsr STK.Push

				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 STK.PushInputBufPtr		Push CmdPtr AFTER FOR

				pla

				jsr STK.Push			push hPIPE for read
				jsr CORE.PushVarName	Push hVARNAME
*				bcs FOR.FILE.9

				lda #C.FOR.FILEEXEC
				jsr STK.Push
				lda #C.FOR
				jsr STK.Push

				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 STK.Get				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 STK.GetCtx

				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 STK.Check
				bcs CMD.NEXT.LINE.RTS

				>LDYA ZPInputCmdPtr
				jsr STK.PushYA			Push BEFORE WHILE/IF

.8				lda CORE.TestResult
				ora CORE.IntCmd
				jmp STK.Push
*--------------------------------------
CMD.LOOP		jsr STK.Pull
				bcs .9

				tax
				and #$3F
				cmp #C.WHILE
				bne .9

				txa
				bmi .8					true, loop

				jmp STK.PopCtxA			false, Discard loop Ptr

.8 				jmp STK.PullInputBufPtr

.9				lda #E.NOWHILE
				sec
				rts
*--------------------------------------
CMD.ELSE		jsr STK.Get
				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 STK.Pull
				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
