A2osX/BIN/CC.S.SYM.txt

778 lines
12 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 CC.SYM.New.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
bcc CC.SYM.New2
CC.SYM.New.9 rts Y,A = SymSize
*--------------------------------------
CC.SYM.New1 ldy ScopeIdx
lda (pData),y
jsr CC.SYM.NewKey
bcs CC.SYM.New.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
*--------------------------------------
CC.SYM.New2 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
*--------------------------------------
CC.SYM.NewV cmp #'['
bne CC.SYM.SetAddr
ldy #SYM.Q
lda (ZPSymBufPtr),y
and #%11001111
sta (ZPSymBufPtr),y
lda #SYM.Def
ldy #SYM.DefSize
sta (ZPSymBufPtr),y
ldy #SYM.Q
.1 lda (ZPSymBufPtr),y
clc
adc #SYM.Q.ARRAY
sta (ZPSymBufPtr),y
jsr CC.GetNextCharNB Skip [
bcs .99
cmp #']'
bne .2
ldy #SYM.Q
lda (ZPSymBufPtr),y
and #SYM.Q.PPPOINTER
beq .99 [] only allowed for *
>LDYAI 0 set as [0] (deref)
jsr CC.SYM.AddWord
bra .3
.2 jsr CC.EXP.IntConst
bcs .99
jsr CC.SYM.AddWord
jsr CC.GetCharNB
bcs .99
cmp #']'
bne .99
.3 jsr CC.GetNextCharNB Skip ]
bcs CC.SYM.SetAddr
cmp #'['
bne CC.SYM.SetAddr
ldy #SYM.Q
lda (ZPSymBufPtr),y
and #SYM.Q.AAARRAY
cmp #SYM.Q.AAARRAY
beq .99 already [][][]
bra .1
.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
pha
ldy #SYM.Addr
lda ZPCCData
sta (ZPSymBufPtr),y
iny
lda ZPCCData+1
sta (ZPSymBufPtr),y
pla
clc
adc ZPCCData
sta ZPCCData
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.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
*--------------------------------------
CC.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
*--------------------------------------
CC.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
*--------------------------------------
CC.SYM.NewKey >PUSHA
>PUSHW ZPLineBufPtr
>SYSCALL SListNewKey
bcs .9
.9 rts Y,A = KeyID, X = KeyLen
*--------------------------------------
CC.SYM.AddWord pha
phy
ldy #SYM.DefSize
lda (ZPSymBufPtr),y
pha
inc
inc
sta (ZPSymBufPtr),y
ply
pla
sta (ZPSymBufPtr),y
iny
pla
sta (ZPSymBufPtr),y
CC.SYM.AddWord.RTS
rts
*--------------------------------------
CC.SYM.NewCPSID >LDYA.G CC.CPSID
>STYA.G CC.CPSPFX+2
>LDA.G CC.CPSID+1
inc
cmp #'Z'+1
bne .1
dey CC.CPSID
lda (pData),y
inc
cmp #'Z'+1
beq .9
sta (pData),y
lda #'A'
iny CC.CPSID+1
.1 sta (pData),y
clc
rts
.9 lda #E.OOH
* sec
rts
*--------------------------------------
CC.SYM.NewA bit bPass2
bmi .8
>STA.G CC.CPSPFX A = "B"reak, "C"ontinue...
>PUSHB.G CC.hScopes Global Scope
>PUSHEA.G CC.CPSPFX
>SYSCALL SListNewKey
bcs CC.SYM.AddWord.RTS
>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
iny
lda #0
.1 sta (ZPSymBufPtr),y
iny
cpy #SYM.Def
bne .1
tya
ldy #SYM.DefSize
sta (ZPSymBufPtr),y
>LDYA ZPCCCode
jsr CC.SYM.SetAddrYA
>LDA.G CC.hScopes Global Scope
jmp CC.SYM.Store.1
.8 clc
.99 rts
*--------------------------------------
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.LookupA bit bPass2
bmi .1
ldx #0
ldy #0
clc
rts
.1 >STA.G CC.CPSPFX A = "B"reak, "C"ontinue...
>PUSHB.G CC.hScopes Global Scope
>PUSHEA.G CC.CPSPFX
>SYSCALL SListLookup
bcs .99
>STYA.G CC.SymID Y,A = KeyID
>PUSHB.G CC.hScopes
>PUSHW.G CC.SymID
>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
*--------------------------------------
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
*--------------------------------------
* on RT stack : Addr,value
*--------------------------------------
CC.SYM.SetValue jsr CC.SYM.GetSymSizeOfInAXC
tay
dey
jsr CODE.LDYI
bcs .9
>LDYA L.PCC.SetValue
jmp CODE.EmitPCC
.9 rts
*--------------------------------------
* in : Y,A = T/Q
* out : CC
* CS, A = E.TMISMATCH
*--------------------------------------
CC.SYM.CheckTypeYA.OLD
pha
tya
cmp (ZPSymBufPtr)
bne .9
pla
ldy #SYM.Q
eor (ZPSymBufPtr),y
and #$FC ignore SYM.Q.FUNC+SYM.Q.FASTCALL
bne .9
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.OLD
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
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
*--------------------------------------
CC.SYM.SetSizeOf
ldy #SYM.SizeOf
sta (ZPSymBufPtr),y
pha
iny
txa
sta (ZPSymBufPtr),y
pla
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