diff --git a/BIN/SHELL.S.CMD.txt b/BIN/SHELL.S.CMD.txt index 00873a13..478c163d 100644 --- a/BIN/SHELL.S.CMD.txt +++ b/BIN/SHELL.S.CMD.txt @@ -3,30 +3,6 @@ PREFIX AUTO 4,1 .LIST OFF *-------------------------------------- -CMD.Init >LDYAI 256 - >SYSCALL GetMem - bcs .9 - >STYA ZPArgVBuf - txa - >STA.G CORE.hArgVBuf - - lda #PUSHD.STACK - tay - sta (pData),y - -.9 rts -*-------------------------------------- -CMD.Quit ldy #CORE.hArgVBuf - jsr .8 - - ldy #hFileBuf - -.8 lda (pData),y - beq .9 - >SYSCALL FreeMem - clc -.9 rts -*-------------------------------------- * Read From InputBuf *-------------------------------------- CMD.Get >LDYA ZPInputBufPtr diff --git a/BIN/SHELL.S.CORE.txt b/BIN/SHELL.S.CORE.txt index a37bf32e..a331cfa1 100644 --- a/BIN/SHELL.S.CORE.txt +++ b/BIN/SHELL.S.CORE.txt @@ -6,11 +6,11 @@ AUTO 4,1 * From hCLBuf or hFileBuf * Get Line from buf until ;, CR, \0 (EOL / EOF) * :LOOP -* if previous | : +* if CmdSep=| : * set hStdIn = hStdOut * set hStdOut = Std * GetCmd from line until | or EOL -* if | : +* if CmdSep=| : * create PIPE * set hStdOut -> PIPE * CORE.Exec & @@ -25,11 +25,91 @@ AUTO 4,1 * set hStdIn = hStdOut * set hStdOut = Std *-------------------------------------- -CORE.Run +* Input : ZPInputBufPtr *-------------------------------------- -* Input : CORE.IntCmd,ZPArgVBuf +CORE.Exec >STZ.G CL.CmdSep + + >STZ.G CORE.IntCmd + + lda #S.PS.F.HOLD+S.PS.F.DUPENV + >STA.G CORE.PSFlags + + >PUSHW ZPCLBuf + >LDYA ZPCLBuf + >STYA ZPCLBufPtr + + >SYSCALL Args2ArgV TOKENIZE CL in ZPCLBuf + + lda (ZPCLBufPtr) + beq .8 + + cmp #'#' comment ? + beq .8 + +.10 >LDA.G CL.CmdSep + cmp #'|' + bne .11 + + PIPE + +.11 >LDYAI 256 + >SYSCALL GetMem + bcs .9 + >STYA ZPArgVBuf + >STYA ZPArgVBufPtr + txa + >STA.G CORE.hArgVBuf + +.12 lda #0 + sta (ZPArgVBuf) + +.1 cmp #'#' comment ? + beq .8 yes, ignore remaining + + >LDA.G CORE.IntCmd + bne .3 we already have Cmd, go check args + + ldy #1 + lda (ZPCLBufPtr),y only one char ? + bne .2 + + lda (ZPCLBufPtr) + cmp #'.' leading dot ? + bne .2 + + >LDA.G CORE.PSFlags yes, child process will run in same ENV + and #$ff^S.PS.F.DUPENV + sta (pData),y + bra .6 and skip this token + +.2 + +.3 jsr CL.CheckIO + bcc .7 IO token & related args processed + tay an error ? + bne .9 yes...I/O error... + + jsr CL.AddCLBufPtrToArgV no...add as cmd or arg + bcs .9 + +.6 jsr CL.NextCLToken + +.7 lda (ZPCLBufPtr) + + + + + + +.80 >LDA.G CORE.hArgVBuf + >SYSCALL freemem + +.8 clc +.9 rts *-------------------------------------- -CORE.Exec jsr CORE.StkGet IF,WHILE,FOR ? +* Input : ZPArgVBuf +*-------------------------------------- +CORE.ExecCmd jsr CORE.StkGet IF,WHILE,FOR ? bcs .3 no particular context, exec... tax @@ -86,7 +166,49 @@ CORE.INT.STARTPROC rts *-------------------------------------- CORE.INT.SHIFT lda #1 - jmp ShiftA + +CORE.INT.SHIFTA >SYSCALL ArgV + bcs .8 + + >STYA ZPPtr1 + >STYA ZPPtr2 + +.10 ldy #$ff + +.1 iny Compute ArgX len + lda (ZPPtr1),y + bne .1 + +.2 tya + sec + adc ZPPtr1 + sta ZPPtr1 + bcc .3 + inc ZPPtr1+1 + +.3 ldy #$ff + +.4 iny + lda (ZPPtr1),y + sta (ZPPtr2),y + bne .4 + tya + beq .7 + + sec + adc ZPPtr2 + sta ZPPtr2 + bcc .2 + inc ZPPtr2+1 + bra .2 + +.7 ldy #S.PS.ARGC + lda (pPS),y + dec + sta (pPS),y + +.8 clc + rts *-------------------------------------- CORE.INT.PWD ldy #S.PS.hPREFIX lda (pPs),y @@ -1085,7 +1207,7 @@ CORE.StkGetPtr lda (pData) StackPtr sec rts *-------------------------------------- -CORE.StkPush pha +CORE.StkPush pha lda (pData) StackPtr inc cmp #CORE.STACK.MAX @@ -1102,7 +1224,7 @@ CORE.StkPush pha * sec rts *-------------------------------------- -CORE.StkPull jsr CORE.StkGet +CORE.StkPull jsr CORE.StkGet bcs .9 dey diff --git a/BIN/SHELL.S.txt b/BIN/SHELL.S.txt index f1ff8b51..b0504a3a 100644 --- a/BIN/SHELL.S.txt +++ b/BIN/SHELL.S.txt @@ -66,6 +66,7 @@ ZPCLBufPtr .BS 2 ZPInputBufPtr .BS 2 ZPInputBufPtrBak .BS 2 ZPArgVBuf .BS 2 +ZPArgVBufPtr .BS 2 ZS.END .ED *-------------------------------------- * File Header (16 Bytes) @@ -188,7 +189,7 @@ CS.RUN jsr CMD.Init >STYA ZPInputBufPtr lda #0 - jsr ShiftA Remove $0=/bin/shell + jsr CORE.INT.SHIFTA Remove $0=/bin/shell bra CS.RUN.LOOP *-------------------------------------- @@ -301,6 +302,8 @@ CS.RUN.INTERACTIVE jsr HIS.Add + >LDYA ZPCLBuf + >STYA ZPInputBufPtr jmp CS.RUN.Exec .8 jmp CS.RUN.LOOP *-------------------------------------- @@ -389,12 +392,7 @@ CS.RUN.BATCH >SYSCALL GetChar bcs .9 *-------------------------------------- -CS.RUN.Exec jsr CL.Parse - bcs CS.RUN.LOOP.END - - lda (ZPArgVBuf) - beq CS.RUN.LOOP.8 - jsr CORE.Exec +CS.RUN.Exec jsr CORE.Exec *-------------------------------------- CS.RUN.LOOP.END ldy #S.PS.RC sta (pPs),y @@ -446,8 +444,13 @@ CS.DOEVENT lda (pEvent) .9 sec rts *-------------------------------------- -CS.QUIT jsr HIS.Quit - jsr CMD.Quit +CS.QUIT >LDA.G hFileBuf + beq .1 + >SYSCALL FreeMem + +.1 jsr HIS.Quit + jsr CL.Quit + clc rts *-------------------------------------- @@ -461,49 +464,6 @@ CheckSleep ldy #Sleep+3 ora (pData),y rts *-------------------------------------- -ShiftA >SYSCALL ArgV - bcs .8 - - >STYA ZPPtr1 - >STYA ZPPtr2 - -.10 ldy #$ff - -.1 iny Compute ArgX len - lda (ZPPtr1),y - bne .1 - -.2 tya - sec - adc ZPPtr1 - sta ZPPtr1 - bcc .3 - inc ZPPtr1+1 - -.3 ldy #$ff - -.4 iny - lda (ZPPtr1),y - sta (ZPPtr2),y - bne .4 - tya - beq .7 - - sec - adc ZPPtr2 - sta ZPPtr2 - bcc .2 - inc ZPPtr2+1 - bra .2 - -.7 ldy #S.PS.ARGC - lda (pPS),y - dec - sta (pPS),y - -.8 clc - rts -*-------------------------------------- Lookup >STYA ZPPtr2 >PULLW ZPPtr1 @@ -676,6 +636,7 @@ CL.hCLBuf .BS 1 CL.Ptr .BS 1 CL.Len .BS 1 CL.bExec .BS 1 +CL.CmdSep .BS 1 CORE.IntCmd .BS 1 CORE.hArgVBuf .BS 1