NEW AUTO 3,1 *-------------------------------------- CC.CORE.Init >SYSCALL SListNew bcs .9 >STA.G CC.hDefines >SYSCALL SListNew bcs .9 >STA.G CC.hTags >SYSCALL SListNew bcs .9 >STA.G CC.hScopes sty ScopeIdx >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPSymBufPtr txa >STA.G CC.hSymBuf >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPCCStack txa >STA.G CC.hStack lda #CC.LookupIdx tay sta (pData),y * clc .9 rts *-------------------------------------- CC.CORE.Quit jsr CS.RUN.FClose bne CC.CORE.Quit ldy ScopeIdx beq .1 .10 lda (pData),y >SYSCALL SListFree ldy ScopeIdx cpy #CC.hScopes beq .1 dec ScopeIdx dey bra .10 .1 >LDA.G CC.hTags beq .2 >SYSCALL SListFree .2 >LDA.G CC.hDefines beq .4 >SYSCALL SListFree .4 >LDA.G CC.hDefineBuf jsr .7 >LDA.G CC.hSymBuf jsr .7 jsr CC.SYM.LookupFreeAll >LDA.G CC.hStack .7 beq CC.Quit.RTS >SYSCALL FreeMem CC.Quit.RTS rts *-------------------------------------- CC.CompileFile >SLEEP ldy #S.PS.hStdIn lda (pPS),y >SYSCALL FEOF bcs .9 tay bne .1 >SYSCALL GetChar bcs .9 I/O err cmp #3 Ctrl-C beq .9 .1 jsr CS.RUN.FGetS bcs .9 jsr CC.CompileLine bcs .9 >LDA.G bDebug bpl CC.CompileFile jsr PrintDebugMsg bra CC.CompileFile .9 rts *-------------------------------------- CC.CompileLine jsr CC.GetCharNB bcs CC.Quit.RTS CC.CompileLine.1 cmp #C.CR empty line.... beq .2 cmp #'/' bne .3 comments ... jmp CC.Comments .2 clc rts .3 cmp #'#' directive ? bne .4 jmp CC.DIR .4 cmp #'}' End of CPStmt ? bne .10 jsr CC.GetNextCharNB Skip '}' jmp CC.STMT.CPStmt.END *-------------------------------------- .10 jsr CC.IsLetter bcc .20 * TODO: PREOPS ++ --..... bcs .29 *-------------------------------------- .20 >LDYA L.CC.TYPEQUAL jsr CC.LookupID bcs .50 jsr CC.TYPE.Decl bcs .59 ldx #SYM.SC.STATIC Y,A = Type/Qual bit bLocalScope bpl .25 bit #SYM.Q.FUNC someone wants to add a local f() ? sec bne .29 ldx #SYM.SC.AUTO .25 jsr CC.SYM.New Y,A=T/Q, add with undef value... bcs .29 OOM or DUP jsr CC.GetCharNB bcs .69 cmp #';' beq .28 cmp #'{' bne .26 jsr CC.GetNextCharNB skip '{' bcs .69 jmp CC.SYM.StoreF *-------------------------------------- * TODO: AOPS *-------------------------------------- .26 cmp #'=' sec bne .69 *-------------------------------------- jsr CC.GetNextCharNB skip '=' bcs .69 jsr CC.SYM.GetTypeInYA expected T/Q jsr CC.EXP.Eval bcs .59 jsr CC.SYM.PopValue Y,A = T/Q, Set value to this var .29 bcs .9 .28 jsr CC.SYM.Store bcs .9 bra .68 *-------------------------------------- .21 jsr CC.GetCharNB bcs .99 cmp #';' beq .8 cmp #'{' bne .99 jsr CC.GetNextCharNB skip '{' bcs .99 jmp CC.CompileLine.1 *-------------------------------------- .50 >LDYA L.CC.KW jsr CC.LookupID bcs .6 not an internal CC keyword.... jsr CC.KW.JMP .59 bcs .9 bra .8 *-------------------------------------- .6 jsr CC.SYM.Lookup var= or func() ? .69 bcs .99 ldy #SYM.Q lda (ZPLookupSymPtr),y bit #SYM.Q.FUNC beq .60 ldy #0 func( ... ); lda #0 jsr CC.F.CallNoRetV bcs .9 jsr CC.SYM.LookupFree bra .8 *-------------------------------------- .60 jsr CC.GetCharNB var = ? bcs .99 cmp #'=' TODO: all AOPS bne .99 jsr CC.GetNextChar Skip = bcs .99 jsr CC.SYM.GetTypeInYA jsr CC.EXP.Eval bcs .9 jsr CC.SYM.PopValue bcs .9 jsr CC.SYM.LookupFree *-------------------------------------- .68 jsr CC.GetCharNB cmp #';' beq .8 .99 lda #E.CSYN sec .9 rts *-------------------------------------- .8 jsr CC.GetNextCharNB Skip ; bcs .9 cmp #C.CR beq .80 jmp CC.CompileLine.1 .80 clc rts *-------------------------------------- CC.Comments jsr CC.GetNextChar cmp #'/' bne .90 jmp CC.SkipLine skip line..... .90 lda #E.CSYN sec rts *-------------------------------------- CC.SkipLine jsr CC.GetNextChar bcs .9 cmp #C.CR bne CC.SkipLine clc .9 rts *-------------------------------------- CC.LookupID >STYA ZPLookupPtr jsr CC.GetIDLen bra CC.Lookup CC.LookupOP >STYA ZPLookupPtr jsr CC.GetOPLen CC.Lookup phy Y = len ldx #0 .1 lda (ZPLookupPtr) beq .9 Ending 0, not found.... pla pha Get Back Len cmp (ZPLookupPtr) Same Len ? bne .4 tay .2 lda (ZPLookupPtr),y .3 dey cmp (ZPLineBufPtr),y bne .4 tya bne .2 pla Found keyword... jsr CC.SkipA ..advance Ptr to char after it.. lda ZPLookupPtr sec adc (ZPLookupPtr) tay lda ZPLookupPtr+1 adc #0 clc Y,A = F() def, X = F() index .8 rts .4 inx inx lda (ZPLookupPtr) jsr CC.ZPLookupPtrAddAp1 bra .1 .9 pla sec rts *-------------------------------------- CC.SListLookup >PUSHA hSList >PUSHA ...for SListGetData >PUSHW ZPLineBufPtr >SYSCALL SListLookup bcs .99 >PUSHA KeyID.HI tya >PUSHA KeyID.LO jsr CC.SkipX >PUSHWZ allocate >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData .9 rts Y,A = SymSize, X = hSymBuf .99 inc pStack discard extra hSList rts *-------------------------------------- CC.ZPLookupPtrAddAp1 sec adc ZPLookupPtr sta ZPLookupPtr bcc .1 inc ZPLookupPtr+1 .1 rts *-------------------------------------- CC.GetDefine >LDA.G CC.hDefines jsr CC.SListLookup bcs .9 >LDYA ZPLineBufPtr >STYA.G CC.SaveDefine txa >STA.G CC.hDefineBuf >SYSCALL GetMemPtr >STYA ZPLineBufPtr .9 rts *-------------------------------------- * CT Stack *-------------------------------------- CC.PushTQ ldy #SYM.Q lda (ZPSymBufPtr),y and #$FC ignore SYM.Q.FUNC+SYM.Q.FASTCALL jsr CC.Push bcs CC.Push.RTS lda (ZPSymBufPtr) SYM.T bra CC.Push *-------------------------------------- CC.PushCS lda ZPCCCode+1 jsr CC.Push bcs CC.Push.RTS lda ZPCCCode *-------------------------------------- CC.Push ldy CStackPtr dey beq .9 sty CStackPtr sta (ZPCCStack),y clc rts .9 lda #E.STKOVERFLOW sec CC.Push.RTS rts *-------------------------------------- CC.PopYA ldy CStackPtr beq .9 lda (ZPCCStack),y pha iny beq .90 lda (ZPCCStack),y iny sty CStackPtr ply clc rts .90 pla .9 lda #E.STACKERROR sec rts *-------------------------------------- CC.Pop ldy CStackPtr beq .9 lda (ZPCCStack),y inc CStackPtr clc rts .9 lda #E.STACKERROR sec rts *-------------------------------------- * ZPLineBufPtr related Subs..... *-------------------------------------- CC.SkipX txa CC.SkipA clc adc ZPLineBufPtr sta ZPLineBufPtr bcc .8 inc ZPLineBufPtr+1 .8 rts *-------------------------------------- CC.GetOPLen ldy #0 .1 iny lda (ZPLineBufPtr),y beq .8 jsr CC.IsOPChar bcc .1 .8 tya rts *-------------------------------------- CC.GetIDLen ldy #0 .1 iny lda (ZPLineBufPtr),y beq .8 jsr CC.IsLetterOrDigit bcc .1 .8 tya rts *-------------------------------------- CC.GetCharNB jsr CC.GetChar bcs CC.GetNextCharNB.RTS jsr CC.CheckCharNB bcc CC.GetNextCharNB.RTS *-------------------------------------- CC.GetNextCharNB jsr CC.GetNextChar bcs CC.GetNextCharNB.RTS jsr CC.CheckCharNB bcs CC.GetNextCharNB CC.GetNextCharNB.RTS rts *-------------------------------------- CC.CheckSpace jsr CC.GetChar bcs .90 cmp #C.SPACE bne .90 jsr CC.GetNextCharNB bcc .99 .90 lda #E.CSYN sec .99 rts *-------------------------------------- CC.CheckCharNB cmp #C.SPACE beq .9 cmp #C.TAB beq .9 clc .9 rts *-------------------------------------- CC.GetNextChar inc ZPLineBufPtr bne CC.GetChar inc ZPLineBufPtr+1 *-------------------------------------- CC.GetChar lda (ZPLineBufPtr) bne .8 phy >LDA.G CC.hDefineBuf beq .1 phx >SYSCALL FreeMem >STZ.G CC.hDefineBuf >LDYA.G CC.SaveDefine >STYA ZPLineBufPtr plx ply bra CC.GetChar .1 ply lda #C.CR .8 clc rts *--------------------------------------- CC.IsEndArg cmp #']' beq .8 cmp #';' beq .8 cmp #',' beq .8 cmp #')' beq .8 sec rts .8 clc rts *--------------------------------------- CC.IsOPChar ldx #CC.OPChars.Cnt-1 .1 cmp CC.OPChars,x beq .8 dex bpl .1 sec rts .8 clc rts *--------------------------------------- CC.IsLetterOrDigit jsr CC.IsDigit10 bcc CC.IsLetterRTS *--------------------------------------- CC.IsLetter cmp #'_' bne .1 clc rts .1 cmp #'A' bcc .9 cmp #'Z'+1 bcc CC.IsLetterRTS cmp #'a' bcc .9 cmp #'z'+1 rts CC if lowercase .9 sec CC.IsLetterRTS rts *--------------------------------------- CC.IsDigit10 cmp #'0' bcc .9 cmp #'9'+1 rts cc if ok, cs if not .9 sec rts *-------------------------------------- MAN SAVE usr/src/bin/cc.s.core LOAD usr/src/bin/cc.s ASM