NEW AUTO 3,1 *-------------------------------------- TYPE.GetTQInYA >ENTER 2 lda #0 sta (pStack) Type ldy #1 sta (pStack),y Qual jsr .8 bcs .99 ldy #1 lda (pStack),y pha lda (pStack) tay Y = Type pla A = Qual clc .99 >LEAVE rts .8 jmp (J.CC.TYPEQUAL,x) *-------------------------------------- TYPE.GetTQInYA2 >ENTER 2 lda (ZPLookupSymPtr) sta (pStack) Type ldy #SYM.Q lda (ZPLookupSymPtr),y * ldy #1 sta (pStack),y Qual jsr TYPE.GetQ2 bcs .99 jsr SYM.LookupFree ldy #1 lda (pStack),y pha lda (pStack) tay Y = Type pla A = Qual clc .99 >LEAVE rts *-------------------------------------- * Type Declaration keywords *-------------------------------------- TYPE.CONST lda #SYM.Q.CONST bra TYPE.VOLATILE.1 *-------------------------------------- TYPE.VOLATILE lda #SYM.Q.VOLATILE TYPE.VOLATILE.1 ldy #1 ora (pStack),y sta (pStack),y jsr CC.CheckSpace bcs .9 >LDYA L.CC.TYPESPEC jsr CC.LookupID bcs .9 jmp (J.CC.TYPESPEC,x) .9 lda #E.CSYN sec rts *-------------------------------------- TYPE.STRUCT clc .HS B0 BCS *-------------------------------------- TYPE.UNION sec ror ZPPtr2+1 bStrucUnion stz ZPPtr2 bNewTagDef bit bPass2 bpl TYPE.SU.1 Pass 1: create def *-------------------------------------- TYPE.SU.2 jsr CORE.GetCharNBNL bcs .98 cmp #'{' beq .1 no TAG jsr TYPE.GetTag bcs .99 jsr CORE.GetNCharNBNL bcs .98 cmp #'{' bne .8 .1 jsr CORE.GetNCharNBNL skip '{' cmp #'}' bne .1 skip definition jsr CORE.GetNCharNB skip '}' .8 lda #SYM.T.SU jmp TYPE.GetQ .98 lda #E.CSYN sec .99 rts *-------------------------------------- TYPE.SU.1 ldy #SYM.T.SU lda #0 ldx #SYM.SC.TAG sec reset buffer jsr SYM.BufInitYAXC jsr CORE.GetCharNBNL bcs .98 cmp #'{' beq .30 no TAG jsr TYPE.GetTag bcc .20 jsr TYPE.NewTag bcs .99 sec ror ZPPtr2 bNewTagDef *-------------------------------------- .20 jsr CORE.GetCharNBNL bcs .98 cmp #'{' beq .30 bit ZPPtr2 bNewTagDef bmi .98 bra .38 *-------------------------------------- .30 jsr CORE.GetNCharNBNL skip '{' of ';' bcs .98 cmp #'}' beq .37 >LDYA L.CC.TYPEQUAL jsr CC.LookupID bcs .98 cpx #4 no const nor volatile bcc .98 jsr TYPE.GetTQInYA bcs .99 jsr TYPE.SizeOf get sizeof in X jsr TYPE.SU.AddYAX bcs .99 jsr SYM.Add0000 TODO: bitO & bitW bcs .99 jsr SYM.AddName bcs .99 jsr CC.GetCharNB cmp #';' bne .98 bra .30 *-------------------------------------- .37 jsr CORE.GetNCharNB skip '}' bcs .98 jsr SYM.Add0000 Close F definition bcs .99 bit ZPPtr2 bNewTagDef bpl .38 jsr TYPE.StoreTag bcs .99 *-------------------------------------- .38 lda #SYM.T.SU jmp TYPE.GetQ .98 lda #E.CSYN sec .99 rts *-------------------------------------- TYPE.SU.AddYAX jsr SYM.AddWord add T/Q bcs .99 bit ZPPtr2+1 bStrucUnion bmi .1 ldy #SYM.SizeOf lda (ZPSymBufPtr),y pha iny lda (ZPSymBufPtr),y ply jsr SYM.AddWord Add Y/A Offset bcs .99 txa ldy #SYM.SizeOf * clc adc (ZPSymBufPtr),y sta (ZPSymBufPtr),y bcc .99 iny lda #0 adc (ZPSymBufPtr),y sta (ZPSymBufPtr),y * clc .99 rts .1 txa ldy #SYM.SizeOf cmp (ZPSymBufPtr),y bcs .2 sta (ZPSymBufPtr),y .2 jmp SYM.Add0000 Add Y/A Offset (always 0 for union) *-------------------------------------- TYPE.ENUM lda #E.CSYN sec rts *-------------------------------------- TYPE.NewTag >LDA.G CC.hTags jsr SYM.NewKey bcs .9 >STYA ZPPtr1 TagID dec ZPPtr2 bNewTagDef = true jsr CC.SkipX .9 rts *-------------------------------------- TYPE.GetTag >PUSHB.G CC.hTags >PUSHW ZPLineBufPtr >PUSHWI 0 ScopeID >SYSCALL SListLookup bcs .9 phy Y,A = KeyID pha jsr CC.SkipX X = KeyLen >PUSHB.G CC.hTags pla >PUSHA pla >PUSHA >PUSHW ZPSymBufPtr >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData .9 rts *-------------------------------------- TYPE.StoreTag >PUSHB.G CC.hTags >PUSHW ZPPtr1 >PUSHW ZPSymBufPtr >PUSHBI 0 ldy #SYM.DefSize lda (ZPSymBufPtr),y >PUSHA >SYSCALL SListAddData rts *-------------------------------------- TYPE.SIGNED sec .HS 90 BCC *-------------------------------------- TYPE.UNSIGNED clc php jsr CC.CheckSpace bcs .9 >LDYA L.CC.TYPES jsr CC.LookupID bcs .9 cpx #SYM.T.UCHAR bcc .9 void cpx #SYM.T.SLONG+1 only char int long allowed bcs .9 plp bcs .8 jmp (J.CC.UTYPES-2,x) .8 jmp (J.CC.STYPES-2,x) .9 plp lda #E.CSYN sec rts *-------------------------------------- TYPE.SHORT jsr CC.CheckSpace bcs .9 >LDYA L.CC.TYPES jsr CC.LookupID bcs TYPE.UCHAR cpx #4 only int allowed beq TYPE.SCHAR .9 lda #E.CSYN sec rts *-------------------------------------- TYPE.VOID lda #SYM.T.VOID bra TYPE.GetQ TYPE.CHAR TYPE.UCHAR lda #SYM.T.UCHAR bra TYPE.GetQ TYPE.SCHAR lda #SYM.T.SCHAR bra TYPE.GetQ TYPE.UINT lda #SYM.T.UINT bra TYPE.GetQ TYPE.INT TYPE.SINT lda #SYM.T.SINT bra TYPE.GetQ TYPE.ULONG lda #SYM.T.ULONG bra TYPE.GetQ TYPE.LONG TYPE.SLONG lda #SYM.T.SLONG bra TYPE.GetQ TYPE.FLOAT lda #SYM.T.FLOAT TYPE.GetQ sta (pStack) T TYPE.GetQ2 jsr CC.GetCharNB bcs .9 .1 cmp #'*' bne .10 ldy #1 Q lda (pStack),y clc adc #SYM.Q.POINTER bcs .9 more than *** sta (pStack),y jsr CORE.GetNCharNB bcc .1 .9 lda #E.CSYN sec .99 rts *-------------------------------------- .10 jsr CC.IsLetter bcs .8 >LDYA L.CC.FTYPES int fastcall f() ? jsr CC.LookupID bcs .8 next char is an identifier ldy #1 lda (pStack),y ora #SYM.Q.FUNC+SYM.Q.FASTCALL sta (pStack),y jsr CORE.GetNCharNB bcs .9 next char is an identifier, ",", "(",")" .8 clc rts *-------------------------------------- * in : Y,A = type/qual * out : X = size *-------------------------------------- TYPE.SizeOf bit #SYM.Q.PPPOINTER bne .2 ldx CC.TYPESIZE-1,y clc rts .2 ldx #2 pointer sec +1 for hMem Storage rts *-------------------------------------- MAN SAVE usr/src/bin/cc.s.type LOAD usr/src/bin/cc.s ASM