NEW AUTO 3,1 .LIST OFF *-------------------------------------- CSH.Init >SYSCALL SListNew bcs .9 >STA.G CSH.hDefines >SYSCALL SListNew bcs .9 >STA.G CSH.hTags >SYSCALL SListNew bcs .9 >STA.G CSH.hSymbols >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPCSHConst txa >STA.G CSH.hConst >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPCSHData txa >STA.G CSH.hData >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPCSHStack txa >STA.G CSH.hStack lda #0 >STA.G CSH.ConstPtr >STA.G CSH.StackPtr * sta (ZPCSHConst) * sta (ZPCSHStack) * >DEC.G bTrace * >DEC.G bDebug * clc .9 rts *-------------------------------------- CSH.Quit >LDA.G CSH.hSymbols beq .1 >PUSHA >SYSCALL SListFree .1 >LDA.G CSH.hTags beq .2 >PUSHA >SYSCALL SListFree .2 >LDA.G CSH.hDefines beq .3 >PUSHA >SYSCALL SListFree .3 lda ZPhMacro jsr .7 >LDA.G hFileBuf jsr .7 >LDA.G CSH.hStack jsr .7 >LDA.G CSH.hData jsr .7 >LDA.G CSH.hConst .7 beq CSH.Quit.RTS >SYSCALL FreeMem CSH.Quit.RTS rts *-------------------------------------- CSH.Run jsr CSH.GetCharNB bcs CSH.Quit.RTS CSH.Run.1 cmp #C.CR empty line.... beq .2 cmp #'/' bne .3 comments ... jmp CSH.COMMENTS .2 jmp CSH.GetNextChar Skip CR and exit .3 cmp #'#' directive ? bne .4 jmp CSH.DIR .4 cmp #'}' End of block ? bne .40 jsr CSH.CheckStack must be something on stack.... bcs .9 jsr CSH.GetNextCharNB Skip '}' jsr CSH.Pop was expected.... jsr CSH.Pop get stacked Cmd... tax jmp (J.CSH.KW.END,x) .40 jsr CSH.IsLetter bcc .5 bra .99 error, todo : PREOPS ++ --..... .5 jsr CSH.SavePtr Save Ptr, in case of while,for.... >LDYA L.CSH.KW jsr CSH.LookupID bcs .6 not an internal CSH keyword.... jsr CSH.KW.JMP bcs .9 bra .8 .6 jsr CSH.GetVar bcs .7 >STYA ZPVarID jsr CSH.GetVarDef Get Type & ptr... bcs .9 jsr CSH.GetCharNB bcs .9 cmp #'=' TODO: all AOPS bne .99 jsr CSH.GetNextChar Skip = bcs .99 lda ZPVarType jsr CSH.ExpEval bcs .9 jsr CSH.SetVarValueFromStack X = Exp Type bcs .9 jsr CSH.GetChar cmp #';' beq .8 .99 lda #CSH.E.SYNTAX sec .9 rts .7 lda #0 no return value type check required jsr CSH.fCall bcs .9 jsr CSH.GetVarSize X = returned value type clc A = Sizeof adc pStack sta pStack Discard value on stack .8 jsr CSH.GetNextCharNB Skip ; bcs .9 cmp #C.CR beq .80 jmp CSH.Run.1 .80 jmp CSH.GetNextChar Skip CR *-------------------------------------- CSH.COMMENTS jsr CSH.GetNextChar cmp #'/' bne .90 jmp CSH.SkipLine skip line..... .90 lda #CSH.E.SYNTAX sec rts *-------------------------------------- CSH.DIR jsr CSH.GetNextCharNB bcs .99 cmp #'!' #!/bin/csh bne .1 bra CSH.SkipLine .1 >LDYA L.CSH.DIRS jsr CSH.LookupID bcs .91 jmp (J.CSH.DIRS,x) .91 lda #CSH.E.INVDIR sec .99 rts *-------------------------------------- CSH.DIR.DEFINE jsr CSH.CheckSpace bcs .99 jsr CSH.IsLetter bcs .90 >LDA.G CSH.hDefines jsr CSH.NewKey bcs .99 >STYA ZPVarID jsr CSH.CheckSpace bcs .99 ldy #$ff .1 iny lda (ZPFileBufPtr),y beq .2 cmp #C.CR bne .1 dey .2 iny lda #0 pha phy >PUSHB.G CSH.hDefines >PUSHW ZPVarID >PUSHW ZPFileBufPtr ply pla >PUSHYA DataLen >SYSCALL SListAddData bcs .99 bra CSH.SkipLine .90 lda #CSH.E.SYNTAX sec .99 rts *-------------------------------------- CSH.SkipLine jsr CSH.GetNextChar bcs .9 cmp #C.CR bne CSH.SkipLine clc .9 rts *-------------------------------------- * Built in Keywords *-------------------------------------- CSH.KW.JMP txa >STA.G CSH.CmdSave jmp (J.CSH.KW,x) *-------------------------------------- CSH.WHILE CSH.IF jsr CSH.GetCharNB bcs .9 cmp #'(' bne .9 jsr CSH.GetNextCharNB bcs .9 lda #0 Any var type jsr CSH.ExpEval bcs .99 jsr CSH.GetCharNB bcs .99 cmp #')' bne .9 jsr CSH.GetNextCharNB skip ')' bcs .99 cmp #'{' bne .9 jsr CSH.GetNextCharNB Skip '{' bcs .99 jsr CSH.IsValue0 X = var type from ExpEval bcc .6 Value=0, skip {{....}} >LDA.G CSH.CmdSave beq .1 IF pha >LDA.G CSH.BufPtrSave+1 WHILE : push loop address... jsr CSH.Push >LDA.G 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 jsr CSH.SkipBlock bcc .99 .9 lda #CSH.E.SYNTAX sec .99 rts *-------------------------------------- *CSH.Keyword.Start * >LDA.G CSH.CmdSave get back Token ("IF" or "WHILE") * tax * jmp (J.CSH.KW.START,x) *-------------------------------------- *CSH.IF.START jmp CSH.Push Push "IF" Token *-------------------------------------- *CSH.WHILE.START pha * >LDA.G CSH.BufPtrSave+1 WHILE : push loop address... * jsr CSH.Push * >LDA.G CSH.BufPtrSave * jsr CSH.Push * pla * jmp CSH.Push Push "WHILE" Token *-------------------------------------- CSH.IF.END clc rts *-------------------------------------- CSH.WHILE.END jsr CSH.Pop sta ZPFileBufPtr jsr CSH.Pop sta ZPFileBufPtr+1 clc rts *-------------------------------------- CSH.ELSE *-------------------------------------- CSH.DO CSH.FOR CSH.SWITCH CSH.CASE CSH.BREAK CSH.CONTINUE CSH.TYPEDEF CSH.SIZEOF lda #CSH.E.SYNTAX sec rts *-------------------------------------- CSH.STRUCT >ENTER 4 jsr CSH.GetCharNB bcs .99 >LDA.G CSH.hTags jsr CSH.NewKey bcs .99 sta (pStack) jsr CSH.GetNextCharNB bcs .99 cmp #'{' bne .99 .1 jsr CSH.GetNextCharNB bcs .99 cmp #'}' bne .1 jsr CSH.GetNextCharNB skip } clc .99 >LEAVE rts *-------------------------------------- * Built in Types *-------------------------------------- CSH.SIGNED sec .HS 90 BCC *-------------------------------------- CSH.UNSIGNED clc php jsr CSH.CheckSpace bcs .9 >LDYA L.CSH.STYPES jsr CSH.LookupID bcs .9 plp bcs .8 jmp (J.CSH.UTYPES,x) .8 jmp (J.CSH.STYPES,x) .9 plp lda #CSH.E.SYNTAX sec rts *-------------------------------------- CSH.VOID ldx #CSH.T.VOID bra CSH.TYPE CSH.CHAR ldx #CSH.T.CHAR bra CSH.TYPE CSH.UCHAR ldx #CSH.T.UCHAR bra CSH.TYPE CSH.INT ldx #CSH.T.INT bra CSH.TYPE CSH.UINT ldx #CSH.T.UINT bra CSH.TYPE CSH.LONG ldx #CSH.T.LONG bra CSH.TYPE CSH.ULONG ldx #CSH.T.ULONG bra CSH.TYPE CSH.FLOAT ldx #CSH.T.FLOAT CSH.TYPE stx ZPVarType jsr CSH.CheckSpace bcs .9 .11 cmp #'*' bne .10 lda #CSH.Q.POINTER tsb ZPVarType jsr CSH.GetNextCharNB Skip * bra .11 .10 jsr CSH.IsLetter bcs .9 jsr CSH.AddVar add with undef value... bcs .99 OOM or DUP jsr CSH.GetCharNB bcs .9 cmp #';' beq .8 .2 cmp #'=' bne .9 jsr CSH.GetNextCharNB Skip = bcs .9 lda ZPVarType jsr CSH.ExpEval bcs .99 .7 jsr CSH.SetVarValueFromStack X= Type, Set value to this var bcs .99 jsr CSH.GetChar bcs .9 cmp #';' bne .9 .8 clc rts .9 lda #CSH.E.SYNTAX sec .99 rts *-------------------------------------- * Input: * ZPFileBufPtr, A = Expected type * Output: * CS, A = EC * CC, Result on Stack, X = Type *-------------------------------------- CSH.fCall ldx ZPPtr1 phx ldx ZPPtr1+1 local : fdef phx ldx ZPPtr2 local : type phx ldx ZPPtr2+1 local : variadic size phx sta ZPPtr2 save Type stz ZPPtr2+1 Reset VARIADIC byte count >LDYA L.CSH.FN jsr CSH.LookupFn phx X = function index bcs .10 >STYA ZPPtr1 f() definition, starting at returned type jsr CSH.GetCharNB bcs .10 cmp #'(' bne .52 jsr CSH.GetNextCharNB skip '(' .10 bcs .90 lda ZPPtr2 bne .11 lda (ZPPtr1) sta ZPPtr2 bra .1 expected type is 0, no check .11 cmp (ZPPtr1) Get Return value Type bne .91 .1 jsr CSH.ZPPtr1Next advance to arg list type lda (ZPPtr1) get type of first arg beq .7 end of list, go check ending ')' *-------------------------------------- .3 eor #CSH.T.VARIADIC if VARIADIC, don't advance to next arg and assume type = 0 beq .4 eor #CSH.T.VARIADIC restore type... .4 jsr CSH.ExpEval A=0 if VARIADIC bcs .9 X = Var Type lda (ZPPtr1) get current arg type eor #CSH.T.VARIADIC bne .5 jsr CSH.GetVarSize X = Var Type * clc adc ZPPtr2+1 sta ZPPtr2+1 Add to byte count bra .51 .5 jsr CSH.ZPPtr1Next .51 jsr CSH.GetCharNB bcs .90 cmp #',' bne .6 jsr CSH.GetNextCharNB Skip , lda (ZPPtr1) bne .3 Another ARG.... .52 bra .90 extra args....error .6 cmp #')' bne .90 lda (ZPPtr1) beq .8 no more arg after ')', exit eor #CSH.T.VARIADIC bne .90 missing arg >PUSHB ZPPtr2+1 push VARIADIC byte count bra .8 .7 jsr CSH.GetCharNB bcs .90 cmp #')' bne .90 .8 jsr CSH.GetNextCharNB Skip ) plx restore X = function index ldy ZPPtr2 get type in Y pla sta ZPPtr2+1 pla sta ZPPtr2 pla sta ZPPtr1+1 pla sta ZPPtr1 phy jsr .80 plx rts .90 lda #CSH.E.SYNTAX .HS 2C BIT ABS .91 lda #CSH.E.TMISMATCH sec .9 plx Discard function index plx stx ZPPtr2+1 plx stx ZPPtr2 plx stx ZPPtr1+1 plx stx ZPPtr1 .99 rts .80 jmp (J.CSH.EXEC,x) *-------------------------------------- * Input: * ZPFileBufPtr, A = Expected type * Output: * CS, A = EC * CC, X = Var Type, Value on Stack *-------------------------------------- CSH.ExpEval ldx ZPPtr1 phx ldx ZPPtr1+1 local : used by lookup phx ldx ZPPtr2 local : VarType phx ldx ZPPtr2+1 local : BOP phx sta ZPPtr2 local : expected type lda #$ff pha *-------------------------------------- .10 jsr CSH.GetCharNB bcs .19 .11 cmp #'(' bne .20 jsr CSH.GetNextCharNB skip ( bcs .19 lda ZPPtr2 jsr CSH.ExpEval bcs .19 stx ZPPtr2 jsr CSH.GetCharNB bcs .19 cmp #')' bne .19 jsr CSH.GetNextCharNB skip ) bcc .31 .19 jmp .90 *-------------------------------------- .20 jsr CSH.IsLetter define, Fnc or Var ? bcs .22 jsr CSH.GetDefine bcc .10 jsr CSH.GetVar bcs .21 ldx ZPPtr2 YA=VarID, X=expected var type (or 0=any) jsr CSH.GetVarValueOnStack Y,A = VarID, Get value on stack bcs .29 stx ZPPtr2 store real var type bra .30 .21 lda ZPPtr2 var type jsr CSH.fCall X = function index bcs .29 stx ZPPtr2 store real var type bra .30 .22 jsr CSH.IsDigit10 number ? bcs .24 ldx ZPPtr2 bne .23 ldx #CSH.T.INT stx ZPPtr2 .23 jsr CSH.GetNumOnStack bcs .29 bra .30 .24 cmp #'"' String literal bne .90 jsr CSH.AddContCharP .29 bcs .99 *-------------------------------------- .30 jsr CSH.GetCharNB bcs .90 .31 cmp #',' beq .80 cmp #')' beq .80 cmp #';' beq .80 jsr CSH.IsOPChar bcs .90 >LDYA L.CSH.BOPS we are at V1 op1 V2 op2... jsr CSH.LookupOP bcs .90 stx ZPPtr2+1 save OP(n) .32 pla get OP(n-1) bmi .33 $ff.... cmp ZPPtr2+1 bcc .33 OP(n) has precedence, on stack : V1,V2 tax OP(n-1) has precedence... lda ZPPtr2 Var Type jsr CSH.BOP.EXEC compute V(n-1) V(n) bcc .32 bcs .99 .33 pha push back OP(n-1) lda ZPPtr2+1 get OP(n) pha push OP(n) on stack jmp .10 go check for next token *-------------------------------------- .80 plx any OP on stack ? bmi .88 lda ZPPtr2 Var Type jsr CSH.BOP.EXEC bcc .80 bcs .99 .90 lda #CSH.E.SYNTAX .99 plx bpl .99 sec .HS 90 BCC .88 clc ldx ZPPtr2 X = Var Type ply sty ZPPtr2+1 ply sty ZPPtr2 ply sty ZPPtr1+1 ply sty ZPPtr1 rts *-------------------------------------- CSH.AddContCharP ldy #0 .1 jsr CSH.GetNextChar bcs .9 cmp #C.CR beq .9 cmp #'"' beq .2 sta (ZPCSHConst),y iny bra .1 .2 lda #0 sta (ZPCSHConst),y >PUSHW ZPCSHConst Push PTR on stack tya sec adc ZPCSHConst sta ZPCSHConst bcc .3 inc ZPCSHConst+1 .3 jsr CSH.GetNextChar Skip " clc rts .9 lda #CSH.E.SYNTAX sec rts *-------------------------------------- CSH.SavePtr >LDYA ZPFileBufPtr >STYA.G CSH.BufPtrSave rts *-------------------------------------- CSH.LookupFN sec .HS 90 BCC CSH.LookupID clc >STYA ZPPtr1 ror >STA.G CSH.LookupOpt jsr CSH.GetIDLen bra CSH.Lookup CSH.LookupOP >STYA ZPPtr1 >STZ.G CSH.LookupOpt jsr CSH.GetOPLen CSH.Lookup phy Y = len ldx #0 .1 lda (ZPPtr1) beq .9 Ending 0, not found.... pla pha Get Back Len cmp (ZPPtr1) Same Len ? bne .4 tay .2 lda (ZPPtr1),y .3 dey cmp (ZPFileBufPtr),y bne .4 tya bne .2 pla Found keyword... clc adc ZPFileBufPtr ..advance Ptr to char after it.. sta ZPFileBufPtr bcc .31 inc ZPFileBufPtr+1 .31 lda ZPPtr1 sec adc (ZPPtr1) tay lda ZPPtr1+1 adc #0 clc Y,A = F() def, X = F() index .8 rts .4 inx inx lda (ZPPtr1) jsr CSH.ZPPtr1AddAp1 >LDA.G CSH.LookupOpt bpl .1 ldy #$0 Start at Y=1 for VOID func() .6 iny lda (ZPPtr1),y bne .6 tya jsr CSH.ZPPtr1AddAp1 bra .1 .9 pla sec rts *-------------------------------------- CSH.ZPPtr1Next inc ZPPtr1 bne .8 inc ZPPtr1+1 .8 rts *-------------------------------------- CSH.ZPPtr1AddAp1 sec adc ZPPtr1 sta ZPPtr1 bcc .1 inc ZPPtr1+1 .1 rts *-------------------------------------- CSH.GetNumOnStack txa beq .99 .10 cpx #CSH.T.FLOAT bcc .1 bne .99 >PUSHWI ZPFileBufPtr >LDYA ZPFileBufPtr >SYSCALL StrToF clc rts .1 >PUSHW ZPFileBufPtr >PUSHWI ZPFileBufPtr >PUSHBI 10 phx cpx #CSH.T.UCHAR bcc .2 >SYSCALL StrToUL bra .3 .2 >SYSCALL StrToL .3 plx bcs .9 lda CSH.TYPESIZE,x cmp #4 beq .8 cmp #2 bne .4 ldy #1 >PULLA sta (pStack),y >PULLA sta (pStack),y clc rts .4 >PULLA inc pStack inc pStack sta (pStack) .8 clc .9 rts .99 lda #CSH.E.TMISMATCH sec rts *-------------------------------------- * Input : ZPFileBufPtr * Output : Y,A = VarID *-------------------------------------- CSH.AddVar >LDA.G CSH.hSymbols jsr CSH.NewKey bcs .9 >STYA ZPVarID ldx ZPVarType jsr CSH.GetVarSize sta ZPVarSizeOf lda ZPCSHData sta ZPVarDataPtr clc adc ZPVarSizeOf sta ZPCSHData lda ZPCSHData+1 sta ZPVarDataPtr+1 adc ZPVarSizeOf+1 sta ZPCSHData+1 >LDA.G CSH.DataPtr clc adc ZPVarSizeOf sta (pData),y bcs .99 >PUSHB.G CSH.hSymbols >PUSHW ZPVarID >PUSHWI ZPVarDef >PUSHWI 6 >SYSCALL SListAddData * bcs .9 * lda #'*' * jsr DEBUG.VAR .9 rts .99 lda #CSH.E.OOM .HS 2C BIT ABS CSH.TMISMATCH lda #CSH.E.TMISMATCH sec rts *-------------------------------------- CSH.NewKey >PUSHA >PUSHW ZPFileBufPtr >SYSCALL SListNewKey bcs .9 pha txa * clc adc ZPFileBufPtr sta ZPFileBufPtr bcc .1 inc ZPFileBufPtr+1 .1 clc pla .9 rts *-------------------------------------- * X=Type *-------------------------------------- CSH.SetVarValueFromStack cpx ZPVarType X = type bne .99 ldy #0 .1 lda (pStack) sta (ZPVarDataPtr),y inc pStack iny cpy ZPVarSizeOf bne .1 * lda #'>' * jsr DEBUG.VAR clc rts .99 lda #CSH.E.TMISMATCH sec rts *-------------------------------------- CSH.GetDefine >PUSHB.G CSH.hDefines jsr CSH.Get bcs .9 pha phy >PUSHB.G CSH.hDefines ply pla >PUSHYA KeyID >PUSHWZ Allocate.. >PUSHWZ len = 0 (string mode) >PUSHWZ From Start >SYSCALL SListGetData bcs .9 stx ZPhMacro lda ZPFileBufPtr sta ZPFileBufPtrBak lda ZPFileBufPtr+1 sta ZPFileBufPtrBak+1 txa >SYSCALL getmemptr >STYA ZPFileBufPtr .9 rts *-------------------------------------- CSH.GetVar >PUSHB.G CSH.hSymbols CSH.Get >PUSHW ZPFileBufPtr >SYSCALL SListLookup bcs .9 pha txa * clc adc ZPFileBufPtr sta ZPFileBufPtr bcc .1 inc ZPFileBufPtr+1 clc .1 pla Y,A = VarID .9 rts *-------------------------------------- CSH.GetVarDef phy pha >PUSHB.G CSH.hSymbols pla >PUSHA pla >PUSHA KeyID >PUSHWI ZPVarDef >PUSHWI 6 6 bytes >PUSHWI 0 From Start >SYSCALL SListGetData rts *-------------------------------------- * Input : * X=Var Type (or 0) * YA=VarID * Output : Stack, X = Var Type *-------------------------------------- CSH.GetVarValueOnStack phx phy pha >PUSHB.G CSH.hSymbols pla >PUSHA pla >PUSHA KeyID >PUSHEA.G CSH.VarDef >PUSHWI 6 6 bytes >PUSHWI 0 From Start >SYSCALL SListGetData plx bcs .9 txa beq .1 any type >CMP.G CSH.VarDef Type beq .2 and #CSH.Q.PPPOINTER beq .99 not pointer....mismatch >EOR.G CSH.VarDef and #CSH.Q.PPPOINTER bne .99 compare only pointer depth .1 >LDA.G CSH.VarDef beq * .2 tax jsr CSH.GetVarSize pha >LDA.G CSH.VarDef+4 sta ZPPtr3 iny lda (pData),y sta ZPPtr3+1 ply .3 dey lda (ZPPtr3),y >PUSHA tya bne .3 >LDA.G CSH.VarDef tax clc X = Var Type .9 rts .99 lda #CSH.E.TMISMATCH sec rts *-------------------------------------- * Input : Value on Stack, X = Var Type * Output : CC = true, CS = false *-------------------------------------- CSH.IsValue0 cpx #CSH.T.FLOAT bcc .1 char,int,long ldy CSH.TYPESIZE,x lda (ZPVarDataPtr),y bne .9 .8 clc rts .1 jsr CSH.GetVarSize tax lda #0 .2 ora (pStack) inc pStack dex bne .2 tax beq .8 .9 sec rts *-------------------------------------- * Stack *-------------------------------------- CSH.CheckStack tax >LDA.G CSH.StackPtr beq .9 tay txa cmp (ZPCSHStack),y bne .9 clc rts .9 lda #CSH.E.SYNTAX sec rts *-------------------------------------- CSH.Push pha >LDA.G CSH.StackPtr dec beq .9 sta (pData),y tay pla sta (ZPCSHStack),y clc rts .9 pla lda #CSH.E.SOVERFLW sec rts *-------------------------------------- CSH.Pop >LDA.G CSH.StackPtr beq .9 pha inc sta (pData),y ply lda (ZPCSHStack),y clc rts .9 lda #CSH.E.STACKERR sec rts *-------------------------------------- * CHAR related Subs..... *-------------------------------------- CSH.GetOPLen ldy #0 .1 iny lda (ZPFileBufPtr),y beq .8 jsr CSH.IsOPChar bcc .1 .8 tya rts *-------------------------------------- CSH.GetIDLen ldy #0 .1 iny lda (ZPFileBufPtr),y beq .8 jsr CSH.IsLetterOrDigit bcc .1 .8 tya rts *-------------------------------------- CSH.SkipStatement clc rts *-------------------------------------- CSH.SkipBlock ldy #0 not in "", TOTO:skip comments ldx #1 starting with 1 '{' for now.... .1 jsr CSH.GetNextCharNB bcs .9 cmp #'{' bne .2 tya bmi .1 inx bra .1 .2 cmp #'}' bne .3 tya bmi .1 dex bne .1 clc rts .3 cmp #'"' bne .1 tya eor #$ff tay bra .1 jmp CSH.GetNextCharNB skip '}' .9 rts *-------------------------------------- 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.CheckSpace jsr CSH.GetChar bcs .90 cmp #C.SPACE bne .90 jsr CSH.GetNextCharNB bcc CSH.GetNextCharNB.RTS .90 lda #CSH.E.SYNTAX sec rts *-------------------------------------- CSH.CheckCharNB cmp #C.SPACE beq .9 cmp #C.LF beq .9 cmp #C.TAB beq .9 clc .9 rts *-------------------------------------- CSH.GetNextChar inc ZPFileBufPtr bne CSH.GetChar inc ZPFileBufPtr+1 *-------------------------------------- CSH.GetChar lda (ZPFileBufPtr) bne .8 lda ZPhMacro beq .9 stz ZPhMacro phx phy >SYSCALL freemem ply plx lda ZPFileBufPtrBak sta ZPFileBufPtr lda ZPFileBufPtrBak+1 sta ZPFileBufPtr+1 bra CSH.GetChar .8 clc rts .9 lda #MLI.E.EOF sec rts *--------------------------------------- CSH.IsOPChar ldx #CSH.OPChars.Cnt-1 .1 cmp CSH.OPChars,x beq .8 dex bpl .1 sec rts .8 clc rts *--------------------------------------- CSH.IsLetterOrDigit jsr CSH.IsDigit10 bcc CSH.IsLetterRTS *--------------------------------------- CSH.IsLetter cmp #'_' bne .1 clc rts .1 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.IsDigit10 cmp #'0' bcc .9 cmp #'9'+1 rts cc if ok, cs if not .9 sec rts *-------------------------------------- * in : X = type, out : X = type, A = size *-------------------------------------- CSH.GetVarSize txa and #CSH.Q.PPPOINTER bne .2 txa and #$f phx tax lda CSH.TYPESIZE,x plx rts .2 lda #2 rts *-------------------------------------- DEBUG.VAR >SYSCALL putchar >PUSHW L.MSG.DBGVAR >PUSHW ZPVarID >PUSHW ZPVarType >PUSHW ZPVarSizeOf >PUSHW ZPVarDataPtr ldy #3 .1 >PUSHB (ZPVarDataPtr),y dey bpl .1 >PUSHBI 12 >SYSCALL printf rts *-------------------------------------- MAN SAVE USR/SRC/BIN/CSH.S.CORE LOAD USR/SRC/BIN/CSH.S ASM