NEW AUTO 3,1 .LIST OFF *-------------------------------------- CC.Init >SYSCALL SListNew bcs .99 >STA.G CC.hDefines >SYSCALL SListNew bcs .99 >STA.G CC.hTags >SYSCALL SListNew bcs .9 >STA.G CC.hSymbols sty ScopePtr >LDYAI 4096 >SYSCALL GetMem .99 bcs .9 >STYA ZPCCCode txa >STA.G CC.hCode >LDYAI 1024 >SYSCALL GetMem bcs .9 >STYA ZPCCConst txa >STA.G CC.hConst >LDYAI 1024 >SYSCALL GetMem bcs .9 >STYA ZPCCData txa >STA.G CC.hData >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPCCStack txa >STA.G CC.hStack * clc .9 rts *-------------------------------------- CC.Quit ldy ScopePtr beq .1 .10 lda (pData),y >SYSCALL SListFree ldy ScopePtr cpy #CC.hSymbols beq .1 dec ScopePtr dey bra .10 .1 >LDA.G CC.hTags beq .2 >SYSCALL SListFree .2 >LDA.G CC.hDefines beq .4 >SYSCALL SListFree .4 lda hDefineBuf jsr .7 .5 jsr CS.RUN.FClose bne .5 lda hSymBuf jsr .7 >LDA.G CC.hStack jsr .7 >LDA.G CC.hData jsr .7 >LDA.G CC.hConst jsr .7 >LDA.G CC.hCode .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 ScopenCnt 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 jsr CC.SYM.Store bcs .29 jmp CC.SYM.FreeBuf *-------------------------------------- * 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 jsr CC.SYM.FreeBuf 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 (ZPSymBufPtr),y bit #SYM.Q.FUNC beq .60 ldy #0 func( ... ); lda #0 jsr CC.F.CallNoRetV bcs .9 jsr CC.SYM.FreeBufPop 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.FreeBufPop *-------------------------------------- .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 pha save KeyID phy >PUSHA KeyID.HI tya >PUSHA KeyID.LO jsr CC.SkipX .1 >PUSHWZ allocate >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData bcs .9 ply pla X = hSymScope, Y,A = SymID * clc rts .9 plx plx rts .99 inc pStack rts *-------------------------------------- * int main(int argc, char *argv[]) ; *-------------------------------------- CC.MainExec lda #$EEEE >PUSHA >PUSHA int ret value lda #0 >PUSHA ldy #S.PS.ARGC lda (pPS),y >PUSHA push int ARGC (int) >PUSHW ZPCCConst push int ARGV *char[] stz ArgIndex .1 lda ArgIndex >SYSCALL ArgV bcs .2 inc ArgIndex pha tya sta (ZPCCConst) pla ldy #1 sta (ZPCCConst),y lda ZPCCConst * clc adc #2 sta ZPCCConst bcc .1 inc ZPCCConst+1 bra .1 .2 >PUSHB.G CC.hSymbols >PUSHW L.CC.MAIN >SYSCALL SListLookup bcs .9 phy pha >PUSHB.G CC.hSymbols pla >PUSHA pla >PUSHA KeyID >PUSHWZ allocate >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData bcs .9 stx hSymBuf txa >SYSCALL GetMemPtr >STYA ZPSymBufPtr ldy #SYM.Addr lda (ZPSymBufPtr),y sta ZPCCCode iny lda (ZPSymBufPtr),y sta ZPCCCode+1 jsr .7 clc .9 rts .7 jmp (ZPCCCode) *-------------------------------------- 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 stx hDefineBuf >LDYA ZPLineBufPtr >STYA.G CC.SaveDefine txa >SYSCALL GetMemPtr >STYA ZPLineBufPtr .9 rts *-------------------------------------- * CT Stack *-------------------------------------- CC.PushTQ ldy #SYM.Q lda (ZPSymBufPtr),y 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 lda hDefineBuf beq .1 stz hDefineBuf phx phy >SYSCALL FreeMem >LDYA.G CC.SaveDefine >STYA ZPLineBufPtr ply plx bra CC.GetChar .1 lda #C.CR .8 clc rts .9 lda #MLI.E.EOF sec .99 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