A2osX/BIN/CC.S.F.txt
2022-12-13 07:55:13 +01:00

491 lines
7.7 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
*--------------------------------------
F.Decl ldy #SYM.Q
lda (ZPSymBufPtr),y
ora #SYM.Q.FUNC
sta (ZPSymBufPtr),y
and #$FC
sta ZPPtr2+1
lda (ZPSymBufPtr) #SYM.T
sta ZPPtr2 T/Q for _RETURN_
stz LocalPtr
jsr SYM.Store Store this f() with no prototype...
bcs .99
jsr SCOPE.New
bcs .99
lda ZPPtr2+1 #SYM.Q
and #$F0
bne .10
lda ZPPtr2 #SYM.T
cmp #SYM.T.VOID
beq .11
.10 jsr F.AddReturnVar
bcs .99
.11 jsr CORE.GetNCharNBNL Skip (
bcs .9
cmp #')' func()
beq .6
*--------------------------------------
.1 jsr F.DeclGetTQ
bcs .99
>STYA ZPPtr2 Save T/Q
jsr SYM.AddWord
bcs .99
jsr CC.GetCharNB
bcs .9
jsr CC.IsLetter
bcs .2
jsr F.NewArg
bcs .99
jsr CC.GetCharNB
bcs .9
.2 cmp #')'
beq .6
cmp #','
bne .9
jsr CORE.GetNCharNB Skip ,
bcc .1
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
.6 jsr SYM.Add0000 definition End
bcs .99
jsr CORE.GetNCharNBNL Skip ')'
bcs .9
cmp #';'
bne .7
jsr SYM.Update
bcs .99
jsr SCOPE.Close discard local scope
bcs .99
stz LocalPtr reset for DEBUG Message
* clc
rts
*--------------------------------------
.7 cmp #'{'
bne .9
*--------------------------------------
F.Def bit bInitCode
bmi .1
lda #$60 RTS
jsr CODE.EmitByte Close INIT code
bcs .99
dec bInitCode
.1 jsr SYM.SetAddrCCode f() Code starts HERE
jsr SYM.Update
bcs .99
lda #$ff
>STA.G CC.CmdSave
jsr STMT.NewCPS00
bcs .99
lda #'F'
jsr SYM.LookupLabelA
bcs .99
txa
jsr CODE.LDAI A = f() ARGS size
bcs .99
>LDYA L.PCC.ENTER
jmp CODE.EmitPCC Store f() Declaration / Start Definition
.99 rts
*--------------------------------------
F.Def.END lda #'X' define EXIT Label
jsr SYM.NewLabelA
bcs .9
>LDYA L.PCC.LEAVE
jsr CODE.EmitPCC
bcs .9
jsr SCOPE.Close
bcs .9
jmp STMT.Close
.9 rts
*--------------------------------------
F.DeclGetTQ lda (ZPLineBufPtr)
cmp #'.'
bne .5
ldx #2
.1 jsr CC.GetNextChar
bcs .9
cmp #'.'
bne .9
dex
bne .1
jsr CORE.GetNCharNB
bcs .9
eor #')'
bne .9
ldy #SYM.T.VARIADIC Type
* lda #0 Qual
* clc
rts
*--------------------------------------
.5 jsr SYM.Lookup var or func() ?
bcs .6
ldy #SYM.SC
lda (ZPLookupSymPtr),y
cmp #SYM.SC.TYPEDEF
bne .9
jmp TYPE.GetTQInYA2
.6 >LDYA L.CC.TYPEQUAL
jsr CC.LookupID
bcs .9
jmp TYPE.GetTQInYA
.9 lda #E.CSYN
sec
rts
*--------------------------------------
F.AddReturnVar ldx ZPLineBufPtr
phx
ldx ZPLineBufPtr+1
phx
>LDYA L.CC._RETURN_
>STYA ZPLineBufPtr
jsr F.NewArg
plx
stx ZPLineBufPtr+1
plx
stx ZPLineBufPtr
rts
*--------------------------------------
F.NewArg >LDYA.G CC.SymID
>STYA.G CC.SymIDSave
>LEA.G CC.ArgBuf
>STYA ZPSymBufPtr
>LDYA ZPPtr2
ldx #SYM.SC.AUTO
sec Reset Buffer
jsr SYM.New
bcs .9
jsr SYM.Store
bcs .9
>LDA.G CC.hSymBuf
>SYSCALL GetMemPtr
>STYA ZPSymBufPtr
>LDYA.G CC.SymIDSave
>STYA.G CC.SymID
.9 rts
*--------------------------------------
* in : ZPSymPtr
* Y,A = Expected T/Q
*--------------------------------------
F.CallNoRetV ldy #0 no expected T/Q
tya
clc
.HS B0 BCS
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
jsr CORE.GetNCharNB skip '('
bcs .90
jsr SYM.LookupCheckTQ
bcs .93
*--------------------------------------
stz ZPPtr1 Reset VARIADIC byte count
lda #SYM.Def
>STA.G CC.LookupSymPtr
jsr 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
* >DEBUG
.4 and #$F0 CONST+VOLATILE+FUNC+FASTCALL
* >DEBUG
jsr EXP.Eval
bcs .93
jsr EXP.GetYASizeOfInAXC
tax save Sizeof in X
jsr 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 >LDA.G CC.LookupSymPtr
clc
adc #2
sta (pData),y
.5 jsr CC.GetCharNB
bcs .90
cmp #','
bne .6
jsr CORE.GetNCharNBNL Skip ','
jsr F.GetTQ
bne .3 Another ARG....
bra .90 extra args....error
.6 cmp #')'
bne .90
jsr 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 CORE.GetNCharNB Skip )
jsr F.Call2
bra .93
.90 lda #E.CSYN
.92 sec
.93 plx
stx ZPPtr2+1
plx
stx ZPPtr2
plx
stx ZPPtr1+1
plx
stx ZPPtr1
.99 rts
*--------------------------------------
* X = last var size
*--------------------------------------
F.Call2 ldy #SYM.Q
lda (ZPLookupSymPtr),y
and #SYM.Q.FASTCALL
beq .1
ldy #SYM.Def Get first (only) argument
jsr F.GetTQAtY
jsr TYPE.SizeOf
dex
bne .19
jsr CODE.PULLA
bra .1
.19 jsr CODE.PULLYA
.1 jsr 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 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
lda (ZPLookupSymPtr),y
cmp #3+LIBS.MAX
bcs .8 not a SYS/FPU/LIB call...Ret value on stack
>LDYA ZPPtr2 function T/Q
jsr TYPE.SizeOf
cpx #3
bcs .8 leave on stack
dex
bne .60
jsr CODE.PUSHA push ONE byte on stack
bra .8
.60 jsr CODE.PUSHYA push TWO bytes on stack
.8 >LDYA ZPPtr2 T/Q
clc
rts
*--------------------------------------
F.Call3 ldy #SYM.Addr+1
lda (ZPLookupSymPtr),y
beq .9
pha
dey
lda (ZPLookupSymPtr),y
tax
ply Y=HI,X=LO
cpy #1
bne .1
jmp CODE.SYSCALL
.1 cpy #2
bne .2
jmp CODE.FPUCALL
.2 cpy #3+LIBS.MAX
bcs .3
jmp CODE.LIBCALL
.3 lda #$EA NOP
jsr CODE.EmitByte
bcs .99
lda #$EA NOP
jsr CODE.EmitByte
bcs .99
lda #$20 JSR abs
jmp CODE.TOABSYX
.9 bit bPass2
bmi .91
lda #5 leave room for LDX #imm, JSR abs
clc
adc ZPCCCode
sta ZPCCCode
bcc .90
inc ZPCCCode+1
.90 clc
rts
.91 lda #E.FUNDEF
sec
.99 rts
*--------------------------------------
F.GetTQ >LDA.G CC.LookupSymPtr
tay
F.GetTQAtY lda (ZPLookupSymPtr),y
pha
iny
lda (ZPLookupSymPtr),y
ply
rts
*--------------------------------------
MAN
SAVE usr/src/bin/cc.s.f
LOAD usr/src/bin/cc.s
ASM