NEW PREFIX AUTO 4,1 .LIST OFF *-------------------------------------- CORE.Init >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPArgVBuf txa >STA.G CORE.hArgVBuf .9 rts *-------------------------------------- CORE.Quit >LDA.G CORE.hArgVBuf beq .9 >SYSCALL FreeMem .9 rts *-------------------------------------- * http://heirloom.sourceforge.net/sh/sh.1.html *-------------------------------------- * Input : ZPArgVBuf (String) * Tokenize ZPArgVBuf * :LOOP * if CmdSep=| : * set hStdIn = hStdOut * set hStdOut = Std * GetCmd from line until | or EOL * if CmdSep=| : * create PIPE * set hStdOut -> PIPE * CORE.Exec & * :LOOP * else CORE.Exec *-------------------------------------- * SET VAR = `cmd args`, FOR VAR IN `cmd args` * create PIPE * set hStdOut -> PIPE * CORE.Exec `cmd args` & * set READMODE * set hStdIn = hStdOut * set hStdOut = Std *-------------------------------------- CORE.Run.CSYN lda #E.CSYN sec rts CORE.Run >LDYA ZPInputBufPtr Save Actual cmd for looping >STYA ZPInputCmdPtr >LDYA ZPArgVBuf >STYA ZPArgVBufPtr lda #0 Reset ArgV Buffer sta (ZPArgVBuf) lda #S.PS.F.HOLD+S.PS.F.DUPENV >STA.G CORE.PSFlags lda #$ff >STA.G CORE.IntCmd assume external jsr CORE.GetCharNB bcc .11 jsr IO.Reset lda #0 sec rts Ending 0, CS,A=0 .11 cmp #'|' bne .21 jsr IO.Pipe.In bcs .9 jsr CORE.GetNextCharNB Skip | bcs CORE.Run.CSYN bra .3 .21 pha jsr IO.Reset pla .3 cmp #C.CR beq .80 empty line ? .10 cmp #'#' commented line? bne .2 .12 jsr CORE.GetNextCharNB bcs .8 EOF cmp #C.CR bne .12 EOL .80 jsr CORE.GetNextChar skip CR... .8 jsr IO.Reset lda #0 clc .9 rts EOL, CS,A=0 .2 cmp #'.' bne .4 ldy #1 lda (ZPInputBufPtr),y cmp #C.SPACE bne .4 >LDA.G CORE.PSFlags yes, child process will run in same ENV and #$ff^S.PS.F.DUPENV sta (pData),y jsr CORE.GetNextCharNB skip ". " bcs CORE.Run.RTS nothing to execute... .4 >LDYA L.CMD internal command ? jsr CORE.LookupInputBuf bcs .6 no...assume external...no IO token Expected jsr CORE.SkipCharsA txa >STA.G CORE.IntCmd bra .7 internal, do not add token .5 >LDYA L.CORE.IO jsr CORE.LookupInputBuf bcs .6 jsr CORE.SkipCharsA jsr CORE.IO.JMP bcs CORE.Run.RTS bra .7 .6 jsr CORE.ArgV.Add .7 jsr CORE.GetCharNB bcs CORE.ExecCmd.1 Nothing to skip jsr CORE.IsEndCmd bcs .5 cmp #'|' bne CORE.ExecCmd skip CR, ; jsr IO.Pipe.Out bcs CORE.Run.RTS jsr CORE.IO.AMP run in background bra CORE.ExecCmd.1 Do not skip | CORE.Run.RTS rts *-------------------------------------- * Input : ZPArgVBuf *-------------------------------------- CORE.ExecCmd jsr CORE.GetNextCharNB Skip EoL char CORE.ExecCmd.1 lda #0 sta (ZPArgVBufPtr) 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 >LDYA ZPArgVBuf >STYA ZPArgVBufPtr >LDA.G CORE.IntCmd bmi CORE.ExecExtCmd tax jmp (J.CMD,x) .8 clc rts CORE.ExecExtCmd >PUSHB.G CORE.PSFlags >LDYA ZPArgVBuf >SYSCALL execv CORE.ExecExtCmd.Exit bcs .9 tax CPID >LDA.G CORE.PSFlags and #S.PS.F.HOLD bne .4 txa >PUSHA >PUSHBI 1 >PUSHW L.MSG.PID ldy #S.PS.hStdErr lda (pPS),y >SYSCALL fprintf 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 *-------------------------------------- * search ZPInputBufPtr/ZPArgVBufPtr in Y,A table *-------------------------------------- CORE.LookupInputBuf >STYA ZPPtr1 >LDYA ZPInputBufPtr bra CORE.Lookup CORE.LookupArgVBuf >STYA ZPPtr1 >LDYA ZPArgVBufPtr CORE.Lookup >STYA ZPPtr2 ldx #0 .1 ldy #$ff .2 iny lda (ZPPtr2),y beq .3 Src Keyword end jsr CORE.IsSpaceOrEndCmd bcc .3 Src Keyword end lda (ZPPtr1),y beq .4 Table Keyword end lda (ZPPtr2),y cmp #'a' bcc .21 cmp #'z'+1 bcs .21 eor #$20 .21 cmp (ZPPtr1),y beq .2 bra .4 .3 lda (ZPPtr1),y bne .4 tya Keyword Len clc .8 rts .4 inc ZPPtr1 bne .5 inc ZPPtr1+1 .5 lda (ZPPtr1) bne .4 inc ZPPtr1 bne .6 inc ZPPtr1+1 .6 inx inx lda (ZPPtr1) Array Ending 0, must be an external Cmd.... bne .1 lda #E.CSYN sec rts *-------------------------------------- * ArgV *-------------------------------------- CORE.ArgV.Add >LDYA ZPArgVBufPtr >STYA ZPArgVBufPrev Save String start of Expand lda #C.SPACE sta TmpByte jsr CORE.GetCharNB bcs .9 cmp #'"' bne .10 sta TmpByte bra .1 .10 cmp #'`' bne .11 sta TmpByte .11 jsr CORE.ArgV.PutChar .1 jsr CORE.GetNextChar bcs .5 .2 cmp TmpByte bne .3 jsr CORE.GetNextChar bra .5 .3 ldy TmpByte cpy #C.SPACE bne .40 jsr CORE.IsEndCmd bcc .5 .40 jsr CORE.ArgV.PutChar .4 jsr CORE.GetNextChar bcc .2 .5 lda #0 jsr CORE.ArgV.PutChar >LDYA ZPArgVBufPrev >SYSCALL ExpandStr bcs .9 phx >STYA ZPPtr1 >LDYA ZPArgVBufPrev >STYA ZPArgVBufPtr ldy #$ff .7 iny lda (ZPPtr1),y jsr CORE.ArgV.PutChar lda (ZPPtr1),y bne .7 pla >SYSCALL freemem .9 rts *-------------------------------------- CORE.ArgV.PutChar sta (ZPArgVBufPtr) CORE.ArgV.NextChar inc ZPArgVBufPtr bne .8 inc ZPArgVBufPtr+1 .8 rts *-------------------------------------- CORE.ArgV.Next lda (ZPArgVBufPtr) beq .8 >LDYA ZPArgVBufPtr >STYA ZPArgVBufPrev .1 jsr CORE.ArgV.NextChar lda (ZPArgVBufPtr) bne .1 jsr CORE.ArgV.NextChar lda (ZPArgVBufPtr) .8 rts *-------------------------------------- * IO *-------------------------------------- CORE.IO.JMP jmp (J.CORE.IO,x) CORE.IO.AMP >LDA.G CORE.PSFlags and #$ff^S.PS.F.HOLD sta (pData),y clc CORE.IO.RTS rts CORE.IO.IN lda #O.RDONLY+O.TEXT jsr CORE.IO.Open bcs CORE.IO.RTS jmp IO.Set.In CORE.IO.OUTA CORE.IO.1OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT bra CORE.IO.OUT.1 CORE.IO.OUT CORE.IO.1OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT CORE.IO.OUT.1 jsr CORE.IO.Open bcs CORE.IO.RTS jmp IO.Set.Out CORE.IO.2OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT bra CORE.IO.2OUT.1 CORE.IO.2OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT CORE.IO.2OUT.1 jsr CORE.IO.Open bcs CORE.IO.RTS jmp IO.Set.Err *-------------------------------------- CORE.IO.Open pha Open Mode jsr CORE.GetCharNB bcs .9 no arg left.... jsr CORE.ArgV.Add Get Filename >PUSHWI 0 Aux type >PUSHBI S.FI.T.TXT ftype pla >PUSHA flags >LDYA ZPArgVBufPrev >STYA ZPArgVBufPtr Discard filename >SYSCALL fopen rts .9 pla lda #E.CSYN sec rts *-------------------------------------- * Input Buffer *-------------------------------------- CORE.IsSpaceOrEndCmd cmp #C.SPACE beq CORE.IsEndCmd.8 CORE.IsEndCmd cmp #';' beq CORE.IsEndCmd.8 cmp #C.CR beq CORE.IsEndCmd.8 cmp #'|' beq CORE.IsEndCmd.8 sec rts CORE.IsEndCmd.8 clc rts *-------------------------------------- CORE.GetCharNB jsr CORE.GetChar bcs CORE.GetNextCharNB.RTS jsr CORE.CheckCharNB bcc CORE.GetNextCharNB.RTS *-------------------------------------- CORE.GetNextCharNB jsr CORE.GetNextChar bcs CORE.GetNextCharNB.RTS jsr CORE.CheckCharNB bcs CORE.GetNextCharNB CORE.GetNextCharNB.RTS rts *-------------------------------------- CORE.CheckCharNB cmp #C.SPACE beq .9 cmp #C.LF beq .9 cmp #C.TAB beq .9 clc .9 rts *-------------------------------------- CORE.GetNextChar inc ZPInputBufPtr bne CORE.GetChar inc ZPInputBufPtr+1 *-------------------------------------- CORE.GetChar lda (ZPInputBufPtr) beq .9 clc rts .9 sec rts *-------------------------------------- CORE.SkipCharsA clc adc ZPInputBufPtr sta ZPInputBufPtr bcc .8 inc ZPInputBufPtr+1 .8 rts *-------------------------------------- * Stack *-------------------------------------- CORE.StkPushPtr lda ZPInputCmdPtr jsr CORE.StkPush bcs CORE.StkPullPtr.9 lda ZPInputCmdPtr+1 bra CORE.StkPush *-------------------------------------- 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 CORE.StkErr dec beq CORE.StkErr tay lda (pData),y sta ZPInputBufPtr iny lda (pData),y sta ZPInputBufPtr+1 clc rts CORE.StkErr lda #E.STACKERROR 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 CORE.StkErr tay lda (pData),y clc rts *-------------------------------------- MAN SAVE USR/SRC/BIN/SH.S.CORE LOAD USR/SRC/BIN/SH.S ASM