NEW AUTO 3,1 *-------------------------------------- * Input : ZPLineBufPtr, Y,A = T/Q, X = SC * Output : Y,A = VarID *-------------------------------------- CC.SYM.New >STYA ZPPtr2 T/Q stx ZPPtr3 SC bit bPass2 bpl CC.SYM.New1 bit bLocalScope bmi CC.SYM.New1 >PUSHB.G CC.hScopes Global Scope >PUSHW ZPLineBufPtr >SYSCALL SListLookup bcs .9 >STYA.G CC.SymID Y,A = KeyID jsr CC.SkipX X = KeyLen >PUSHB.G CC.hScopes >PUSHW.G CC.SymID >PUSHW ZPSymBufPtr >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData bcs .9 jsr CC.GetCharNB cmp #'(' bne .8 jmp CC.F.Decl .8 clc .9 rts Y,A = SymSize *-------------------------------------- CC.SYM.New1 ldy ScopeIdx lda (pData),y jsr CC.SYM.NewKey bcs .9 >STYA.G CC.SymID Y,A = KeyID jsr CC.SkipX X = KeyLen lda ZPPtr2 sta (ZPSymBufPtr) #SYM.T lda ZPPtr2+1 ldy #SYM.Q sta (ZPSymBufPtr),y lda ZPPtr3 iny #SYM.SC sta (ZPSymBufPtr),y iny lda #0 .1 sta (ZPSymBufPtr),y iny cpy #SYM.Def bne .1 tya ldy #SYM.DefSize sta (ZPSymBufPtr),y jsr CC.GetCharNB bcs CC.SYM.SetAddr cmp #'(' bne CC.SYM.NewV ldy #SYM.Q lda #SYM.Q.FUNC ora (ZPSymBufPtr),y sta (ZPSymBufPtr),y jmp CC.F.Decl .9 rts *-------------------------------------- CC.SYM.NewV cmp #'[' bne CC.SYM.SetAddr jsr CC.GetNextCharNB Skip [ bcs .99 cmp #']' bne .3 .2 ldy #SYM.Q lda (ZPSymBufPtr),y bit #SYM.Q.PPPOINTER beq .99 and #SYM.Q.AAARRAY cmp #SYM.Q.AAARRAY bcs .99 * ldy #SYM.Q lda (ZPSymBufPtr),y * clc adc #SYM.Q.ARRAY sta (ZPSymBufPtr),y jsr CC.GetNextCharNB Skip ] bcs CC.SYM.SetAddr cmp #'[' beq .2 bra CC.SYM.SetAddr *-------------------------------------- .3 jsr CC.EXP.IntConst bcs .9 jsr CC.SYM.SetSizeOf jsr CC.GetCharNB bcs .99 cmp #']' bne .99 jsr CC.GetNextCharNB Skip ] bcs CC.SYM.SetAddr * cmp #'[' * bne CC.SYM.SetAddr bra CC.SYM.SetAddr .99 lda #E.CSYN sec .9 rts *-------------------------------------- CC.SYM.SetAddr ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.FUNC bne .9 ldy #SYM.SC lda (ZPSymBufPtr),y beq CC.SYM.SetAddrG SYM.SC.STATIC cmp #SYM.SC.AUTO beq CC.SYM.SetAddrL .9 lda #E.TMISMATCH sec rts *-------------------------------------- CC.SYM.SetAddrG jsr CC.SYM.GetSymSizeOfInAXC jsr CC.SYM.SetSizeOf * clc / sec A,X=Size, CS if pointer ldy #SYM.Addr lda ZPCCData sta (ZPSymBufPtr),y adc ZPCCData sta ZPCCData iny lda ZPCCData+1 sta (ZPSymBufPtr),y txa adc ZPCCData+1 sta ZPCCData+1 clc rts *-------------------------------------- CC.SYM.SetAddrL jsr CC.SYM.GetSymSizeOfInAXC jsr CC.SYM.SetSizeOf ldy #SYM.SizeOf+1 lda (ZPSymBufPtr),y bne .9 dey SYM.SizeOf lda (ZPSymBufPtr),y * clc / sec A,X=Size, CS if pointer clc adc LocalPtr sta LocalPtr bcs .9 ldy #SYM.Addr sta (ZPSymBufPtr),y jsr CC.SYM.GetSymSizeOfInAXC jsr CODE.nAddLocal clc rts .9 lda #E.BUF sec rts *-------------------------------------- CC.SYM.NewKey >PUSHA >PUSHW ZPLineBufPtr >SYSCALL SListNewKey bcs .9 .9 rts Y,A = KeyID, X = KeyLen *-------------------------------------- CC.SYM.StoreF >LDA.G CC.hScopes bit bPass2 bpl CC.SYM.Store.1 clc rts *-------------------------------------- CC.SYM.Store bit bPass2 bpl CC.SYM.StoreL Store Global & Local at Pass 1 bit bLocalScope Store Local at Pass 2 bmi CC.SYM.StoreL clc rts CC.SYM.StoreL ldy ScopeIdx lda (pData),y CC.SYM.Store.1 >PUSHA >PUSHW.G CC.SymID >PUSHW ZPSymBufPtr >PUSHBI 0 ldy #SYM.DefSize lda (ZPSymBufPtr),y >PUSHA >SYSCALL SListAddData rts *-------------------------------------- CC.SYM.NewScope ldy ScopeIdx cpy #CC.hScopes+SCOPE.MAX bcs .9 >SYSCALL SListNew bcs .99 inc ScopeIdx ldy ScopeIdx sta (pData),y dec bLocalScope clc rts .9 lda #E.OOH sec .99 rts *-------------------------------------- CC.SYM.FreeScope ldy ScopeIdx cpy #CC.hScopes beq * lda (pData),y >SYSCALL SListFree dec ScopeIdx inc bLocalScope rts *-------------------------------------- CC.SYM.Lookup >LDA.G CC.LookupIdx cmp #CC.LookupIdx+LOOKUP.MAX beq .99 >PUSHB ScopeIdx .1 tay lda (pData),y jsr CC.SListLookup bcc .8 lda (pstack) cmp #CC.hScopes beq .9 dec sta (pstack) bra .1 .9 inc pStack lda #E.NOKEY sec rts .8 inc pStack >STYA.G CC.LookupSymSize >INC.G CC.LookupIdx tay txa sta (pdata),y >SYSCALL GetMemPtr >STYA ZPLookupSymPtr * clc rts .99 lda #E.OOH * sec rts *-------------------------------------- CC.SYM.LookupFree >LDA.G CC.LookupIdx cmp #CC.LookupIdx beq .9 tay lda (pdata),y >SYSCALL FreeMem bcs .99 >DEC.G CC.LookupIdx cmp #CC.LookupIdx beq .8 tay lda (pdata),y >SYSCALL GetMemPtr >STYA ZPLookupSymPtr .8 clc rts .9 lda E.INVH * sec .99 rts *-------------------------------------- CC.SYM.LookupFreeAll .1 jsr CC.SYM.LookupFree bcc .1 clc rts *-------------------------------------- * Y,A = value T/Q *-------------------------------------- CC.SYM.PushValue jsr CC.SYM.CheckTypeYA bcs .9 jsr CC.SYM.GetSymSizeOfInAXC tax jsr CODE.LDXI jsr CC.SYM.GetAddrInYA beq .1 jsr CODE.LDYAI jsr CODE.PushXFromYA clc rts .1 jsr CODE.GetLocal Y = local address jsr CODE.PushXFromYA clc .9 rts *-------------------------------------- CC.SYM.PopValue jsr CC.SYM.CheckTypeYA bcs .9 jsr CC.SYM.GetSymSizeOfInAXC tax jsr CODE.LDXI jsr CC.SYM.GetAddrInYA beq .1 jsr CODE.LDYAI jsr CODE.PopXToYA clc rts .1 jsr CODE.GetLocal Y = local address jsr CODE.PopXToYA clc .9 rts *-------------------------------------- CC.SYM.SetValue jsr CC.SYM.CheckTypeYA bcs .9 jsr CC.SYM.GetSymSizeOfInAXC tax jsr CODE.LDXI jsr CC.SYM.GetAddrInYA beq .1 jsr CODE.LDYAI jsr CODE.SetXToYA clc rts .1 jsr CODE.GetLocal Y = local address jsr CODE.SetXToYA clc .9 rts *-------------------------------------- * in : Y,A = T/Q * out : CC * CS, A = E.TMISMATCH *-------------------------------------- CC.SYM.CheckTypeYA pha tya cmp (ZPSymBufPtr) bne .9 pla phy ldy #SYM.Q cmp (ZPSymBufPtr),y bne .9 ply clc rts .9 pla lda #E.TMISMATCH sec rts *-------------------------------------- * out : Y,A = T/Q *-------------------------------------- CC.SYM.GetTypeInYA ldy #SYM.Q lda (ZPSymBufPtr),y pha lda (ZPSymBufPtr) tay pla rts *-------------------------------------- * in : Y,A = T/Q *-------------------------------------- CC.SYM.SetTypeYA phy ldy #SYM.Q sta (ZPSymBufPtr),y pla sta (ZPSymBufPtr) rts *-------------------------------------- * out : A,X,C = size *-------------------------------------- CC.SYM.GetSymSizeOfInAXC ldy #SYM.Q lda (ZPSymBufPtr),y pha lda (ZPSymBufPtr) SYM.T tay pla CC.SYM.GetYASizeOfInAXC bit #SYM.Q.PPPOINTER bne .1 lda CC.TYPESIZE-1,y ldx #0 clc rts .1 lda #2 pointer ldx #0 sec +1 for hMem Storage rts *-------------------------------------- * in/out : A,X,C = size *-------------------------------------- CC.SYM.SetSizeOf ldy #SYM.SizeOf sta (ZPSymBufPtr),y pha iny txa sta (ZPSymBufPtr),y pla rts *-------------------------------------- CC.SYM.GetAddrInYA ldy #SYM.Addr+1 lda (ZPSymBufPtr),y pha dey lda (ZPSymBufPtr),y tay pla Z if Local rts *-------------------------------------- CC.SYM.SetAddrYA phy ldy #SYM.Addr+1 sta (ZPSymBufPtr),y pla dey sta (ZPSymBufPtr),y rts *-------------------------------------- MAN SAVE usr/src/bin/cc.s.sym LOAD usr/src/bin/cc.s ASM