A2osX/BIN/CC.S.F.txt

448 lines
7.2 KiB
Plaintext
Raw Normal View History

2022-01-30 21:47:08 +00:00
NEW
AUTO 3,1
*--------------------------------------
F.Decl stz LocalPtr
2022-01-30 21:47:08 +00:00
jsr CC.PushTQ push T/Q for RETURN
bcs .99
ldx #$80 CPStmt.fDef state
jsr STMT.CPStmt.NEW
2022-01-30 21:47:08 +00:00
bcs .99
jsr SYM.NewScope
2022-01-30 21:47:08 +00:00
bcs .99
jsr CORE.GetNCharNBNL Skip (
2022-01-30 21:47:08 +00:00
bcs .9
cmp #')' func()
beq .6
*--------------------------------------
.1 jsr F.DeclGetTQ
2022-01-30 21:47:08 +00:00
bcs .99
>STYA ZPPtr2 Save T/Q
jsr SYM.AddWord
bcs .99
2022-01-30 21:47:08 +00:00
jsr CC.GetCharNB
bcs .9
jsr CC.IsLetter
bcs .2
jsr F.NewArg
2022-01-30 21:47:08 +00:00
bcs .99
jsr CC.GetCharNB
bcs .9
.2 cmp #')'
beq .6
cmp #','
bne .9
jsr CORE.GetNCharNB Skip ,
2022-01-30 21:47:08 +00:00
bcc .1
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
.6 jsr SYM.Add0000 definition End
bcs .99
2022-01-30 21:47:08 +00:00
jsr CORE.GetNCharNBNL Skip ')'
2022-01-30 21:47:08 +00:00
bcs .9
cmp #';'
bne .7
jsr SYM.FreeScope discard local scope
2022-01-30 21:47:08 +00:00
lda CStackPtr
clc
adc #CPS
2022-08-20 14:37:37 +00:00
sta CStackPtr discard this CPStmt + T/Q
2022-01-30 21:47:08 +00:00
stz LocalPtr reset for DEBUG Message
clc
rts
*--------------------------------------
.7 cmp #'{'
bne .9
2022-08-20 14:37:37 +00:00
bit bInitCode
bmi .8
dec bInitCode
lda #$60 RTS
jsr CODE.EmitByte Close INIT code
bcs .99
.8 >LDYA ZPCCCode f() Code starts HERE
jsr SYM.SetAddrYA
2022-01-30 21:47:08 +00:00
lda LocalPtr
jsr CODE.LDAI A = f() ARGS size
2022-08-20 14:37:37 +00:00
bcs .99
2022-01-30 21:47:08 +00:00
2022-08-20 14:37:37 +00:00
>LDYA L.PCC.ENTER
jmp CODE.EmitPCC Store f() Declaration / Start Definition
2022-01-30 21:47:08 +00:00
*--------------------------------------
F.DeclGetTQ lda (ZPLineBufPtr)
2022-01-30 21:47:08 +00:00
cmp #'.'
bne .5
ldx #2
.1 jsr CC.GetNextChar
bcs .9
cmp #'.'
bne .9
dex
bne .1
jsr CORE.GetNCharNB
2022-01-30 21:47:08 +00:00
bcs .9
eor #')'
bne .9
ldy #SYM.T.VARIADIC Type
* lda #0 Qual
* clc
rts
*--------------------------------------
.5 jsr SYM.Lookup var or func() ?
bcs .6
2022-01-30 21:47:08 +00:00
ldy #SYM.SC
lda (ZPLookupSymPtr),y
cmp #SYM.SC.TYPEDEF
bne .9
jmp TYPE.GetTQInYA2
.6 >LDYA L.CC.TYPEQUAL
jsr CC.LookupID
2022-01-30 21:47:08 +00:00
bcs .9
jmp TYPE.GetTQInYA
2022-01-30 21:47:08 +00:00
.9 lda #E.CSYN
sec
rts
2022-01-30 21:47:08 +00:00
*--------------------------------------
F.NewArg >LDYA.G CC.SymID
2022-06-22 06:26:44 +00:00
>STYA.G CC.SymIDSave
2022-08-20 14:37:37 +00:00
2022-06-22 06:26:44 +00:00
>LEA.G CC.ArgBuf
>STYA ZPSymBufPtr
>LDYA ZPPtr2
ldx #SYM.SC.AUTO
sec Reset Buffer
jsr SYM.New
2022-06-22 06:26:44 +00:00
bcs .9
jsr SYM.StoreL Store f() Args in Local scope
2022-06-22 06:26:44 +00:00
bcs .9
>LDA.G CC.hSymBuf
>SYSCALL GetMemPtr
>STYA ZPSymBufPtr
2022-08-20 14:37:37 +00:00
2022-06-22 06:26:44 +00:00
>LDYA.G CC.SymIDSave
>STYA.G CC.SymID
2022-08-20 14:37:37 +00:00
2022-06-22 06:26:44 +00:00
.9 rts
*--------------------------------------
F.Def.END >LDYA L.PCC.LEAVE
2022-08-20 14:37:37 +00:00
jsr CODE.EmitPCC
bcs .9
2022-01-30 21:47:08 +00:00
jsr SYM.FreeScope
2022-08-20 14:37:37 +00:00
2022-01-30 21:47:08 +00:00
stz LocalPtr back to global
2022-08-20 14:37:37 +00:00
clv pop context
2022-01-30 21:47:08 +00:00
clc
2022-08-20 14:37:37 +00:00
.9 rts
2022-06-12 20:42:22 +00:00
*--------------------------------------
2022-01-30 21:47:08 +00:00
* in : ZPSymPtr
* Y,A = Expected T/Q
*--------------------------------------
F.CallNoRetV ldy #0 no expected T/Q
2022-08-20 14:37:37 +00:00
tya
clc
2022-01-30 21:47:08 +00:00
.HS B0 BCS
F.CallRetV sec
2022-01-30 21:47:08 +00:00
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
2022-06-22 06:26:44 +00:00
2022-01-30 21:47:08 +00:00
ror ZPPtr1+1 bRetV
2022-08-20 14:37:37 +00:00
* bpl .20 no return value on stack
* ldy #SYM.Addr+1
* lda (ZPLookupSymPtr),y
* beq .20 SYS/LIB/FPU call, no ret value space
jsr EXP.GetSymSizeOfInAXC
2022-01-30 21:47:08 +00:00
jsr CODE.nAddLocal
* >DEBUG
.20 jsr CORE.GetNCharNB skip '('
bcs .90
2022-01-30 21:47:08 +00:00
jsr SYM.LookupCheckTQ
bcs .93
2022-08-20 14:37:37 +00:00
*--------------------------------------
stz ZPPtr1 Reset VARIADIC byte count
2022-01-30 21:47:08 +00:00
lda #SYM.Def
>STA.G CC.LookupSymPtr
2022-01-30 21:47:08 +00:00
jsr F.GetTQ get First Arg T/Q
2022-01-30 21:47:08 +00:00
beq .7 end of list, go check ending ')'
2022-08-20 14:37:37 +00:00
2022-01-30 21:47:08 +00:00
.3 cpy #SYM.T.VARIADIC
bne .4
lda #0 Expected T/Q = 0 if VARIADIC
tay
.4 and #$F0 CONST+VOLATILE+FUNC+FASTCALL
jsr EXP.Eval
2022-01-30 21:47:08 +00:00
bcs .93
jsr EXP.GetYASizeOfInAXC
2022-01-30 21:47:08 +00:00
tax save Sizeof in X
jsr F.GetTQ
2022-01-30 21:47:08 +00:00
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
2022-01-30 21:47:08 +00:00
.5 jsr CC.GetCharNB
bcs .90
2022-01-30 21:47:08 +00:00
cmp #','
bne .6
jsr CORE.GetNCharNBNL Skip ','
2022-01-30 21:47:08 +00:00
jsr F.GetTQ
2022-01-30 21:47:08 +00:00
bne .3 Another ARG....
bra .90 extra args....error
.6 cmp #')'
bne .90
jsr F.GetTQ
2022-01-30 21:47:08 +00:00
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 )
2022-01-30 21:47:08 +00:00
jsr F.Call2
2022-01-30 21:47:08 +00:00
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
2022-08-20 14:37:37 +00:00
lda (ZPLookupSymPtr),y
and #SYM.Q.FASTCALL
2022-01-30 21:47:08 +00:00
beq .1
ldy #SYM.Def Get first (only) argument
jsr F.GetTQAtY
jsr TYPE.SizeOf
2022-01-30 21:47:08 +00:00
dex
bne .19
jsr CODE.PULLA
bra .1
.19 jsr CODE.PULLYA
.1 jsr F.Call3
2022-01-30 21:47:08 +00:00
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
2022-01-30 21:47:08 +00:00
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
2022-08-20 14:37:37 +00:00
.5
ldy #SYM.Addr+1
2022-06-12 20:42:22 +00:00
lda (ZPLookupSymPtr),y
cmp #3+LIBS.MAX
bcs .8 not a SYS/FPU/LIB call...Ret value on stack
2022-08-20 14:37:37 +00:00
2022-01-30 21:47:08 +00:00
>LDYA ZPPtr2 function T/Q
jsr TYPE.SizeOf
2022-01-30 21:47:08 +00:00
cpx #3
bcs .8 leave on stack
dex
bne .60
2022-08-20 14:37:37 +00:00
jsr CODE.PUSHA push ONE byte on stack
2022-01-30 21:47:08 +00:00
bra .8
2022-08-20 14:37:37 +00:00
.60 jsr CODE.PUSHYA push TWO bytes on stack
2022-01-30 21:47:08 +00:00
.8 >LDYA ZPPtr2 T/Q
2022-08-20 14:37:37 +00:00
2022-01-30 21:47:08 +00:00
clc
rts
*--------------------------------------
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
2022-08-20 14:37:37 +00:00
ply Y=HI,X=LO
2022-01-30 21:47:08 +00:00
cpy #1
bne .1
2022-08-20 14:37:37 +00:00
jmp CODE.SYSCALL
2022-01-30 21:47:08 +00:00
.1 cpy #2
bne .2
2022-08-20 14:37:37 +00:00
jmp CODE.FPUCALL
2022-01-30 21:47:08 +00:00
.2 cpy #3+LIBS.MAX
bcs .3
jmp CODE.LIBCALL
.3 lda #$EA NOP
2022-06-22 06:26:44 +00:00
jsr CODE.EmitByte
2022-08-20 14:37:37 +00:00
bcs .99
lda #$EA NOP
2022-06-22 06:26:44 +00:00
jsr CODE.EmitByte
2022-08-20 14:37:37 +00:00
bcs .99
2022-06-22 06:26:44 +00:00
lda #$20 JSR abs
2022-08-20 14:37:37 +00:00
jmp CODE.TOABSYX
2022-01-30 21:47:08 +00:00
2022-06-12 20:42:22 +00:00
.9 bit bPass2
2022-08-20 14:37:37 +00:00
bmi .91
2022-06-12 20:42:22 +00:00
lda #5 leave room for LDX #imm, JSR abs
clc
2022-06-22 06:26:44 +00:00
adc ZPCCCode
sta ZPCCCode
2022-08-20 14:37:37 +00:00
2022-06-12 20:42:22 +00:00
bcc .90
2022-08-20 14:37:37 +00:00
2022-06-22 06:26:44 +00:00
inc ZPCCCode+1
2022-08-20 14:37:37 +00:00
2022-06-12 20:42:22 +00:00
.90 clc
2022-01-30 21:47:08 +00:00
rts
2022-08-20 14:37:37 +00:00
.91 lda #E.FUNDEF
2022-06-12 20:42:22 +00:00
sec
2022-08-20 14:37:37 +00:00
.99 rts
2022-01-30 21:47:08 +00:00
*--------------------------------------
F.GetTQ >LDA.G CC.LookupSymPtr
tay
2022-01-30 21:47:08 +00:00
F.GetTQAtY lda (ZPLookupSymPtr),y
2022-01-30 21:47:08 +00:00
pha
iny
lda (ZPLookupSymPtr),y
2022-01-30 21:47:08 +00:00
ply
rts
*--------------------------------------
MAN
SAVE usr/src/bin/cc.s.f
LOAD usr/src/bin/cc.s
ASM