A2osX/BIN/CC.S.F.txt

439 lines
7.1 KiB
Plaintext
Raw Normal View History

2022-01-30 21:47:08 +00:00
NEW
AUTO 3,1
*--------------------------------------
CC.F.Decl stz LocalPtr
jsr CC.PushTQ push T/Q for RETURN
bcs .99
ldy #SYM.Q
lda #SYM.Q.FUNC
ora (ZPSymBufPtr),y
sta (ZPSymBufPtr),y
ldx #$80 CPStmt.fDef state
jsr CC.STMT.CPStmt
bcs .99
jsr CC.SYM.NewScope
bcs .99
jsr CC.GetNextCharNB Skip (
bcs .9
cmp #')' func()
beq .6
*--------------------------------------
.1 jsr CC.F.DeclGetTQ
bcs .99
>STYA ZPPtr2 Save T/Q
jsr CC.F.AddTQ
jsr CC.GetCharNB
bcs .9
jsr CC.IsLetter
bcs .2
>LDYA ZPPtr2
ldx #SYM.SC.AUTO
jsr CC.SYM.New
bcs .99
jsr CC.SYM.Store Store f() Args in Local scope
bcs .99
2022-06-12 20:42:22 +00:00
jsr CC.SYM.Free
2022-01-30 21:47:08 +00:00
bcs .99
jsr CC.GetCharNB
bcs .9
.2 cmp #')'
beq .6
cmp #','
bne .9
jsr CC.GetNextCharNB Skip ,
bcc .1
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
.6 ldy #0
lda #0
jsr CC.F.AddTQ
jsr CC.GetNextCharNB Skip )
bcs .9
cmp #';'
bne .7
jsr CC.SYM.FreeScope discard local scope
lda CStackPtr
clc
adc #6
sta CStackPtr discard this CPStmt
stz LocalPtr reset for DEBUG Message
clc
rts
*--------------------------------------
.7 cmp #'{'
bne .9
>LDYA ZPCCCode f() Code starts HERE
jsr CC.SYM.SetAddrYA
lda LocalPtr
jsr CODE.LDAI A = f() ARGS size
jsr CODE.Enter
clc Store f() Declaration / Start Definition
rts
*--------------------------------------
CC.F.DeclGetTQ lda (ZPLineBufPtr)
cmp #'.'
bne .5
ldx #2
.1 jsr CC.GetNextChar
bcs .9
cmp #'.'
bne .9
dex
bne .1
jsr CC.GetNextCharNB
bcs .9
eor #')'
bne .9
ldy #SYM.T.VARIADIC Type
* lda #0 Qual
* clc
rts
*--------------------------------------
.5 >LDYA L.CC.TYPEQUAL
jsr CC.LookupID
bcs .9
jsr CC.TYPE.Decl
bcs .9
* Y,A = Type/Qual
bra .8
.9 lda #E.CSYN
sec
.8 rts
*--------------------------------------
CC.F.Def.END jsr CODE.Leave
jsr CC.Pop T
jsr CC.Pop Q
jsr CC.SYM.FreeScope
stz LocalPtr back to global
clc
rts
*--------------------------------------
2022-06-12 20:42:22 +00:00
CC.F.AddTQ pha
tya
ldy ZPSymSize
sta (ZPSymBufPtr),y
iny
pla
sta (ZPSymBufPtr),y
iny
sty ZPSymSize
rts
*--------------------------------------
2022-01-30 21:47:08 +00:00
* in : ZPSymPtr
* Y,A = Expected T/Q
*--------------------------------------
CC.F.CallNoRetV clc
.HS B0 BCS
CC.F.CallRetV sec
ldx ZPPtr1 local : variadic size
phx
ldx ZPPtr1+1 local : bRetV
phx
ldx ZPPtr2 local : expected T
phx
ldx ZPPtr2+1 local : expected Q
phx
>STYA ZPPtr2
ror ZPPtr1+1 bRetV
bpl .20 no return value on stack
2022-06-12 20:42:22 +00:00
2022-01-30 21:47:08 +00:00
ldy #SYM.Addr+1
lda (ZPSymBufPtr),y
2022-06-12 20:42:22 +00:00
beq .20 SYS/LIB/FPU call, no ret value space
2022-01-30 21:47:08 +00:00
jsr CC.SYM.GetSymSizeOfInAXC
jsr CODE.nAddLocal
.20 stz ZPPtr1 Reset VARIADIC byte count
jsr CC.GetNextCharNB skip '('
bcs .10
jsr CC.SYM.GetTypeInYA Y,A = f() Return value T/Q
ldx ZPPtr2 expected T
beq .1 no check required
cpy ZPPtr2
bne .91
tax save full Q
and #$fC ignore SYM.Q.FUNC,SYM.Q.FASTCALL
cmp ZPPtr2+1
bne .91
txa
.1 >STYA ZPPtr2 save full T/Q for later
lda #SYM.Def
sta ZPSymSize
jsr CC.F.GetTQ get First Arg T/Q
beq .7 end of list, go check ending ')'
*--------------------------------------
.3 cpy #SYM.T.VARIADIC
bne .4
lda #0 Expected T/Q = 0 if VARIADIC
tay
.4 and #$F0 CONST+VOLATILE+FUNC+FASTCALL
jsr CC.EXP.Eval
2022-01-30 21:47:08 +00:00
bcs .93
jsr CC.SYM.GetYASizeOfInAXC
tax save Sizeof in X
jsr CC.F.GetTQ
cpy #SYM.T.VARIADIC
bne .50 if VARIADIC, don't advance to next arg
txa
clc make sure pointer only 2 bytes
adc ZPPtr1
sta ZPPtr1 Add to byte count
bra .5
.50 inc ZPSymSize
inc ZPSymSize
.5 jsr CC.GetCharNB
.10 bcs .90
cmp #','
bne .6
jsr CC.GetNextCharNB Skip ','
jsr CC.F.GetTQ
bne .3 Another ARG....
bra .90 extra args....error
.6 cmp #')'
bne .90
jsr CC.F.GetTQ
beq .8 no more arg after ')', exit
cpy #SYM.T.VARIADIC
bne .90 missing arg
lda ZPPtr1 push VARIADIC byte count
jsr CODE.PUSHI
.7 jsr CC.GetCharNB
bcs .90
cmp #')'
bne .90
.8 jsr CC.GetNextCharNB Skip )
jsr CC.F.Call2
bra .93
.90 lda #E.CSYN
bra .92
.91 lda #E.TMISMATCH
.92 sec
.93 plx
stx ZPPtr2+1
plx
stx ZPPtr2
plx
stx ZPPtr1+1
plx
stx ZPPtr1
.99 rts
*--------------------------------------
* X = last var size
*--------------------------------------
CC.F.Call2 lda ZPPtr2+1
bit #SYM.Q.FASTCALL
beq .1
ldy #SYM.Def Get first (only) argument
jsr CC.F.GetTQAtY
jsr CC.TYPE.SizeOf
dex
bne .19
jsr CODE.PULLA
bra .1
.19 jsr CODE.PULLYA
.1 jsr CC.F.Call3
bcs .9
bit ZPPtr1+1 bRetV
bmi .5
* NO Return Value : call & discard stack if not in Y,A
>LDYA ZPPtr2 function T/Q
jsr CC.TYPE.SizeOf
txa
beq .11 void
cpx #3 A or Y,A
bcc .11
.10 jsr CODE.INCPSTACK
dex
bne .10
.11 clc
.9 rts
* Return Value : call & put result on stack if in Y,A
.5 ldy #SYM.Addr+1
2022-06-12 20:42:22 +00:00
lda (ZPLookupSymPtr),y
2022-01-30 21:47:08 +00:00
cmp #2
bcs .8 not a SYS/FPU call...Ret value on stack
>LDYA ZPPtr2 function T/Q
jsr CC.TYPE.SizeOf
cpx #3
bcs .8 leave on stack
dex
bne .60
jsr CODE.PUSHA push ONE byte one stack
bra .8
.60 jsr CODE.PUSHYA push TWO bytes one stack
.8 >LDYA ZPPtr2 T/Q
and #$FC ignore SYM.Q.FUNC+SYM.Q.FASTCALL
clc
rts
*--------------------------------------
CC.F.Call3 ldy #SYM.Addr+1
2022-06-12 20:42:22 +00:00
lda (ZPLookupSymPtr),y
2022-01-30 21:47:08 +00:00
beq .9
pha
dey
2022-06-12 20:42:22 +00:00
lda (ZPLookupSymPtr),y
2022-01-30 21:47:08 +00:00
tax
ply
cpy #1
bne .1
jsr CODE.SYSCALL
clc
rts
.1 cpy #2
bne .2
jsr CODE.FPUCALL
clc
rts
.2 lda #$20 JSR abs
jsr CODE.TOABSYX Y=HI,X=LO
clc
rts
2022-06-12 20:42:22 +00:00
.9 bit bPass2
bmi .99
lda #5 leave room for LDX #imm, JSR abs
clc
adc ZPCCConst
sta ZPCCConst
bcc .90
inc ZPCCConst+1
.90 clc
2022-01-30 21:47:08 +00:00
rts
2022-06-12 20:42:22 +00:00
.99 lda #E.FUNDEF
sec
2022-01-30 21:47:08 +00:00
rts
*--------------------------------------
CC.F.GetTQ ldy ZPSymSize
CC.F.GetTQAtY lda (ZPSymBufPtr),y
pha
iny
lda (ZPSymBufPtr),y
ply
rts
*--------------------------------------
MAN
SAVE usr/src/bin/cc.s.f
LOAD usr/src/bin/cc.s
ASM