PR#3 PREFIX /A2OSX.BUILD NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- CSH.TYPE.CHAR .EQ 1 CSH.TYPE.INT .EQ 2 CSH.TYPE.LONG .EQ 3 CSH.TYPE.FLOAT .EQ 4 *-------------------------------------- CSH.Init >LDYAI 256 >SYSCALL GetMemYA bcs .9 txa ldy #CSH.hSymbols sta (pData),y lda #0 ldy #CSH.SymbolsPtr sta (pData),y >LDYAI 256 >SYSCALL GetMemYA bcs .9 txa ldy #CSH.hData sta (pData),y lda #0 ldy #CSH.DataPtr sta (pData),y >LDYAI 256 >SYSCALL GetMemYA bcs .9 txa ldy #CSH.hStack sta (pData),y lda #0 ldy #CSH.StackPtr sta (pData),y * clc .9 rts *-------------------------------------- CSH.Run jsr CSH.GetBuf jsr CSH.GetPtrs ldy #0 jsr CSH.GetCharNB bcs .9 cmp #'}' End of block ? bne .10 jsr CSH.CheckStack must be on stack.... bcs .9 jsr CSH.Pop was expected, get stacked Cmd... tax jmp (J.CSHCMDS.END,x) .10 jsr CSH.SavePtr Save Ptr, in case of while,for.... cmp #$0D beq .6 empty line...skip... .1 iny sta (pData),y cpy #CmdLine.MAX beq .8 Buffer full, try execute... jsr CSH.GetNextChar bcs .8 EOF, try execute... cmp #$0D EOL, skip CR and exec... beq .6 jsr CSH.CheckCharNB bcc .1 still in keyword....loop tya sta (pData) jsr CSH.CheckKeyword bcs .5 not an internal CSH keyword.... lda #0 sta (pData) Reset Cmdline stx CSH.CmdSave jmp (J.CSHCMDS,x) .5 lda (ZPBufPtr) restore char.... bra .1 .6 jsr CSH.GetNextChar Skip last char... .8 tya beq .80 empty line....nothing to do.. sta (pData) ldy #bEcho lda (pData),y beq .80 >PUSHW pData >LDYA L.MSG.ECHO >SYSCALL PPrintFYA .80 clc .9 rts *-------------------------------------- CSH.Quit ldy #CSH.hBuf lda (pData),y beq .1 >SYSCALL FreeMemA .1 ldy #CSH.hStack lda (pData),y beq .2 >SYSCALL FreeMemA .2 ldy #CSH.hData lda (pData),y beq .3 >SYSCALL FreeMemA .3 ldy #CSH.hSymbols lda (pData),y beq .8 >SYSCALL FreeMemA .8 rts *-------------------------------------- CSH.GetBuf ldy #CSH.hBuf lda (pData),y >SYSCALL GetMemPtrA >STYA ZPBufBase ldy #CSH.BufLen lda (pData),y clc adc ZPBufBase sta CSH.GetChar.LO+1 iny lda (pData),y adc ZPBufBase+1 sta CSH.GetChar.HI+1 CSH.SetBufPtr ldy #CSH.BufPtr lda (pData),y clc adc ZPBufBase sta ZPBufPtr iny lda (pData),y adc ZPBufBase+1 sta ZPBufPtr+1 rts *-------------------------------------- CSH.GetPtrs ldy #CSH.hSymbols lda (pData),y >SYSCALL GetMemPtrA >STYA ZPCSHSymbols ldy #CSH.hData lda (pData),y >SYSCALL GetMemPtrA >STYA ZPCSHData ldy #CSH.hStack lda (pData),y >SYSCALL GetMemPtrA >STYA ZPCSHStack rts *-------------------------------------- CSH.SavePtr ldx ZPBufPtr stx CSH.BufPtrSave ldx ZPBufPtr+1 stx CSH.BufPtrSave+1 rts *-------------------------------------- CSH.CheckKeyword phy >LDYA L.CSHCMDS >STYA ZPPtr2 ldx #0 .1 lda (ZPPtr2) beq .9 Ending 0, not found.... cmp (pData) Same Len ? bne .4 tay .2 lda (pData),y cmp #'a' To Uppercase bcc .3 cmp #'z'+1 bcs .3 eor #$20 .3 cmp (ZPPtr2),y bne .4 dey bne .2 ply clc Found an internal Cmd... rts .4 inx inx lda ZPPtr2 sec adc (ZPPtr2) sta ZPPtr2 bcc .1 inc ZPPtr2+1 bra .1 .9 ply sec rts *-------------------------------------- CSH.WHILE CSH.IF jsr CSH.GetCharNB bcs .9 cmp #'(' bne .9 jsr CSH.GetNextCharNB bcs .9 jsr CSH.ExpEval bcs .99 jsr CSH.GetCharNB bcs .99 cmp #')' bne .9 jsr CSH.GetNextCharNB bcs .99 cmp #'{' bne .9 lda CSH.ACC ora CSH.ACC+1 ora CSH.ACC+2 ora CSH.ACC+3 beq .6 eval returned false, skip {{....}} jsr CSH.GetNextCharNB Skip '{' lda CSH.CmdSave Push "IF" or "WHILE" beq .1 if "IF", no need to push Saved Ptr pha lda CSH.BufPtrSave+1 WHILE : push loop address... jsr CSH.Push lda CSH.BufPtrSave jsr CSH.Push pla .1 jsr CSH.Push bcs .99 lda #'}' Tell '}' is expected at the end of block jsr CSH.Push bcs .99 rts .6 ldx #1 expecting 1 '}' for now.... .7 jsr CSH.GetNextChar bcs .9 cmp #'{' bne .71 inx bra .7 .71 cmp #'}' bne .7 txa beq .9 dex bne .7 jsr CSH.GetNextChar clc rts .9 lda #CSHERR.SYNTAX sec .99 rts *-------------------------------------- CSH.IF.END jsr CSH.GetNextChar just skip ending '}' clc rts *-------------------------------------- CSH.WHILE.END jsr CSH.Pop ldy #CSH.BufPtr sta (pData),y jsr CSH.Pop ldy #CSH.BufPtr+1 sta (pData),y clc rts *-------------------------------------- CSH.BREAK *-------------------------------------- CSH.CONTINUE lda #CSHERR.SYNTAX sec rts *-------------------------------------- CSH.CHAR lda #CSH.TYPE.CHAR bra CSH.TYPE CSH.INT lda #CSH.TYPE.INT bra CSH.TYPE CSH.LONG lda #CSH.TYPE.LONG bra CSH.TYPE CSH.FLOAT lda #CSH.TYPE.FLOAT CSH.TYPE sta CSH.ACCT jsr CSH.GetChar bcs .9 cmp #' ' bne .9 jsr CSH.GetIdentInCMD bcs .9 jsr CSH.GetCharNB bcs .9 cmp #';' beq .8 end of declaration, no value... cmp #'=' bne .9 jsr CSH.GetNextCharNB bcs .9 jsr CSH.ExpEval bcs .9 jsr CSH.GetChar bcs .9 cmp #';' bne .9 .8 jsr CSH.AddVar bcs .99 jsr CSH.GetNextCharNB Skip ; clc rts .9 lda #CSHERR.SYNTAX sec .99 rts *-------------------------------------- lda #CSHERR.SYNTAX sec rts *-------------------------------------- CSH.ExpEval jsr CSH.ZeroACC ldy #0 jsr CSH.GetCharNB bcs .9 cmp #')' beq .8 cmp #';' beq .8 jsr CSH.IsLetter Fnc or Var ? bcs .1 bra .9 .1 jsr CSH.IsDigit number ? bcs .9 jsr CSH.GetNumInACC bcs .9 .8 clc rts .9 lda #CSHERR.SYNTAX sec .99 rts *-------------------------------------- CSH.GetIdentInCMD ldy #0 jsr CSH.GetNextCharNB bcs .9 jsr CSH.IsLetter bcs .9 .1 iny sta CMD,y jsr CSH.GetNextChar bcs .8 jsr CSH.IsLetterOrDigit bcc .1 .8 sty CMD clc rts .9 lda #CSHERR.SYNTAX sec rts *-------------------------------------- CSH.GetNumInACC ldy #0 .1 iny cpy #10 beq .9 sta ARGS,y jsr CSH.GetNextChar bcs .8 jsr CSH.IsDigit bcc .1 .8 sty ARGS >PUSHW L.CSH.ACC >PUSHW L.ARGS >SYSCALL AToI bcs .9 rts .9 lda #CSHERR.SYNTAX sec rts *-------------------------------------- CSH.ZeroACC stz CSH.ACC stz CSH.ACC+1 stz CSH.ACC+2 stz CSH.ACC+3 rts *-------------------------------------- * Vars... *-------------------------------------- CSH.AddVar jsr CSH.FindVar bcc .97 ldy #CSH.SymbolsPtr lda (pData),y sec adc ARGS bcs .99 adc #2 TYPE + OFS bcs .99 ldy #CSH.DataPtr lda (pData),y pha ldx CSH.ACCT * clc adc CSH.TSIZE,x bcs .98 ldx #$ff ldy #CSH.SymbolsPtr lda (pData),y tay .10 inx lda CMD,x sta (ZPCSHSymbols),y iny cpx CMD bne .10 lda CSH.ACCT sta (ZPCSHSymbols),y iny pla Get Back Data OFS pha sta (ZPCSHSymbols),y iny tya ldy #CSH.SymbolsPtr sta (pData),y ply Get Back Data OFS again ldx CSH.ACCT lda CSH.TSIZE,x ldx #0 .1 pha lda CSH.ACC,x sta (ZPCSHData),y iny inx pla dec bne .1 tya ldy #CSH.DataPtr sta (pData),y clc rts .97 lda #CSHERR.DUP sec rts .98 pla .99 lda #CSHERR.OOM sec rts *-------------------------------------- CSH.SetVar clc rts *-------------------------------------- CSH.GetVar clc rts *-------------------------------------- CSH.FindVar >LDYA ZPCSHSymbols >STYA ZPPTR1 .1 ldy #0 lda (ZPPTR1),y beq .9 cmp CMD bne .4 pha Save Name len... ldx #0 .2 iny inx lda (ZPPTR1),y cmp CMD,x bne .3 cpx CMD bne .2 pla sec adc ZPPTR1 sta ZPPTR1 bcc .8 inc ZPPTR1+1 clc .8 rts .3 pla .4 sec adc ZPPTR1 bcc .5 inc ZPPTR1+1 clc .5 adc #2 Skip Type+OFS sta ZPPTR1 bcc .1 inc ZPPTR1+1 bra .1 .9 sec rts *-------------------------------------- * Stack *-------------------------------------- CSH.Push pha ldy #CSH.StackPtr lda (pData),y tay pla sta (ZPCSHStack),y iny beq .9 tya ldy #CSH.StackPtr sta (pData),y clc rts .9 lda #CSHERR.SOVERFLW sec rts *-------------------------------------- CSH.Pop ldy #CSH.StackPtr lda (pData),y beq .9 dec tay sta (pData),y lda (ZPCSHStack),y clc rts .9 lda #CSHERR.SYNTAX sec rts *-------------------------------------- CSH.CheckStack pha ldy #CSH.StackPtr lda (pData),y beq .9 dec tay pla cmp (ZPCSHStack),y bne .9 tya ldy #CSH.StackPtr sta (pData),y clc rts .9 lda #CSHERR.SYNTAX sec rts *-------------------------------------- * CHAR related Subs..... *-------------------------------------- CSH.GetCharNB jsr CSH.GetChar bcs CSH.GetNextCharNB.RTS jsr CSH.CheckCharNB bcc CSH.GetNextCharNB.RTS *-------------------------------------- CSH.GetNextCharNB jsr CSH.GetNextChar bcs CSH.GetNextCharNB.RTS jsr CSH.CheckCharNB bcs CSH.GetNextCharNB CSH.GetNextCharNB.RTS rts *-------------------------------------- CSH.CheckCharNB cmp #32 SPACE beq .9 cmp #13 CR beq .9 cmp #10 LF beq .9 cmp #8 TAB beq .9 clc .9 rts *-------------------------------------- CSH.GetNextChar phy ldy #CSH.BufPtr lda (pData),y inc sta (pData),y bne .1 iny lda (pData),y inc sta (pData),y .1 ply inc ZPBufPtr bne CSH.GetChar inc ZPBufPtr+1 *-------------------------------------- CSH.GetChar lda ZPBufPtr CSH.GetChar.LO eor #$ff Self Modified bne CSH.GetChar.8 lda ZPBufPtr+1 CSH.GetChar.HI eor #$ff Self Modified bne CSH.GetChar.8 lda #MLI.ERR.EOF sec rts CSH.GetChar.8 lda (ZPBufPtr) clc rts *--------------------------------------- CSH.IsLetterOrDigit jsr CSH.IsDigit bcc CSH.IsLetterRTS *--------------------------------------- CSH.IsLetter cmp #'A' bcc .9 cmp #'Z'+1 bcc CSH.IsLetterRTS cmp #'a' bcc .9 cmp #'z'+1 rts CC if lowercase .9 sec CSH.IsLetterRTS rts *--------------------------------------- CSH.IsDigit cmp #'0' bcc .9 cmp #'9'+1 rts cc if ok, cs if not .9 sec rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SBIN/SHELL.S.CSH LOAD /A2OSX.SRC/SBIN/SHELL.S ASM