NEW AUTO 3,1 *-------------------------------------- CORE.Init lda #SL._ >SYSCALL SListNew bcs .9 >STA.G CC.hDefines lda #SL._ >SYSCALL SListNew bcs .9 >STA.G CC.hTags lda #SL._ >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 *-------------------------------------- CORE.Quit jsr CC.FIO.FClose bne 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 .5 jsr CC.SYM.LookupFree bcc .5 >LDA.G CC.hStack .7 beq .8 >SYSCALL FreeMem .8 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 CC.FIO.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 .9 cmp #C.CR EOL.... beq .8 cmp #'#' directive ? bne .1 jmp CC.DIR .1 cmp #'/' bne .2 comments ... jmp CC.Comments .2 cmp #'}' End of CPStmt ? bne .3 jsr CC.GetNextCharNB Skip '}' jsr CC.STMT.CPStmt.END bcs .9 bra CC.CompileLine .3 cmp #';' End of Stmt ? bne .4 jsr CC.GetNextCharNB Skip ';' jsr CC.STMT.Stmt.END bcs .9 bra CC.CompileLine .4 jsr CC.CompileStmt bcs .9 bra CC.CompileLine .8 clc .9 rts *-------------------------------------- * keyword : for, while .... *-------------------------------------- CC.CompileStmt >LDYA L.CC.KW jsr CC.LookupID bcs .1 not an internal CC keyword.... txa >STA.G CC.CmdSave jmp (J.CC.KW,x) *-------------------------------------- * Declaration : typedef, type var or type func() *-------------------------------------- .1 >LDYA L.CC.SCSPEC jsr CC.LookupID bcs .2 jmp (J.CC.SCSPEC,x) .2 >LDYA L.CC.TYPEQUAL jsr CC.LookupID bcs .3 jmp CC.DECL *-------------------------------------- * Statement : ++var, var=, func(); *-------------------------------------- .3 jmp CC.STMT *-------------------------------------- .99 lda #E.CSYN sec .9 rts *-------------------------------------- CC.Comments jsr CC.GetNextChar TODO : /* ... */ 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.LookupAOP >LDYA L.CC.AOPS >STYA ZPLookupPtr ldy #$ff .1 iny lda (ZPLineBufPtr),y sec beq .9 jsr CC.IsOPChar bcs .9 cmp #'=' bne .1 iny .8 tya bra CC.Lookup .9 rts 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 rts .4 inx inx lda (ZPLookupPtr) jsr CC.ZPLookupPtrAddAp1 bra .1 .9 ldx #$FF pla sec 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 *-------------------------------------- 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 *-------------------------------------- * 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 jsr CC.Get inc CStackPtr * clc .9 rts *-------------------------------------- CC.Get ldy CStackPtr beq .9 lda (ZPCCStack),y 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.GetCharNBNL jsr CC.GetChar bcs CC.GetNextCharNB.RTS jsr CC.CheckCharNB bcs CC.GetNextCharNBNL cmp #C.CR clc bne CC.GetNextCharNB.RTS jsr CC.FIO.FGetS bcs CC.GetNextCharNB.RTS *-------------------------------------- CC.GetNextCharNBNL jsr CC.GetNextCharNB bcs CC.GetNextCharNB.RTS cmp #C.CR clc bne .9 jsr CC.FIO.FGetS bcc CC.GetNextCharNBNL .9 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.GetNextCharEsc jsr CC.GetNextChar bcs .9 cmp #'\' bne .8 jsr CC.GetNextChar bcs .8 ldx #CC.EscChars.Cnt-1 .1 cmp CC.EscChars,x beq .6 dex bpl .1 sec rts .6 lda CC.EscCodes,x bit .9 clc rts .8 clc clv .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 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