NEW AUTO 3,1 *-------------------------------------- * Input : ZPLineBufPtr, Y,A = T/Q, X = SC * CS : Reset Buffer * CC : Reuse Buffer * Output : Y,A = VarID *-------------------------------------- SYM.New >STYA ZPPtr2 T/Q stx ZPPtr3 SC bit bPass2 bpl SYM.New.1 >PUSHB.G CC.hSyms >PUSHW ZPLineBufPtr jsr SCOPE.Push >SYSCALL SListLookup bcs SYM.New.9 >STYA.G CC.SymID Y,A = KeyID jsr CC.SkipX X = KeyLen >PUSHB.G CC.hSyms >PUSHW.G CC.SymID >PUSHW ZPSymBufPtr >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData bcc SYM.New.2 SYM.New.9 rts *-------------------------------------- SYM.New.1 jsr SYM.BufInitYAXC set buf according C >PUSHB.G CC.hSyms >PUSHW ZPLineBufPtr jsr SCOPE.Push >SYSCALL SListNewKey bcs SYM.New.9 >STYA.G CC.SymID Y,A = KeyID jsr CC.SkipX X = KeyLen .DO DBG_SYM=1 jsr SYM.DEBUG0 .FIN *-------------------------------------- SYM.New.2 jsr CC.GetCharNB bcs .98 cmp #';' bne .1 lda ZPPtr3 cmp #SYM.SC.TYPEDEF bne SYM.SetAddr clc rts .1 cmp #'(' bne SYM.NewV jmp F.Decl .98 lda #E.CSYN sec .99 rts *-------------------------------------- SYM.NewV cmp #'[' bne SYM.SetAddr ldy #SYM.Q lda (ZPSymBufPtr),y and #%11001111 sta (ZPSymBufPtr),y ldy #SYM.DefSize lda #SYM.Def sta (ZPSymBufPtr),y ldy #SYM.Q .1 lda (ZPSymBufPtr),y clc adc #SYM.Q.ARRAY sta (ZPSymBufPtr),y jsr CORE.GetNCharNB Skip [ bcs .98 cmp #']' bne .2 ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.PPPOINTER beq .98 [] only allowed for * jsr SYM.Add0000 set as [0] (deref) bcs .99 bra .3 .2 jsr EXP.IntConst bcs .98 jsr SYM.AddWord bcs .99 jsr CC.GetCharNB bcs .98 cmp #']' bne .98 .3 jsr CORE.GetNCharNB Skip ] bcs SYM.SetAddr cmp #'[' bne SYM.SetAddr ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.AAARRAY cmp #SYM.Q.AAARRAY bne .1 already [][][] ? .98 lda #E.CSYN sec .99 rts *-------------------------------------- SYM.SetAddr ldy #SYM.SizeOf lda (ZPSymBufPtr),y iny ora (ZPSymBufPtr),y bne .1 jsr SYM.GetSymSizeOfInAXC jsr SYM.SetSizeOf .1 ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.FUNC bne .9 ldy #SYM.SC lda (ZPSymBufPtr),y beq SYM.SetAddrG SYM.SC.STATIC cmp #SYM.SC.AUTO beq SYM.SetAddrL .9 lda #E.TMISMATCH sec rts *-------------------------------------- SYM.SetAddrG ldy #SYM.Addr lda ZPCCData sta (ZPSymBufPtr),y iny lda ZPCCData+1 sta (ZPSymBufPtr),y ldy #SYM.SizeOf lda (ZPSymBufPtr),y clc adc ZPCCData sta ZPCCData iny lda (ZPSymBufPtr),y adc ZPCCData+1 sta ZPCCData+1 clc rts *-------------------------------------- SYM.SetAddrL ldy #SYM.SizeOf+1 lda (ZPSymBufPtr),y bne .9 dey SYM.SizeOf lda (ZPSymBufPtr),y clc adc LocalPtr sta LocalPtr bcs .9 ldy #SYM.Addr sta (ZPSymBufPtr),y ldy #SYM.SizeOf lda (ZPSymBufPtr),y jsr CODE.nAddLocal clc rts .9 lda #E.BUF sec rts *-------------------------------------- SYM.BufInitYAXC pha tya sta (ZPSymBufPtr) #SYM.T pla ldy #SYM.Q sta (ZPSymBufPtr),y txa iny #SYM.SC sta (ZPSymBufPtr),y bcc .8 DONT reset buffer lda #0 .1 iny sta (ZPSymBufPtr),y cpy #SYM.DefSize-1 bne .1 iny #SYM.DefSize lda #SYM.Def sta (ZPSymBufPtr),y .8 rts *-------------------------------------- SYM.PushAddr ldy #SYM.SC lda (ZPSymBufPtr),y beq .1 SYM.SC.STATIC * LOCAL >LDYA L.PCC.PushLAddrH jsr CODE.EmitPCC bcs .9 ldy #SYM.Addr lda (ZPSymBufPtr),y eor #$FF inc jsr CODE.LDAI bcs .9 >LDYA L.PCC.PushLAddrL jmp CODE.EmitPCC * GLOBAL .1 ldy #SYM.Addr+1 lda (ZPSymBufPtr),y tax dey lda (ZPSymBufPtr),y jsr CODE.LDAXI bcs .9 ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.CONST beq .2 >LDYA L.PCC.PushIAddr jmp CODE.EmitPCC .2 >LDYA L.PCC.PushUAddr jmp CODE.EmitPCC .9 rts *-------------------------------------- SYM.GetAddr1 ldy #SYM.SC lda (ZPSymBufPtr),y beq .1 SYM.SC.STATIC * LOCAL ldy #SYM.Addr lda (ZPSymBufPtr),y eor #$FF inc jsr CODE.LDAI bcs .9 >LDYA L.PCC.GetLAddr1 jmp CODE.EmitPCC * GLOBAL .1 ldy #SYM.Addr+1 lda (ZPSymBufPtr),y tax dey lda (ZPSymBufPtr),y jsr CODE.LDAXI bcs .9 ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.CONST beq .2 >LDYA L.PCC.GetIAddr1 jmp CODE.EmitPCC .2 >LDYA L.PCC.GetUAddr1 jmp CODE.EmitPCC .9 rts *-------------------------------------- SYM.GetAddr2 ldy #SYM.SC lda (ZPSymBufPtr),y beq .1 SYM.SC.STATIC * LOCAL ldy #SYM.Addr lda (ZPSymBufPtr),y eor #$FF inc jsr CODE.LDAI bcs .9 >LDYA L.PCC.GetLAddr2 jmp CODE.EmitPCC * GLOBAL .1 ldy #SYM.Addr+1 lda (ZPSymBufPtr),y tax dey lda (ZPSymBufPtr),y jsr CODE.LDAXI bcs .9 ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.CONST beq .2 >LDYA L.PCC.GetIAddr2 jmp CODE.EmitPCC .2 >LDYA L.PCC.GetUAddr2 jmp CODE.EmitPCC .9 rts *-------------------------------------- SYM.NewKey >PUSHA >PUSHW ZPLineBufPtr >PUSHWI 0 ScopeID >SYSCALL SListNewKey rts Y,A = KeyID, X = KeyLen *-------------------------------------- SYM.Add0000 >LDYAI 0 *-------------------------------------- SYM.AddWord phy pha ldy #SYM.DefSize lda (ZPSymBufPtr),y clc adc #2 bcs .9 sta (ZPSymBufPtr),y tay dey pla A sta (ZPSymBufPtr),y dey pla Y pha sta (ZPSymBufPtr),y iny lda (ZPSymBufPtr),y get back A ply get back Y * clc rts .9 pla pla lda #E.BUF sec rts *-------------------------------------- SYM.AddName jsr CC.GetCharNB bcs .98 jsr CC.IsLetter bcs .98 jsr CC.GetIDLen tax jsr SYM.AddByte bcs .99 ldy #0 .1 lda (ZPLineBufPtr),y phy jsr SYM.AddByte ply bcs .99 iny dex bne .1 tya jsr CC.SkipA clc rts .98 lda #E.CSYN sec .99 rts *-------------------------------------- SYM.AddByte pha ldy #SYM.DefSize lda (ZPSymBufPtr),y inc beq .9 sta (ZPSymBufPtr),y dec tay pla sta (ZPSymBufPtr),y clc rts .9 pla lda #E.BUF sec rts *-------------------------------------- SYM.NewLabelA bit bPass2 bmi .8 >STA.G CC.Label+1 _A = "B"reak, "C"ontinue... >PUSHB.G CC.hSyms >PUSHEA.G CC.Label jsr SCOPE.Push >SYSCALL SListNewKey bcs .99 >STYA.G CC.SymID Y,A = KeyID lda #SYM.T.VOID sta (ZPSymBufPtr) #SYM.T lda #SYM.Q.POINTER ldy #SYM.Q sta (ZPSymBufPtr),y lda #SYM.SC.STATIC iny #SYM.SC sta (ZPSymBufPtr),y lda #0 .1 iny sta (ZPSymBufPtr),y cpy #SYM.DefSize-1 bne .1 iny #SYM.DefSize lda #SYM.Def sta (ZPSymBufPtr),y >LDYA ZPCCCode jsr SYM.SetAddrYA .DO DBG_SYM=1 jsr SYM.DEBUG0 .FIN jmp SYM.Store .8 clc .99 rts *-------------------------------------- SYM.Update sec .HS 90 BCC *-------------------------------------- SYM.Store clc bit bPass2 bmi .8 php .DO DBG_SYM=1 bcc .10 jsr SYM.DEBUG1 bra .11 .10 jsr SYM.DEBUG2 .11 .FIN >PUSHB.G CC.hSyms >PUSHW.G CC.SymID >PUSHW ZPSymBufPtr >PUSHBI 0 ldy #SYM.Q lda (ZPSymBufPtr),y and #SYM.Q.FUNC bne .1 ldy #SYM.DefSize lda (ZPSymBufPtr),y bra .2 .1 lda #SYM.F.MAX .2 >PUSHA plp bcs .3 >SYSCALL SListAddData rts .3 >SYSCALL SListSetData rts .8 clc rts *-------------------------------------- SYM.Lookup >LDA.G CC.LookupIdx cmp #CC.LookupIdx+LOOKUP.MAX beq .99 >PUSHB.G CC.hSyms ...for SListGetData lda ScopeIdx .1 pha >PUSHB.G CC.hSyms >PUSHW ZPLineBufPtr ply phy jsr SCOPE.PushY >SYSCALL SListLookup bcc .8 pla cmp #CC.ScopeIDs beq .9 dec dec bra .1 .99 lda #E.OOH * sec rts .9 inc pStack discard CC.hSyms lda #E.NOKEY sec rts .8 >PUSHA KeyID.HI tya >PUSHA KeyID.LO pla discard ScopeIdx jsr CC.SkipX >PUSHWZ allocate >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData >STYA.G CC.LookupSymSize >INC.G CC.LookupIdx tay txa sta (pdata),y >SYSCALL GetMemPtr >STYA ZPLookupSymPtr * clc rts *-------------------------------------- SYM.LookupLabelA bit bPass2 bmi .1 ldx #0 ldy #0 clc rts .1 >STA.G CC.Label+1 A = "B"reak, "C"ontinue... >PUSHB.G CC.hSyms ...for SListGetData lda ScopeIdx .2 pha >PUSHB.G CC.hSyms >PUSHEA.G CC.Label ply phy jsr SCOPE.PushY >SYSCALL SListLookup bcc .8 pla cmp #CC.ScopeIDs beq .9 dec dec bra .2 .9 inc pStack discard CC.hSyms lda #E.NOKEY sec rts .8 >PUSHA KeyID.HI tya >PUSHA KeyID.LO >PUSHW ZPSymBufPtr >PUSHWI 65535 all >PUSHWZ From Start >SYSCALL SListGetData bcs .99 ldy #SYM.Addr lda (ZPSymBufPtr),y tax iny lda (ZPSymBufPtr),y tay * clc .99 rts *-------------------------------------- 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 *-------------------------------------- * ZPPtr2 = expected T/Q * ZPLookupSymPtr *-------------------------------------- SYM.LookupCheckTQ lda ZPPtr2 target T bne .1 lda (ZPLookupSymPtr) SYM.T sta ZPPtr2 T ldy #SYM.Q lda (ZPLookupSymPtr),y and #$F8 ignore VOLATILE|FUNC|FASTCALL sta ZPPtr2+1 Q clc rts .1 cmp #SYM.T.VOID beq .2 lda (ZPLookupSymPtr) SYM.T cmp #SYM.T.VOID beq .2 cmp ZPPtr2 T bne .9 .2 lda ZPPtr2+1 Q ldy #SYM.Q eor (ZPLookupSymPtr),y and #$F8 ignore VOLATILE|FUNC|FASTCALL beq .8 and #SYM.Q.AAARRAY is mismatch about array ? beq .9 no... lda ZPPtr2+1 Q and #SYM.Q.AAARRAY bne .9 .8 clc rts .9 lda #E.TMISMATCH sec .99 rts *-------------------------------------- * on RT stack : Addr,value *-------------------------------------- SYM.PopValue jsr SYM.GetYASizeOfInAXC tax dex bne .1 >LDYA L.PCC.PopValue1 jmp CODE.EmitPCC .1 cpx #1 bne .2 >LDYA L.PCC.PopValue2 jmp CODE.EmitPCC .2 jsr CODE.LDXI bcs .9 >LDYA L.PCC.PopValueX jmp CODE.EmitPCC .9 rts *-------------------------------------- * out : Y,A = T/Q *-------------------------------------- SYM.GetTypeInYA ldy #SYM.Q lda (ZPSymBufPtr),y pha lda (ZPSymBufPtr) tay pla rts *-------------------------------------- * out : A,X,C = size *-------------------------------------- SYM.GetSymSizeOfInAXC ldy #SYM.Q lda (ZPSymBufPtr),y pha lda (ZPSymBufPtr) SYM.T tay pla SYM.GetYASizeOfInAXC bit #SYM.Q.PPPOINTER beq .1 lda #2 pointer ldx #0 sec +1 for hMem Storage rts .1 bit #SYM.Q.AAARRAY bne .2 lda CC.TYPESIZE-1,y ldx #0 clc rts .2 ldx CC.TYPESIZE-1,y ldy #SYM.Def lda (ZPSymBufPtr),y >PUSHA iny lda (ZPSymBufPtr),y >PUSHA ldy #1 .3 dex beq .5 .4 lda (pStack),y clc adc (pStack),y sta (pStack),y lda (pStack) adc (pStack) sta (pStack) dex bne .4 .5 >PULLA tax >PULLA clc rts *-------------------------------------- * in/out : A,X,C = size *-------------------------------------- SYM.SetSizeOf ldy #SYM.SizeOf sta (ZPSymBufPtr),y pha iny txa sta (ZPSymBufPtr),y pla rts *-------------------------------------- SYM.SetAddrYA phy ldy #SYM.Addr+1 sta (ZPSymBufPtr),y pla dey sta (ZPSymBufPtr),y rts *-------------------------------------- .DO DBG_SYM=1 SYM.DEBUG0 >PUSHW L.MSG.DEBUG.SYM0 >PUSHW.G CC.SymID jsr SCOPE.Push lda (ZPSymBufPtr) >PUSHA ldy #1 lda (ZPSymBufPtr),y >PUSHA >PUSHBI 6 >SYSCALL Printf rts SYM.DEBUG1 >PUSHW L.MSG.DEBUG.SYM1 >PUSHW.G CC.SymID >PUSHBI 2 >SYSCALL Printf rts SYM.DEBUG2 >PUSHW L.MSG.DEBUG.SYM2 >PUSHW.G CC.SymID >PUSHBI 2 >SYSCALL Printf rts .FIN *-------------------------------------- MAN SAVE usr/src/bin/cc.s.sym LOAD usr/src/bin/cc.s ASM