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 bcc .41 jsr CORE.ArgV.Add external cmd, go check context bra .42 .41 jsr CORE.SkipCharsA txa >STA.G CORE.IntCmd cpx #C.FOR bcs .7 FOR...FI : always execute .42 jsr CORE.StkGet IF,WHILE,FOR ? bcs .7 no particular context, exec... asl bcc .43 context is FALSE, skip line asl bcs .7 if CC, parent context is FALSE, skip line .43 jsr CORE.GetNextCharNB bcs .44 EOF cmp #C.CR beq .44 cmp #';' TODO ";" bne .43 .44 jsr CORE.GetNextCharNB Skip EoL char clc rts .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) >LDYA ZPArgVBuf >STYA ZPArgVBufPtr >LDA.G CORE.IntCmd bmi CORE.ExecExtCmd tax jmp (J.CMD,x) 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 beq .8 jsr CORE.ArgV.PutChar bra .7 .8 tya beq .81 lda #0 jsr CORE.ArgV.PutChar .81 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