diff --git a/.A2osX Issue List.xlsx b/.A2osX Issue List.xlsx index 095231e6..d6e9dad2 100644 Binary files a/.A2osX Issue List.xlsx and b/.A2osX Issue List.xlsx differ diff --git a/BIN/SHELL.S.CL.txt b/BIN/SHELL.S.CL.txt index c5827e06..c1ba3833 100644 --- a/BIN/SHELL.S.CL.txt +++ b/BIN/SHELL.S.CL.txt @@ -288,310 +288,6 @@ CL.PrintCLBuf >LDYA ZPCLBuf >SYSCALL fputs rts *-------------------------------------- -* Read From CLBuf or FileBuf -*-------------------------------------- -CL.GetLine >LDYA ZPFileBufPtr - >STYA ZPFileBufPtrBak - - lda (ZPFileBufPtr) - beq .9 - - ldx #0 not in " - - ldy #0 - -.1 lda (ZPFileBufPtr),y - beq .7 - - cmp #C.CR - beq .6 - - cmp #'"' - bne .2 - - txa - eor #$80 toggle " switch - tax - - lda #'"' - bra .5 - -.2 cmp #';' - bne .5 - - txa - beq .6 - - lda #';' - -.5 sta (ZPCLBuf),y - iny - cpy #CL.MAX - bne .1 - - lda #E.SYN Line Too long !!! -* sec - rts - -.6 sec skip CR or ; - .HS 90 BCC - -.7 clc - - tya - adc ZPFileBufPtr - sta ZPFileBufPtr - bcc .8 - inc ZPFileBufPtr+1 - -.8 lda #0 - sta (ZPCLBuf),y - - tya - >STA.G CL.Len - lda #$ff - >STA.G CL.bExec - - clc - rts - -.9 lda #C.EOF - sec - rts -*-------------------------------------- -* in: -* ZPCLBuf : CString command line -* out: -* ZPArgVBuf : -* /path/excmd\0 arg1\0 arg2\0 ... \0 -* - or - -* intcmd\0 arg1\0 arg2\0 ... \0 -*-------------------------------------- -CL.Parse >STZ.G CMD.IntCmd - - lda #S.PS.F.HOLD+S.PS.F.DUPENV - >STA.G CMD.PSFlags - - >PUSHW ZPCLBuf - >LDYA ZPCLBuf - >STYA ZPCLBufPtr - - >SYSCALL Args2ArgV - - lda #0 - sta (ZPArgVBuf) - - lda (ZPCLBufPtr) - beq .8 - -.1 cmp #'#' comment ? - beq .8 yes, ignore remaining - - >LDA.G CMD.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 CMD.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 jsr CL.CheckCmd - bcc .6 success, skip token, already added by CheckCmd - - rts - -.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 an arg - bcs .9 - -.6 jsr CL.NextCLToken -.7 lda (ZPCLBufPtr) - bne .1 - -.8 clc - -.9 rts -*-------------------------------------- -* ZPCLBuf-> argv[] (formatted & not empty) -*-------------------------------------- -CL.CheckCmd ldy #$ff - -.1 iny - lda (ZPCLBufPtr),y - beq .2 - cmp #'/' - bne .1 - - bra .4 - -.2 >PUSHW ZPCLBufPtr - >LDYA L.CMD.INT - jsr Lookup no / found, search internal... - bcs .4 not internal, search PATH - - phx - plx - bne .3 - - >LDA.G CMD.PSFlags if STARTPROC, skip keyword... - and #$ff^S.PS.F.HOLD - sta (pData),y ...and toggle S.PS.F.HOLD flag - clc -.9 rts - -.3 jsr CL.AddYAToArgV X unmodified - bcs .9 - - txa - >STA.G CMD.IntCmd - - clc - rts - -.4 >LDYA ZPCLBufPtr - jsr CL.AddYAToArgV - - lda #$ff - >STA.G CMD.IntCmd - clc - -CL.CheckCmd.RTS - rts -*-------------------------------------- -CL.CheckIO >PUSHW ZPCLBufPtr - >LDYA L.CL.IO - jsr Lookup - bcs .9 not a IO token...should be an arg.... - phx - - jsr CL.NextCLToken skip this IO token - - plx - jmp (J.CL.IO,x) - -.9 lda #0 - rts -*-------------------------------------- -CL.IO.AMP >LDA.G CMD.PSFlags - and #$ff^S.PS.F.HOLD - sta (pData),y - clc - rts - -CL.IO.IN lda #O.RDONLY+O.TEXT - jsr CL.IO.Open - bcs .9 - jsr IO.Set.In - - jsr CL.NextCLToken skip arg - clc -.9 rts - -CL.IO.OUTA -CL.IO.1OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT - bra CL.IO.OUT.1 -CL.IO.OUT -CL.IO.1OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT - -CL.IO.OUT.1 jsr CL.IO.Open - bcs .9 - jsr IO.Set.Out - - jsr CL.NextCLToken skip arg - clc -.9 rts - -CL.IO.2OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT - bra CL.IO.2OUT.1 -CL.IO.2OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT - -CL.IO.2OUT.1 jsr CL.IO.Open - bcs .9 - jsr IO.Set.Err - - jsr CL.NextCLToken skip arg - clc -.9 rts -*-------------------------------------- -CL.IO.Open pha - lda (ZPCLBufPtr) - beq .9 no arg left.... - - >PUSHWI 0 Aux type - >PUSHBI S.FI.T.TXT ftype - pla - >PUSHA flags - >LDYA ZPCLBufPtr - >SYSCALL fopen - rts - -.9 pla - lda #E.CSYN - sec - rts -*-------------------------------------- -CL.NextCLToken - lda (ZPCLBufPtr) - inc ZPCLBufPtr - bne .1 - inc ZPCLBufPtr+1 -.1 tax - bne CL.NextCLToken - rts -*-------------------------------------- -CL.AddCLBufPtrToArgV - >LDYA ZPCLBufPtr -CL.AddYAToArgV >STYA ZPPtr1 - - >LDYA ZPArgVBuf - >STYA ZPPtr2 - -.1 lda (ZPPtr2) scan to end of argV - beq .6 - -.2 inc ZPPtr2 - bne .3 - inc ZPPtr2+1 -.3 lda (ZPPtr2) - bne .2 - - inc ZPPtr2 - bne .4 - inc ZPPtr2+1 -.4 lda (ZPPtr2) - bne .2 - -.6 ldy #$ff - -.7 iny -* beq .9 - lda (ZPPtr1),y - sta (ZPPtr2),y - bne .7 including str ending \0 - - iny -* beq .9 - sta (ZPPtr2),y arg[] ending \0 - - clc - rts - -.9 lda #E.BUF - sec - rts -*-------------------------------------- MAN SAVE USR/SRC/BIN/SHELL.S.CL LOAD USR/SRC/BIN/SHELL.S diff --git a/BIN/SHELL.S.CMD.txt b/BIN/SHELL.S.CMD.txt index 5107a57c..6288803f 100644 --- a/BIN/SHELL.S.CMD.txt +++ b/BIN/SHELL.S.CMD.txt @@ -4,14 +4,6 @@ AUTO 4,1 .LIST OFF *-------------------------------------- CMD.Init >LDYAI 256 - >SYSCALL GetMem - bcs .9 - >STYA ZPCLBuf - - txa - >STA.G CMD.hCLBuf - - >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPArgVBuf @@ -27,9 +19,6 @@ CMD.Init >LDYAI 256 CMD.Quit ldy #CMD.hArgVBuf jsr .8 - ldy #CMD.hCmdBuf - jsr .8 - ldy #hFileBuf .8 lda (pData),y @@ -38,1101 +27,308 @@ CMD.Quit ldy #CMD.hArgVBuf clc .9 rts *-------------------------------------- -* Input : CMD.IntCmd,ZPArgVBuf +* Read From InputBuf *-------------------------------------- -Cmd.Exec jsr CMD.StkGet IF,WHILE,FOR ? - bcs .3 no particular context, exec... +CMD.Get >LDYA ZPInputBufPtr + >STYA ZPInputBufPtrBak + + lda (ZPInputBufPtr) + beq .9 + + ldx #0 not in " + + ldy #0 + +.1 lda (ZPInputBufPtr),y + beq .7 + + cmp #C.CR + beq .6 + + cmp #'"' + bne .2 + + txa + eor #$80 toggle " switch tax - >LDA.G CMD.IntCmd - bmi .2 external ... - - and #$3F - cmp #C.FOR - bcs .3 FOR...FI : always execute - -.2 txa - bpl .8 context is FALSE, skip line - asl - bpl .8 parent context is FALSE, skip line - -.3 >LDA.G CMD.IntCmd - bpl .80 Internal - - >PUSHB.G CMD.PSFlags - >LDYA ZPArgVBuf - >SYSCALL execv - bcs .9 - - tax CPID - - >LDA.G CMD.PSFlags - and #S.PS.F.HOLD - bne .4 - - txa - >PUSHA - >PUSHBI 1 - >LDYA L.MSG.PID - >SYSCALL printf - rts - -.4 >SLEEP Suspend this PID - - sec - ldy #S.PS.RC CPID will update S.PS.RC - lda (pPs),y - bne .9 - -.8 clc -.9 rts - -.80 tax - jmp (J.CMD.INT,x) -*-------------------------------------- -* STARTPROC : intcmd = 0 -*-------------------------------------- -Cmd.INT.STARTPROC - clc - rts -*-------------------------------------- -Cmd.INT.SHIFT lda #1 - jmp ShiftA -*-------------------------------------- -Cmd.INT.PWD ldy #S.PS.hPREFIX - lda (pPs),y - >SYSCALL GetMemPtr - >SYSCALL puts - rts -*-------------------------------------- -Cmd.INT.PUSHD >LDA.G PUSHD.STACK - cmp #PUSHD.STACK+PUSHD.STACK.MAX - beq Cmd.INT.POPD.CSYN - - ldy #S.PS.hPREFIX - lda (pPs),y - >SYSCALL GetMemPtr - >SYSCALL strdup - bcs Cmd.INT.POPD.CSYN - - >INC.G PUSHD.STACK - tay - txa - sta (pData),y - - ldx #1 - jsr Cmd.GetArgX - bcc Cmd.INT.CD.1 - -.8 clc -.9 rts -*-------------------------------------- -Cmd.INT.POPD >LDA.G PUSHD.STACK - cmp #PUSHD.STACK - beq Cmd.INT.POPD.CSYN - - tay - lda (pData),y - jsr Cmd.SetPrefixA - - >DEC.G PUSHD.STACK - clc -Cmd.INT.POPD.RTS - rts - -Cmd.INT.POPD.CSYN - jmp Cmd.Exec.CSYN -*-------------------------------------- -Cmd.INT.CD ldx #1 - jsr Cmd.GetArgX - bcc Cmd.INT.CD.1 - -Cmd.INT.CD.HOME >LDYA L.ENV.HOME - >SYSCALL GetEnv - bcc Cmd.INT.CD.1 - - >LDYA L.ENV.ROOT - >SYSCALL GetEnv - bcc Cmd.INT.CD.1 - - jmp Cmd.INT.PWD - -Cmd.INT.CD.1.9 pla - >SYSCALL freemem - bra Cmd.INT.POPD.CSYN - -Cmd.INT.CD.1 >SYSCALL realpath - bcs Cmd.INT.POPD.RTS - >STYA ZPPtr1 - phx - - ldy #1 - lda (ZPPtr1),y - beq Cmd.SetPrefixPHA we have '/' - - >PUSHEA.G CMD.Stat - >LDYA ZPPtr1 - >SYSCALL STAT - - bcs Cmd.INT.CD.1.9 - - >LDA.G CMD.Stat+S.STAT.P.TYPE - cmp #S.FI.T.DIR - bne Cmd.INT.CD.1.9 - - ldy #$ff - -.1 iny - lda (ZPPtr1),y - bne .1 - - dey - lda (ZPPtr1),y - cmp #'/' - beq Cmd.SetPrefixPHA already ends witrh a / - - iny - iny - lda #0 - >SYSCALL getmem - bcs Cmd.INT.CD.1.9 - >STYA ZPPtr2 - - ldy #$ff - -.2 iny - lda (ZPPtr1),y - lda (ZPPtr2),y - bne .2 - - iny - sta (ZPPtr2),y - dey - lda #'/' - sta (ZPPtr2),y - pla - phx - >SYSCALL freemem - pla -*-------------------------------------- -Cmd.SetPrefixA pha -Cmd.SetPrefixPHA - ldy #S.PS.hPREFIX - lda (pPs),y - >SYSCALL FreeMem - - pla - - ldy #S.PS.hPREFIX - sta (pPs),y - lda #0 -* clc - rts -*-------------------------------------- -Cmd.Exec.CSYN lda #E.CSYN - sec - rts -*-------------------------------------- -Cmd.Exec.SSYN lda #E.SSYN - sec - rts -*-------------------------------------- -Cmd.INT.SET ldx #1 - jsr Cmd.GetArgX - bcc Cmd.INT.SET.1 - -* No arg, print all ENV - - ldy #S.PS.hENV - lda (pPs),y - >SYSCALL GetMemPtr - >STYA ZPPTR1 - -.1 lda (ZPPTR1) - beq .8 Ending 0 ? - - ldy #$ff - -.2 iny - lda (ZPPTR1),y - bne .2 - - tya - sec - adc ZPPTR1 - sta ZPPTR2 - lda #0 - adc ZPPTR1+1 - sta ZPPTR2+1 - - >PUSHW ZPPTR2 Push value - >PUSHW ZPPTR1 Push name - jsr Cmd.INT.SET.PRINT - - bcs .9 - - ldy #$ff - -.3 iny - lda (ZPPTR2),y - bne .3 - - tya - sec - adc ZPPTR2 - sta ZPPTR1 - lda #0 - adc ZPPTR2+1 - sta ZPPTR1+1 - bra .1 - -.8 clc -.9 rts -*-------------------------------------- -* SET +X VAR = VALUE1 op VALUE2 op VALUE3 ... -*-------------------------------------- -Cmd.INT.SET.1 >STZ.G CMD.Varname - - lda #1 - >STA.G CMD.ArgIndex - -.1 tax - jsr Cmd.GetArgX - bcs .8 - - jsr CMD.IsSwitch - bcs .6 - - cmp #'C' - bne .2 - - >LDA.G bSET.C + lda #'"' bra .5 -.2 cmp #'X' - bne .99 - - >LDA.G bSET.X - -.5 eor #$ff - sta (pData),y - >INC.G CMD.ArgIndex - bra .1 - -.6 >LDA.G CMD.ArgIndex - >STA.G CMD.Varname - - >INC.G CMD.ArgIndex - tax - jsr Cmd.GetArgX - bcs Cmd.INT.SET.GET - - >STYA ZPPTR1 - - lda (ZPPTR1) - - cmp #'=' - bne .99 - - ldy #1 - lda (ZPPTR1),y - bne .99 - - >INC.G CMD.ArgIndex - tax - jsr Cmd.GetArgX - bcs Cmd.INT.SET.UNSET - - jsr Cmd.GetEXP - - bcs .99 - - >PUSHYA - >LDA.G CMD.Varname - tax - jsr Cmd.GetArgX - >SYSCALL SetEnv - rts - -.8 clc - rts - -.99 jmp Cmd.Exec.CSYN - -Cmd.INT.SET.UNSET - >LDA.G CMD.Varname - tax - jsr Cmd.GetArgX - >SYSCALL UnsetEnv - rts - -Cmd.INT.SET.GET - >LDA.G CMD.Varname - tax - jsr Cmd.GetArgX - >SYSCALL GetEnv - bcc .1 - clc - rts - -.1 >PUSHYA push value - >LDA.G CMD.Varname - tax - jsr Cmd.GetArgX - >PUSHYA push name -*-------------------------------------- -Cmd.INT.SET.PRINT - >PUSHBI 4 - >LDYA L.MSG.PRINTENV - >SYSCALL printf - rts -*-------------------------------------- -Cmd.INT.DATE sec - .HS 90 bcc -Cmd.INT.TIME clc - php - >LEA.G CMD.Time - >SYSCALL Time - - >PUSHEA.G CMD.Time - - plp - bcc .1 - >PUSHW L.FMT.DATE - bra .2 -.1 >PUSHW L.FMT.TIME - -.2 >LDYA ZPCLBuf - >SYSCALL StrFTime - - >LDYA ZPCLBuf - >SYSCALL puts - rts -*-------------------------------------- -Cmd.INT.ECHO >STZ.G bECHO.N - - lda #1 - >STA.G CMD.ArgIndex - -.1 tax - jsr Cmd.GetArgX - bcs .7 - - jsr CMD.IsSwitch - bcs .2 - - cmp #'N' - bne .99 - - lda #$ff - >EOR.G bECHO.N - sta (pData),y - >INC.G CMD.ArgIndex - bra .1 - -.2 pha - >PUSHBI 0 - pla - >SYSCALL printf - bcs .9 - - >INC.G CMD.ArgIndex - tax - - jsr Cmd.GetArgX - bcs .7 - -.6 lda #C.SPACE - >SYSCALL putchar - bcs .9 - - >PUSHBI 0 - - >LDA.G CMD.ArgIndex - tax - jsr Cmd.GetArgX - - >SYSCALL printf - bcs .9 - - >INC.G CMD.ArgIndex - tax - - jsr Cmd.GetArgX - bcc .6 - -.7 >LDA.G bECHO.N - bmi .8 - - >PUSHBI 0 - >LDYA L.MSG.ECHOCRLF - >SYSCALL printf - rts - -.8 clc -.9 rts - -.99 lda #E.CSYN - sec - rts -*-------------------------------------- -Cmd.INT.GETKEY ldx #1 - jsr Cmd.GetArgX - bcs .99 - - >SYSCALL getchar - bcc .1 - tay - bne .9 - -.1 >PUSHA - >PUSHBI 1 - >PUSHW L.FMT.GETKEY - >LEA.G M32.BUF - >SYSCALL sprintf - bcs .9 - - >PUSHEA.G M32.BUF - - ldx #1 - jsr Cmd.GetArgX - >SYSCALL SetEnv -.9 rts - -.99 jmp Cmd.Exec.CSYN -*-------------------------------------- -Cmd.INT.READ lda #1 - >STA.G CMD.ArgIndex - - tax - jsr Cmd.GetArgX - bcs .9 - -.1 jsr CMD.IsSwitch - bcs .4 - cmp #'S' - bne .2 - - lda #$ff - >STA.G bREAD.S - - bra .7 - -.2 cmp #'P' - bne .9 - - >INC.G CMD.ArgIndex - tax - jsr Cmd.GetArgX - bcs .9 - pha - >PUSHBI 0 - pla - >SYSCALL printf - bcs .99 - bra .7 - -.4 >SYSCALL strdup - txa - >STA.G hVarName - -.7 >INC.G CMD.ArgIndex - tax - jsr Cmd.GetArgX - bcc .1 - - >LDA.G hVarName - beq .9 - clc -.99 rts - -.9 jmp Cmd.Exec.CSYN -*-------------------------------------- -Cmd.INT.SLEEP ldx #1 - jsr Cmd.GetArgX - bcs .9 - - >SYSCALL AToL - bcs .9 - - >PULLL.G Sleep - clc - rts - -.9 jmp Cmd.Exec.CSYN -*-------------------------------------- -Cmd.INT.PAUSE lda #$FF - >STA.G bPause - clc - rts -*-------------------------------------- -Cmd.INT.EXIT ldx #1 - jsr Cmd.GetArgX - bcs .8 no arg, exit 0 - - >SYSCALL AToL - bcs .9 - - >PULLL.G M32.ACC - - lda #$FF - >STA.G bExit - - >LDA.G M32.ACC - clc - rts - -.8 lda #$FF - >STA.G bExit - inc - clc -.9 rts -*-------------------------------------- -Cmd.INT.MD ldx #1 - jsr Cmd.GetArgX - bcs .9 - - >SYSCALL MKDir - rts - -.9 jmp Cmd.Exec.CSYN -*-------------------------------------- -Cmd.INT.REN ldx #2 - jsr Cmd.GetArgX - bcs .9 - >PUSHYA - ldx #1 - jsr Cmd.GetArgX - - >SYSCALL Rename - rts - -.9 jmp Cmd.Exec.CSYN -*-------------------------------------- -Cmd.INT.RD ldx #1 - jsr Cmd.GetArgX - bcs .9 - phy - pha - >PUSHEA.G CMD.Stat - pla - ply - >SYSCALL STAT - bcs .99 - - >LDA.G CMD.Stat+S.STAT.P.TYPE - cmp #S.FI.T.DIR - bne .9 - - ldx #1 - jsr Cmd.GetArgX - >SYSCALL Remove -.99 rts - -.9 jmp Cmd.Exec.CSYN -*-------------------------------------- -Cmd.INT.BREAK -.9 jmp Cmd.Exec.SSYN -*-------------------------------------- -Cmd.INT.CONTINUE -.9 jmp Cmd.Exec.SSYN -*-------------------------------------- -Cmd.INT.FOR -.9 jmp Cmd.Exec.SSYN -*-------------------------------------- -Cmd.INT.NEXT -.9 jmp Cmd.Exec.SSYN -*-------------------------------------- -Cmd.INT.WHILE -Cmd.INT.IF jsr CMD.StkGet - bcs .1 no context... - - and #$80 get current.. - lsr becomes parent - bra .2 - -.1 lda #$40 ...set Parent = true - -.2 >STA.G CMD.Test - - bit #$40 Parent is true ? - beq .3 - - jsr Cmd.Eval - bcs .9 - -.3 >LDA.G CMD.IntCmd - cmp #C.WHILE - bne .8 - - jsr CMD.StkPushPtr - bcs .9 - -.8 >LDA.G CMD.Test - >ORA.G CMD.IntCmd - jmp CMD.StkPush - - clc -.9 rts -*-------------------------------------- -Cmd.INT.ELSE jsr CMD.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 lda #E.NOIF - sec - rts -*-------------------------------------- -Cmd.INT.FI jsr CMD.StkPull - bcs .9 - - and #$3F - cmp #C.IF - bne .9 - - clc - rts - -.9 lda #E.NOIF - sec - rts -*-------------------------------------- -Cmd.INT.LOOP jsr CMD.StkPull - bcs .9 - tax - and #$3F - cmp #C.WHILE - bne .9 +.2 cmp #';' + bne .5 txa - bpl .1 + beq .6 - jmp CMD.StkPullPtr - -.1 jsr CMD.StkPull - bcs .99 - jmp CMD.StkPull - -.9 lda #E.NOWHILE - sec -.99 rts -*-------------------------------------- -Cmd.Eval ldx #1 - jsr Cmd.GetArgX - beq .9 - - >PUSHYA - >LDYA L.CMD.Eval.TOKEN1 - jsr Lookup - - bcs .9 - - cpx #4 [ or ![ - bcs .9 - dex - dex 1 or $ff - - txa - - and #$80 true or false - >ORA.G CMD.Test - sta (pData),y - - ldx #2 - jsr Cmd.GetArgX - beq .9 - - >PUSHYA - >LDYA L.CMD.Eval.TOKEN2 -d -e -f ? - jsr Lookup - - bcs .1 - - txa - >STA.G CMD.Operator - - jsr CMD.Eval.UNARY - bcs .9 - - >EOR.G CMD.Test - sta (pData),y - - ldx #4 go check ] - bra .8 - -.9 lda #E.ESYN - sec -.99 rts - -.1 ldx #3 - jsr Cmd.GetArgX - beq .9 - - >PUSHYA - >LDYA L.CMD.Eval.TOKEN3 -eq -ne .... ? - jsr Lookup - bcs .9 - txa - >STA.G CMD.Operator - - jsr CMD.Eval.BINARY - bcs .9 - - >EOR.G CMD.Test - sta (pData),y - - ldx #5 go check ] - -.8 jsr Cmd.GetArgX - beq .9 - - >STYA ZPPTR1 - - lda (ZPPTR1) - cmp #']' - bne .9 - - ldy #1 - lda (ZPPTR1),y - bne .9 - clc - rts -*-------------------------------------- -CMD.Eval.UNARY ldx #3 - jsr Cmd.GetArgX - bcs .9 we need one arg - - >LDA.G CMD.Operator - tax - jmp (J.CMD.Eval.TOKEN2,x) - -.9 lda #E.ESYN - sec - rts - -CMD.Eval.D jsr CMD.Eval.DEF.7 - bcs CMD.Eval.DEF.9 - >LDA.G CMD.Stat+S.STAT.P.TYPE - cmp #S.FI.T.DIR - bne CMD.Eval.DEF.9 - bra CMD.Eval.DEF.8 - -CMD.Eval.E jsr CMD.Eval.DEF.7 - bcs CMD.Eval.DEF.9 - bra CMD.Eval.DEF.8 DIR or FILE exist - -CMD.Eval.F jsr CMD.Eval.DEF.7 - bcs CMD.Eval.DEF.9 - - >LDA.G CMD.Stat+S.STAT.P.TYPE - cmp #S.FI.T.DIR - beq CMD.Eval.DEF.9 - bra CMD.Eval.DEF.8 - -CMD.Eval.DEF.7 >PUSHEA.G CMD.Stat - ldx #3 - jsr Cmd.GetArgX - >SYSCALL STAT - rts - -CMD.Eval.DEF.8 lda #$80 true - clc - rts - -CMD.Eval.DEF.9 lda #0 false - clc - rts -*-------------------------------------- -CMD.Eval.BINARY ldx #2 - jsr Cmd.GetArgX - bcs .9 - - ldx #4 - jsr Cmd.GetArgX - bcs .9 - - >LDA.G CMD.Operator - beq .1 = - - cmp #2 != - bne CMD.Eval.BINARY.NUM - lda #$80 - >STA.G CMD.Operator - -.1 ldx #2 - jsr Cmd.GetArgX - >PUSHYA - ldx #4 - jsr Cmd.GetArgX - >SYSCALL strcmp - ror CS if != - and #$80 - eor #$80 - >EOR.G CMD.Operator - clc - rts - -.9 lda #E.ESYN - sec - rts -*-------------------------------------- -CMD.Eval.BINARY.NUM - ldx #2 - jsr Cmd.GetArgX - bcs .9 - - >SYSCALL AToL - bcs .9 - - >PULLL.G M32.ACC - - ldx #4 - jsr Cmd.GetArgX - bcs .9 - - >SYSCALL AToL - bcs .9 - - >PULLL.G M32.ARG - - jsr M32.Cmp - pha - - >LDA.G CMD.Operator - lsr - tax - pla - and CMD.Eval.TOKEN3.BITS,x - beq .80 - - lda #$80 true - clc - rts - -.80 lda #0 false - clc - rts - -.9 lda #E.ESYN - sec - rts -*-------------------------------------- -Cmd.GetEXP >LDA.G CMD.ArgIndex - inc - tax - jsr Cmd.GetArgX - bcc .1 - - >LDA.G CMD.ArgIndex no op, return text value - tax - jsr Cmd.GetArgX - rts - -.1 >LDA.G CMD.ArgIndex - tax - jsr Cmd.GetArgX - >SYSCALL AToL - bcs .99 - - >PULLL.G M32.ACC - - jsr Cmd.GetEXP.GetNext - -.2 >PUSHYA - >LDYA L.CMD.Eval.TOKEN4 + - .... ? - jsr Lookup - - bcs .9 - txa - >STA.G CMD.Operator - - jsr M32.ACC2ARG - - jsr Cmd.GetEXP.GetNext get next argument in ACC -.99 bcs .9 - - >SYSCALL AToL - bcs .9 - - >PULLL.G M32.ACC - jsr Cmd.GetEXP.Op - bcs .9 - - jsr Cmd.GetEXP.GetNext another op ? - bcc .2 - -.8 >PUSHL.G M32.ACC - >PUSHBI 4 - >PUSHW L.M32.Printf - >LEA.G M32.BUF - >SYSCALL sprintf - bcs .9 - - >LEA.G M32.Buf - - rts - -.9 lda #E.BADEXP - rts - -Cmd.GetEXP.Op >LDA.G CMD.Operator - tax - jmp (J.CMD.Eval.TOKEN4,x) -*-------------------------------------- -Cmd.GetEXP.GetNext - >INC.G CMD.ArgIndex - tax - jsr Cmd.GetArgX - rts -*-------------------------------------- -Cmd.GetArgX >LDYA ZPArgVBuf - - dex - bmi .8 - - >STYA ZPPtr1 - -.1 lda (ZPPtr1) - beq .9 - -.2 inc ZPPtr1 - bne .3 - inc ZPPtr1+1 -.3 lda (ZPPtr1) - bne .2 - - inc ZPPtr1 - bne .4 - inc ZPPtr1+1 - -.4 lda (ZPPtr1) - beq .9 - - dex - bpl .1 - - >LDYA ZPPtr1 - -.8 clc - rts - -.9 sec - rts -*-------------------------------------- -CMD.IsSwitch >STYA ZPPtr1 - lda (ZPPtr1) - cmp #'-' - bne .9 - - ldy #1 - lda (ZPPtr1),y - beq .9 + lda #';' +.5 sta (ZPCLBuf),y iny - lda (ZPPtr1),y - bne .9 + cpy #CL.MAX + bne .1 - dey - lda (ZPPtr1),y - cmp #'a' - bcc .8 - cmp #'z'+1 - bcs .8 - eor #$20 - -.8 clc + lda #E.SYN Line Too long !!! +* sec rts -.9 >LDYA ZPPtr1 - sec +.6 sec skip CR or ; + .HS 90 BCC + +.7 clc + + tya + adc ZPInputBufPtr + sta ZPInputBufPtr + bcc .8 + inc ZPInputBufPtr+1 + +.8 lda #0 + sta (ZPCLBuf),y + + tya + >STA.G CL.Len + lda #$ff + >STA.G CL.bExec + + clc + rts + +.9 lda #C.EOF + sec rts *-------------------------------------- -CMD.StkPushPtr lda ZPFileBufPtrBak - jsr CMD.StkPush - bcs CMD.StkPullPtr.9 - lda ZPFileBufPtrBak+1 - bra CMD.StkPush +* in: +* ZPCLBuf : CString command line +* out: +* ZPArgVBuf : +* /path/excmd\0 arg1\0 arg2\0 ... \0 +* - or - +* intcmd\0 arg1\0 arg2\0 ... \0 +*-------------------------------------- +CL.Parse >STZ.G CMD.IntCmd + + lda #S.PS.F.HOLD+S.PS.F.DUPENV + >STA.G CMD.PSFlags + + >PUSHW ZPCLBuf + >LDYA ZPCLBuf + >STYA ZPCLBufPtr + + >SYSCALL Args2ArgV + + lda #0 + sta (ZPArgVBuf) + + lda (ZPCLBufPtr) + beq .8 + +.1 cmp #'#' comment ? + beq .8 yes, ignore remaining + + >LDA.G CMD.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 CMD.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 jsr CL.CheckCmd + bcc .6 success, skip token, already added by CheckCmd + + rts + +.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 an arg + bcs .9 + +.6 jsr CL.NextCLToken +.7 lda (ZPCLBufPtr) + bne .1 + +.8 clc + .9 rts *-------------------------------------- -CMD.StkPullPtr jsr CMD.StkPull - bcs CMD.StkPullPtr.9 - sta ZPFileBufPtr+1 - jsr CMD.StkPull - bcs CMD.StkPullPtr.9 - sta ZPFileBufPtr -CMD.StkPullPtr.9 - rts +* ZPCLBuf-> argv[] (formatted & not empty) *-------------------------------------- -CMD.StkGetPtr lda (pData) StackPtr - beq .9 - dec - beq .9 - - tay +CL.CheckCmd ldy #$ff - lda (pData),y - sta ZPFileBufPtr - iny - lda (pData),y - sta ZPFileBufPtr+1 +.1 iny + lda (ZPCLBufPtr),y + beq .2 + cmp #'/' + bne .1 + bra .4 + +.2 >PUSHW ZPCLBufPtr + >LDYA L.CMD.INT + jsr Lookup no / found, search internal... + bcs .4 not internal, search PATH + + phx + plx + bne .3 + + >LDA.G CMD.PSFlags if STARTPROC, skip keyword... + and #$ff^S.PS.F.HOLD + sta (pData),y ...and toggle S.PS.F.HOLD flag + clc +.9 rts + +.3 jsr CL.AddYAToArgV X unmodified + bcs .9 + + txa + >STA.G CMD.IntCmd + + clc + rts + +.4 >LDYA ZPCLBufPtr + jsr CL.AddYAToArgV + + lda #$ff + >STA.G CMD.IntCmd + clc + +CL.CheckCmd.RTS + rts +*-------------------------------------- +CL.CheckIO >PUSHW ZPCLBufPtr + >LDYA L.CL.IO + jsr Lookup + bcs .9 not a IO token...should be an arg.... + phx + + jsr CL.NextCLToken skip this IO token + + plx + jmp (J.CL.IO,x) + +.9 lda #0 + rts +*-------------------------------------- +CL.IO.AMP >LDA.G CMD.PSFlags + and #$ff^S.PS.F.HOLD + sta (pData),y clc rts -.9 lda #E.SSYN - sec - rts +CL.IO.IN lda #O.RDONLY+O.TEXT + jsr CL.IO.Open + bcs .9 + jsr IO.Set.In + + jsr CL.NextCLToken skip arg + clc +.9 rts + +CL.IO.OUTA +CL.IO.1OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT + bra CL.IO.OUT.1 +CL.IO.OUT +CL.IO.1OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT + +CL.IO.OUT.1 jsr CL.IO.Open + bcs .9 + jsr IO.Set.Out + + jsr CL.NextCLToken skip arg + clc +.9 rts + +CL.IO.2OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT + bra CL.IO.2OUT.1 +CL.IO.2OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT + +CL.IO.2OUT.1 jsr CL.IO.Open + bcs .9 + jsr IO.Set.Err + + jsr CL.NextCLToken skip arg + clc +.9 rts *-------------------------------------- -CMD.StkPush pha - lda (pData) StackPtr - inc - cmp #CMD.STACK.MAX - beq .9 - sta (pData) StackPtr - tay - pla - sta (pData),y -* clc +CL.IO.Open pha + lda (ZPCLBufPtr) + beq .9 no arg left.... + + >PUSHWI 0 Aux type + >PUSHBI S.FI.T.TXT ftype + pla + >PUSHA flags + >LDYA ZPCLBufPtr + >SYSCALL fopen rts .9 pla - lda #E.STKOVERFLOW -* sec + lda #E.CSYN + sec + rts +*-------------------------------------- +CL.NextCLToken + lda (ZPCLBufPtr) + inc ZPCLBufPtr + bne .1 + inc ZPCLBufPtr+1 +.1 tax + bne CL.NextCLToken rts *-------------------------------------- -CMD.StkPull jsr CMD.StkGet - bcs .9 +CL.AddCLBufPtrToArgV + >LDYA ZPCLBufPtr +CL.AddYAToArgV >STYA ZPPtr1 + + >LDYA ZPArgVBuf + >STYA ZPPtr2 - dey - pha - tya - sta (pData) StackPtr - pla +.1 lda (ZPPtr2) scan to end of argV + beq .6 + +.2 inc ZPPtr2 + bne .3 + inc ZPPtr2+1 +.3 lda (ZPPtr2) + bne .2 + + inc ZPPtr2 + bne .4 + inc ZPPtr2+1 +.4 lda (ZPPtr2) + bne .2 + +.6 ldy #$ff + +.7 iny +* beq .9 + lda (ZPPtr1),y + sta (ZPPtr2),y + bne .7 including str ending \0 + + iny +* beq .9 + sta (ZPPtr2),y arg[] ending \0 -.9 rts -*-------------------------------------- -CMD.StkGet lda (pData) StackPtr - beq .9 - tay - lda (pData),y clc rts -.9 lda #E.SSYN - sec +.9 lda #E.BUF + sec rts *-------------------------------------- MAN diff --git a/BIN/SHELL.S.CORE.txt b/BIN/SHELL.S.CORE.txt new file mode 100644 index 00000000..b99540ed --- /dev/null +++ b/BIN/SHELL.S.CORE.txt @@ -0,0 +1,1106 @@ +NEW +PREFIX +AUTO 4,1 + .LIST OFF +*-------------------------------------- +* Input : CMD.IntCmd,ZPArgVBuf +*-------------------------------------- +CORE.Exec jsr CORE.StkGet IF,WHILE,FOR ? + bcs .3 no particular context, exec... + tax + + >LDA.G CORE.IntCmd + bmi .2 external ... + + and #$3F + cmp #C.FOR + bcs .3 FOR...FI : always execute + +.2 txa + bpl .8 context is FALSE, skip line + asl + bpl .8 parent context is FALSE, skip line + +.3 >LDA.G CMD.IntCmd + bpl .80 Internal + + >PUSHB.G CORE.PSFlags + >LDYA ZPArgVBuf + >SYSCALL execv + bcs .9 + + tax CPID + + >LDA.G CMD.PSFlags + and #S.PS.F.HOLD + bne .4 + + txa + >PUSHA + >PUSHBI 1 + >LDYA L.MSG.PID + >SYSCALL printf + rts + +.4 >SLEEP Suspend this PID + + sec + ldy #S.PS.RC CPID will update S.PS.RC + lda (pPs),y + bne .9 + +.8 clc +.9 rts + +.80 tax + jmp (J.CORE.INT,x) +*-------------------------------------- +* STARTPROC : intcmd = 0 +*-------------------------------------- +CORE.INT.STARTPROC + clc + rts +*-------------------------------------- +CORE.INT.SHIFT lda #1 + jmp ShiftA +*-------------------------------------- +CORE.INT.PWD ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL GetMemPtr + >SYSCALL puts + rts +*-------------------------------------- +CORE.INT.PUSHD >LDA.G PUSHD.STACK + cmp #PUSHD.STACK+PUSHD.STACK.MAX + beq CORE.INT.POPD.CSYN + + ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL GetMemPtr + >SYSCALL strdup + bcs CORE.INT.POPD.CSYN + + >INC.G PUSHD.STACK + tay + txa + sta (pData),y + + ldx #1 + jsr CORE.GetArgX + bcc CORE.INT.CD.1 + +.8 clc +.9 rts +*-------------------------------------- +CORE.INT.POPD >LDA.G PUSHD.STACK + cmp #PUSHD.STACK + beq CORE.INT.POPD.CSYN + + tay + lda (pData),y + jsr CORE.SetPrefixA + + >DEC.G PUSHD.STACK + clc +CORE.INT.POPD.RTS + rts + +CORE.INT.POPD.CSYN + jmp Cmd.Exec.CSYN +*-------------------------------------- +CORE.INT.CD ldx #1 + jsr CORE.GetArgX + bcc CORE.INT.CD.1 + +CORE.INT.CD.HOME >LDYA L.ENV.HOME + >SYSCALL GetEnv + bcc CORE.INT.CD.1 + + >LDYA L.ENV.ROOT + >SYSCALL GetEnv + bcc CORE.INT.CD.1 + + jmp CORE.INT.PWD + +CORE.INT.CD.1.9 pla + >SYSCALL freemem + bra CORE.INT.POPD.CSYN + +CORE.INT.CD.1 >SYSCALL realpath + bcs CORE.INT.POPD.RTS + >STYA ZPPtr1 + phx + + ldy #1 + lda (ZPPtr1),y + beq CORE.SetPrefixPHA we have '/' + + >PUSHEA.G CMD.Stat + >LDYA ZPPtr1 + >SYSCALL STAT + + bcs CORE.INT.CD.1.9 + + >LDA.G CMD.Stat+S.STAT.P.TYPE + cmp #S.FI.T.DIR + bne CORE.INT.CD.1.9 + + ldy #$ff + +.1 iny + lda (ZPPtr1),y + bne .1 + + dey + lda (ZPPtr1),y + cmp #'/' + beq CORE.SetPrefixPHA already ends witrh a / + + iny + iny + lda #0 + >SYSCALL getmem + bcs CORE.INT.CD.1.9 + >STYA ZPPtr2 + + ldy #$ff + +.2 iny + lda (ZPPtr1),y + lda (ZPPtr2),y + bne .2 + + iny + sta (ZPPtr2),y + dey + lda #'/' + sta (ZPPtr2),y + pla + phx + >SYSCALL freemem + pla +*-------------------------------------- +CORE.SetPrefixA pha +CORE.SetPrefixPHA + ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL FreeMem + + pla + + ldy #S.PS.hPREFIX + sta (pPs),y + lda #0 +* clc + rts +*-------------------------------------- +CORE.Exec.CSYN lda #E.CSYN + sec + rts +*-------------------------------------- +CORE.Exec.SSYN lda #E.SSYN + sec + rts +*-------------------------------------- +CORE.INT.SET ldx #1 + jsr CORE.GetArgX + bcc CORE.INT.SET.1 + +* No arg, print all ENV + + ldy #S.PS.hENV + lda (pPs),y + >SYSCALL GetMemPtr + >STYA ZPPTR1 + +.1 lda (ZPPTR1) + beq .8 Ending 0 ? + + ldy #$ff + +.2 iny + lda (ZPPTR1),y + bne .2 + + tya + sec + adc ZPPTR1 + sta ZPPTR2 + lda #0 + adc ZPPTR1+1 + sta ZPPTR2+1 + + >PUSHW ZPPTR2 Push value + >PUSHW ZPPTR1 Push name + jsr CORE.INT.SET.PRINT + + bcs .9 + + ldy #$ff + +.3 iny + lda (ZPPTR2),y + bne .3 + + tya + sec + adc ZPPTR2 + sta ZPPTR1 + lda #0 + adc ZPPTR2+1 + sta ZPPTR1+1 + bra .1 + +.8 clc +.9 rts +*-------------------------------------- +* SET +X VAR = VALUE1 op VALUE2 op VALUE3 ... +*-------------------------------------- +CORE.INT.SET.1 >STZ.G CORE.Varname + + lda #1 + >STA.G CORE.ArgIndex + +.1 tax + jsr CORE.GetArgX + bcs .8 + + jsr CORE.IsSwitch + bcs .6 + + cmp #'C' + bne .2 + + >LDA.G bSET.C + bra .5 + +.2 cmp #'X' + bne .99 + + >LDA.G bSET.X + +.5 eor #$ff + sta (pData),y + >INC.G CORE.ArgIndex + bra .1 + +.6 >LDA.G CORE.ArgIndex + >STA.G CORE.Varname + + >INC.G CORE.ArgIndex + tax + jsr CORE.GetArgX + bcs CORE.INT.SET.GET + + >STYA ZPPTR1 + + lda (ZPPTR1) + + cmp #'=' + bne .99 + + ldy #1 + lda (ZPPTR1),y + bne .99 + + >INC.G CORE.ArgIndex + tax + jsr CORE.GetArgX + bcs CORE.INT.SET.UNSET + + jsr CORE.GetEXP + + bcs .99 + + >PUSHYA + >LDA.G CORE.Varname + tax + jsr CORE.GetArgX + >SYSCALL SetEnv + rts + +.8 clc + rts + +.99 jmp CORE.Exec.CSYN + +CORE.INT.SET.UNSET + >LDA.G CORE.Varname + tax + jsr CORE.GetArgX + >SYSCALL UnsetEnv + rts + +CORE.INT.SET.GET + >LDA.G CORE.Varname + tax + jsr CORE.GetArgX + >SYSCALL GetEnv + bcc .1 + clc + rts + +.1 >PUSHYA push value + >LDA.G CORE.Varname + tax + jsr CORE.GetArgX + >PUSHYA push name +*-------------------------------------- +CORE.INT.SET.PRINT + >PUSHBI 4 + >LDYA L.MSG.PRINTENV + >SYSCALL printf + rts +*-------------------------------------- +CORE.INT.DATE sec + .HS 90 bcc +CORE.INT.TIME clc + php + >LEA.G CORE.Time + >SYSCALL Time + + >PUSHEA.G CORE.Time + + plp + bcc .1 + >PUSHW L.FMT.DATE + bra .2 +.1 >PUSHW L.FMT.TIME + +.2 >LDYA ZPCLBuf + >SYSCALL StrFTime + + >LDYA ZPCLBuf + >SYSCALL puts + rts +*-------------------------------------- +CORE.INT.ECHO >STZ.G bECHO.N + + lda #1 + >STA.G CORE.ArgIndex + +.1 tax + jsr CORE.GetArgX + bcs .7 + + jsr CORE.IsSwitch + bcs .2 + + cmp #'N' + bne .99 + + lda #$ff + >EOR.G bECHO.N + sta (pData),y + >INC.G CORE.ArgIndex + bra .1 + +.2 pha + >PUSHBI 0 + pla + >SYSCALL printf + bcs .9 + + >INC.G CORE.ArgIndex + tax + + jsr CORE.GetArgX + bcs .7 + +.6 lda #C.SPACE + >SYSCALL putchar + bcs .9 + + >PUSHBI 0 + + >LDA.G CORE.ArgIndex + tax + jsr CORE.GetArgX + + >SYSCALL printf + bcs .9 + + >INC.G CORE.ArgIndex + tax + + jsr CORE.GetArgX + bcc .6 + +.7 >LDA.G bECHO.N + bmi .8 + + >PUSHBI 0 + >LDYA L.MSG.ECHOCRLF + >SYSCALL printf + rts + +.8 clc +.9 rts + +.99 lda #E.CSYN + sec + rts +*-------------------------------------- +CORE.INT.GETKEY ldx #1 + jsr CORE.GetArgX + bcs .99 + + >SYSCALL getchar + bcc .1 + tay + bne .9 + +.1 >PUSHA + >PUSHBI 1 + >PUSHW L.FMT.GETKEY + >LEA.G M32.BUF + >SYSCALL sprintf + bcs .9 + + >PUSHEA.G M32.BUF + + ldx #1 + jsr Cmd.GetArgX + >SYSCALL SetEnv +.9 rts + +.99 jmp CORE.Exec.CSYN +*-------------------------------------- +CORE.INT.READ lda #1 + >STA.G CORE.ArgIndex + + tax + jsr CORE.GetArgX + bcs .9 + +.1 jsr CORE.IsSwitch + bcs .4 + cmp #'S' + bne .2 + + lda #$ff + >STA.G bREAD.S + + bra .7 + +.2 cmp #'P' + bne .9 + + >INC.G CORE.ArgIndex + tax + jsr CORE.GetArgX + bcs .9 + pha + >PUSHBI 0 + pla + >SYSCALL printf + bcs .99 + bra .7 + +.4 >SYSCALL strdup + txa + >STA.G hVarName + +.7 >INC.G CMD.ArgIndex + tax + jsr Cmd.GetArgX + bcc .1 + + >LDA.G hVarName + beq .9 + clc +.99 rts + +.9 jmp CORE.Exec.CSYN +*-------------------------------------- +CORE.INT.SLEEP ldx #1 + jsr CORE.GetArgX + bcs .9 + + >SYSCALL AToL + bcs .9 + + >PULLL.G Sleep + clc + rts + +.9 jmp CORE.Exec.CSYN +*-------------------------------------- +CORE.INT.PAUSE lda #$FF + >STA.G bPause + clc + rts +*-------------------------------------- +CORE.INT.EXIT ldx #1 + jsr CORE.GetArgX + bcs .8 no arg, exit 0 + + >SYSCALL AToL + bcs .9 + + >PULLL.G M32.ACC + + lda #$FF + >STA.G bExit + + >LDA.G M32.ACC + clc + rts + +.8 lda #$FF + >STA.G bExit + inc + clc +.9 rts +*-------------------------------------- +CORE.INT.MD ldx #1 + jsr CORE.GetArgX + bcs .9 + + >SYSCALL MKDir + rts + +.9 jmp CORE.Exec.CSYN +*-------------------------------------- +CORE.INT.REN ldx #2 + jsr CORE.GetArgX + bcs .9 + >PUSHYA + ldx #1 + jsr CORE.GetArgX + + >SYSCALL Rename + rts + +.9 jmp CORE.Exec.CSYN +*-------------------------------------- +CORE.INT.RD ldx #1 + jsr CORE.GetArgX + bcs .9 + phy + pha + >PUSHEA.G CORE.Stat + pla + ply + >SYSCALL STAT + bcs .99 + + >LDA.G CORE.Stat+S.STAT.P.TYPE + cmp #S.FI.T.DIR + bne .9 + + ldx #1 + jsr CORE.GetArgX + >SYSCALL Remove +.99 rts + +.9 jmp CORE.Exec.CSYN +*-------------------------------------- +CORE.INT.BREAK +.9 jmp CORE.Exec.SSYN +*-------------------------------------- +CORE.INT.CONTINUE +.9 jmp CORE.Exec.SSYN +*-------------------------------------- +CORE.INT.FOR +.9 jmp CORE.Exec.SSYN +*-------------------------------------- +CORE.INT.NEXT +.9 jmp CORE.Exec.SSYN +*-------------------------------------- +CORE.INT.WHILE +CORE.INT.IF jsr CORE.StkGet + bcs .1 no context... + + and #$80 get current.. + lsr becomes parent + bra .2 + +.1 lda #$40 ...set Parent = true + +.2 >STA.G CORE.Test + + bit #$40 Parent is true ? + beq .3 + + jsr CORE.Eval + bcs .9 + +.3 >LDA.G CORE.IntCmd + cmp #C.WHILE + bne .8 + + jsr CORE.StkPushPtr + bcs .9 + +.8 >LDA.G CORE.Test + >ORA.G CORE.IntCmd + jmp CORE.StkPush + + clc +.9 rts +*-------------------------------------- +CORE.INT.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 lda #E.NOIF + sec + rts +*-------------------------------------- +CORE.INT.FI jsr CORE.StkPull + bcs .9 + + and #$3F + cmp #C.IF + bne .9 + + clc + rts + +.9 lda #E.NOIF + sec + rts +*-------------------------------------- +CORE.INT.LOOP jsr CORE.StkPull + bcs .9 + tax + and #$3F + cmp #C.WHILE + bne .9 + + txa + bpl .1 + + jmp CORE.StkPullPtr + +.1 jsr CORE.StkPull + bcs .99 + jmp CORE.StkPull + +.9 lda #E.NOWHILE + sec +.99 rts +*-------------------------------------- +CORE.Eval ldx #1 + jsr CORE.GetArgX + beq .9 + + >PUSHYA + >LDYA L.CORE.Eval.TOKEN1 + jsr Lookup + + bcs .9 + + cpx #4 [ or ![ + bcs .9 + dex + dex 1 or $ff + + txa + + and #$80 true or false + >ORA.G CORE.Test + sta (pData),y + + ldx #2 + jsr CORE.GetArgX + beq .9 + + >PUSHYA + >LDYA L.CORE.Eval.TOKEN2 -d -e -f ? + jsr Lookup + + bcs .1 + + txa + >STA.G CORE.Operator + + jsr CORE.Eval.UNARY + bcs .9 + + >EOR.G CORE.Test + sta (pData),y + + ldx #4 go check ] + bra .8 + +.9 lda #E.ESYN + sec +.99 rts + +.1 ldx #3 + jsr CORE.GetArgX + beq .9 + + >PUSHYA + >LDYA L.CORE.Eval.TOKEN3 -eq -ne .... ? + jsr Lookup + bcs .9 + txa + >STA.G CORE.Operator + + jsr CORE.Eval.BINARY + bcs .9 + + >EOR.G CORE.Test + sta (pData),y + + ldx #5 go check ] + +.8 jsr CORE.GetArgX + beq .9 + + >STYA ZPPTR1 + + lda (ZPPTR1) + cmp #']' + bne .9 + + ldy #1 + lda (ZPPTR1),y + bne .9 + clc + rts +*-------------------------------------- +CORE.Eval.UNARY ldx #3 + jsr CORE.GetArgX + bcs .9 we need one arg + + >LDA.G CORE.Operator + tax + jmp (J.CORE.Eval.TOKEN2,x) + +.9 lda #E.ESYN + sec + rts + +CORE.Eval.D jsr CORE.Eval.DEF.7 + bcs CORE.Eval.DEF.9 + >LDA.G CORE.Stat+S.STAT.P.TYPE + cmp #S.FI.T.DIR + bne CORE.Eval.DEF.9 + bra CORE.Eval.DEF.8 + +CORE.Eval.E jsr CORE.Eval.DEF.7 + bcs CORE.Eval.DEF.9 + bra CORE.Eval.DEF.8 DIR or FILE exist + +CORE.Eval.F jsr CORE.Eval.DEF.7 + bcs CORE.Eval.DEF.9 + + >LDA.G CORE.Stat+S.STAT.P.TYPE + cmp #S.FI.T.DIR + beq CORE.Eval.DEF.9 + bra CORE.Eval.DEF.8 + +CORE.Eval.DEF.7 >PUSHEA.G CORE.Stat + ldx #3 + jsr CORE.GetArgX + >SYSCALL STAT + rts + +CORE.Eval.DEF.8 lda #$80 true + clc + rts + +CORE.Eval.DEF.9 lda #0 false + clc + rts +*-------------------------------------- +CORE.Eval.BINARY ldx #2 + jsr CORE.GetArgX + bcs .9 + + ldx #4 + jsr CORE.GetArgX + bcs .9 + + >LDA.G CORE.Operator + beq .1 = + + cmp #2 != + bne CORE.Eval.BINARY.NUM + lda #$80 + >STA.G CORE.Operator + +.1 ldx #2 + jsr CORE.GetArgX + >PUSHYA + ldx #4 + jsr CORE.GetArgX + >SYSCALL strcmp + ror CS if != + and #$80 + eor #$80 + >EOR.G CORE.Operator + clc + rts + +.9 lda #E.ESYN + sec + rts +*-------------------------------------- +CORE.Eval.BINARY.NUM + ldx #2 + jsr CORE.GetArgX + bcs .9 + + >SYSCALL AToL + bcs .9 + + >PULLL.G M32.ACC + + ldx #4 + jsr CORE.GetArgX + bcs .9 + + >SYSCALL AToL + bcs .9 + + >PULLL.G M32.ARG + + jsr M32.Cmp + pha + + >LDA.G CORE.Operator + lsr + tax + pla + and CORE.Eval.TOKEN3.BITS,x + beq .80 + + lda #$80 true + clc + rts + +.80 lda #0 false + clc + rts + +.9 lda #E.ESYN + sec + rts +*-------------------------------------- +CORE.GetEXP >LDA.G CORE.ArgIndex + inc + tax + jsr CORE.GetArgX + bcc .1 + + >LDA.G CORE.ArgIndex no op, return text value + tax + jsr CORE.GetArgX + rts + +.1 >LDA.G CORE.ArgIndex + tax + jsr CORE.GetArgX + >SYSCALL AToL + bcs .99 + + >PULLL.G M32.ACC + + jsr CORE.GetEXP.GetNext + +.2 >PUSHYA + >LDYA L.CORE.Eval.TOKEN4 + - .... ? + jsr Lookup + + bcs .9 + txa + >STA.G CORE.Operator + + jsr M32.ACC2ARG + + jsr CORE.GetEXP.GetNext get next argument in ACC +.99 bcs .9 + + >SYSCALL AToL + bcs .9 + + >PULLL.G M32.ACC + jsr CORE.GetEXP.Op + bcs .9 + + jsr CORE.GetEXP.GetNext another op ? + bcc .2 + +.8 >PUSHL.G M32.ACC + >PUSHBI 4 + >PUSHW L.M32.Printf + >LEA.G M32.BUF + >SYSCALL sprintf + bcs .9 + + >LEA.G M32.Buf + + rts + +.9 lda #E.BADEXP + rts + +CORE.GetEXP.Op >LDA.G CORE.Operator + tax + jmp (J.CORE.Eval.TOKEN4,x) +*-------------------------------------- +CORE.GetEXP.GetNext + >INC.G CORE.ArgIndex + tax + jsr CORE.GetArgX + rts +*-------------------------------------- +CORE.GetArgX >LDYA ZPArgVBuf + + dex + bmi .8 + + >STYA ZPPtr1 + +.1 lda (ZPPtr1) + beq .9 + +.2 inc ZPPtr1 + bne .3 + inc ZPPtr1+1 +.3 lda (ZPPtr1) + bne .2 + + inc ZPPtr1 + bne .4 + inc ZPPtr1+1 + +.4 lda (ZPPtr1) + beq .9 + + dex + bpl .1 + + >LDYA ZPPtr1 + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CORE.IsSwitch >STYA ZPPtr1 + lda (ZPPtr1) + cmp #'-' + bne .9 + + ldy #1 + lda (ZPPtr1),y + beq .9 + + iny + lda (ZPPtr1),y + bne .9 + + dey + lda (ZPPtr1),y + cmp #'a' + bcc .8 + cmp #'z'+1 + bcs .8 + eor #$20 + +.8 clc + rts + +.9 >LDYA ZPPtr1 + sec + rts +*-------------------------------------- +CORE.StkPushPtr lda ZPInputBufPtrBak + jsr CORE.StkPush + bcs CORE.StkPullPtr.9 + lda ZPInputBufPtrBak+1 + bra CORE.StkPush +.9 rts +*-------------------------------------- +CORE.StkPullPtr jsr CORE.StkPull + bcs CORE.StkPullPtr.9 + sta ZPInputBufPtr+1 + jsr CORE.StkPull + bcs CORE.StkPullPtr.9 + sta ZPInputBufPtr +CORE.StkPullPtr.9 + rts +*-------------------------------------- +CORE.StkGetPtr lda (pData) StackPtr + beq .9 + dec + beq .9 + + tay + + lda (pData),y + sta ZPInputBufPtr + iny + lda (pData),y + sta ZPInputBufPtr+1 + + clc + rts + +.9 lda #E.SSYN + sec + rts +*-------------------------------------- +CORE.StkPush pha + lda (pData) StackPtr + inc + cmp #CORE.STACK.MAX + beq .9 + sta (pData) StackPtr + tay + pla + sta (pData),y +* clc + rts + +.9 pla + lda #E.STKOVERFLOW +* sec + rts +*-------------------------------------- +CORE.StkPull jsr CORE.StkGet + bcs .9 + + dey + pha + tya + sta (pData) StackPtr + pla + +.9 rts +*-------------------------------------- +CORE.StkGet lda (pData) StackPtr + beq .9 + tay + lda (pData),y + clc + rts + +.9 lda #E.SSYN + sec + rts +*-------------------------------------- +MAN +SAVE USR/SRC/BIN/SHELL.S.CORE +LOAD USR/SRC/BIN/SHELL.S +ASM diff --git a/BIN/SHELL.S.IO.txt b/BIN/SHELL.S.IO.txt index 5624c708..b368a78d 100644 --- a/BIN/SHELL.S.IO.txt +++ b/BIN/SHELL.S.IO.txt @@ -111,9 +111,9 @@ IO.PrintBatchErrMsg bne .2 Scan until EoL ldx ZPPtr1 - cpx ZPFileBufPtr + cpx ZPInputBufPtr lda ZPPtr1+1 - sbc ZPFileBufPtr+1 + sbc ZPInputBufPtr+1 bcc .1 not this line.... .4 ldy #0 @@ -137,7 +137,7 @@ IO.PrintBatchErrMsg lda (pPS),y >SYSCALL fprintf - lda ZPFileBufPtr + lda ZPInputBufPtr sec sbc ZPPtr2 beq .8 diff --git a/BIN/SHELL.S.txt b/BIN/SHELL.S.txt index 3570210f..601a705c 100644 --- a/BIN/SHELL.S.txt +++ b/BIN/SHELL.S.txt @@ -4,7 +4,7 @@ AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/SHELL + .TF BIN/SHELL2 *-------------------------------------- CL.MAX .EQ 159 History.MAX .EQ 256 @@ -63,9 +63,8 @@ ZPPtr2 .BS 2 ZPPtr3 .BS 2 ZPCLBuf .BS 2 ZPCLBufPtr .BS 2 -ZPFileBufPtr .BS 2 -ZPFileBufPtrBak .BS 2 -ZPCmdBuf .BS 2 +ZPInputBufPtr .BS 2 +ZPInputBufPtrBak .BS 2 ZPArgVBuf .BS 2 ZS.END .ED *-------------------------------------- @@ -119,42 +118,42 @@ J.CL.IO .DA CL.IO.AMP .DA CL.IO.1OUT .DA CL.IO.2OUTA .DA CL.IO.2OUT -L.CMD.INT .DA CMD.INT -J.CMD.INT .DA Cmd.INT.STARTPROC - .DA Cmd.INT.CD - .DA Cmd.INT.DATE - .DA Cmd.INT.ECHO - .DA Cmd.INT.EXIT - .DA Cmd.INT.GETKEY - .DA Cmd.INT.MD - .DA Cmd.INT.PAUSE - .DA Cmd.INT.PWD - .DA Cmd.INT.RD - .DA Cmd.INT.READ - .DA Cmd.INT.REN - .DA Cmd.INT.SET - .DA Cmd.INT.SLEEP - .DA Cmd.INT.SHIFT - .DA Cmd.INT.TIME - .DA Cmd.INT.PUSHD - .DA Cmd.INT.POPD - .DA Cmd.INT.BREAK - .DA Cmd.INT.CONTINUE - .DA Cmd.INT.FOR - .DA Cmd.INT.NEXT - .DA Cmd.INT.WHILE - .DA Cmd.INT.LOOP - .DA Cmd.INT.IF - .DA Cmd.INT.ELSE - .DA Cmd.INT.FI -L.CMD.Eval.TOKEN1 .DA CMD.Eval.TOKEN1 -L.CMD.Eval.TOKEN2 .DA CMD.Eval.TOKEN2 -J.CMD.Eval.TOKEN2 .DA CMD.Eval.D - .DA CMD.Eval.E - .DA CMD.Eval.F -L.CMD.Eval.TOKEN3 .DA CMD.Eval.TOKEN3 -L.CMD.Eval.TOKEN4 .DA CMD.Eval.TOKEN4 -J.CMD.Eval.TOKEN4 .DA M32.Add +L.CORE.INT .DA CORE.INT +J.CORE.INT .DA CORE.INT.STARTPROC + .DA CORE.INT.CD + .DA CORE.INT.DATE + .DA CORE.INT.ECHO + .DA CORE.INT.EXIT + .DA CORE.INT.GETKEY + .DA CORE.INT.MD + .DA CORE.INT.PAUSE + .DA CORE.INT.PWD + .DA CORE.INT.RD + .DA CORE.INT.READ + .DA CORE.INT.REN + .DA CORE.INT.SET + .DA CORE.INT.SLEEP + .DA CORE.INT.SHIFT + .DA CORE.INT.TIME + .DA CORE.INT.PUSHD + .DA CORE.INT.POPD + .DA CORE.INT.BREAK + .DA CORE.INT.CONTINUE + .DA CORE.INT.FOR + .DA CORE.INT.NEXT + .DA CORE.INT.WHILE + .DA CORE.INT.LOOP + .DA CORE.INT.IF + .DA CORE.INT.ELSE + .DA CORE.INT.FI +L.CORE.Eval.TOKEN1 .DA CORE.Eval.TOKEN1 +L.CORE.Eval.TOKEN2 .DA CORE.Eval.TOKEN2 +J.CORE.Eval.TOKEN2 .DA CORE.Eval.D + .DA CORE.Eval.E + .DA CORE.Eval.F +L.CORE.Eval.TOKEN3 .DA CORE.Eval.TOKEN3 +L.CORE.Eval.TOKEN4 .DA CORE.Eval.TOKEN4 +J.CORE.Eval.TOKEN4 .DA M32.Add .DA M32.Sub .DA M32.Mul .DA M32.Div @@ -186,7 +185,7 @@ CS.RUN jsr CMD.Init txa >STA.G hFileBuf >SYSCALL GetMemPtr - >STYA ZPFileBufPtr + >STYA ZPInputBufPtr lda #0 jsr ShiftA Remove $0=/bin/shell @@ -359,7 +358,7 @@ CS.RUN.BATCH >SYSCALL GetChar clc jmp CS.RUN.LOOP.END -.2 jsr CL.GetLine +.2 jsr CL.GetCmd bcc .7 cmp #C.EOF @@ -674,7 +673,6 @@ CL.Len .BS 1 CL.bExec .BS 1 CMD.IntCmd .BS 1 -CMD.hCmdBuf .BS 1 CMD.hArgVBuf .BS 1 CMD.ArgIndex .BS 1