NEW PREFIX AUTO 4,1 .LIST OFF *-------------------------------------- * From hCLBuf or hFileBuf * Get Line from buf until ;, CR, \0 (EOL / EOF) * :LOOP * if previous | : * set hStdIn = hStdOut * set hStdOut = Std * GetCmd from line until | or EOL * if | : * 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 *-------------------------------------- * Input : CORE.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 CORE.IntCmd bpl .80 Internal >PUSHB.G CORE.PSFlags >LDYA ZPArgVBuf >SYSCALL execv bcs .9 tax CPID >LDA.G CORE.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 CORE.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 StatBuf >LDYA ZPPtr1 >SYSCALL STAT bcs CORE.INT.CD.1.9 >LDA.G StatBuf+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 TimeBuf >SYSCALL Time >PUSHEA.G TimeBuf 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 CORE.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 CORE.ArgIndex tax jsr CORE.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 StatBuf pla ply >SYSCALL STAT bcs .99 >LDA.G StatBuf+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 StatBuf+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 StatBuf+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 StatBuf 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