A2osX/BIN/CC.S.F.txt

466 lines
7.5 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
ldx #$80 CPStmt.fDef state
2022-08-20 14:37:37 +00:00
jsr CC.STMT.CPStmt.NEW
2022-01-30 21:47:08 +00:00
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
2022-08-20 14:37:37 +00:00
jsr CC.SYM.AddWord
2022-01-30 21:47:08 +00:00
jsr CC.GetCharNB
bcs .9
jsr CC.IsLetter
bcs .2
2022-06-22 06:26:44 +00:00
jsr CC.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 CC.GetNextCharNB Skip ,
bcc .1
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
.6 ldy #0
lda #0
2022-08-20 14:37:37 +00:00
jsr CC.SYM.AddWord definition End
2022-01-30 21:47:08 +00:00
2022-08-20 14:37:37 +00:00
jsr CC.GetNextCharNBNL Skip )
2022-01-30 21:47:08 +00:00
bcs .9
cmp #';'
bne .7
jsr CC.SYM.FreeScope discard local scope
lda CStackPtr
clc
2022-08-20 14:37:37 +00:00
adc #8
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
2022-01-30 21:47:08 +00:00
jsr CC.SYM.SetAddrYA
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
*--------------------------------------
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
*--------------------------------------
2022-06-22 06:26:44 +00:00
CC.F.NewArg >LDYA.G CC.SymID
>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
jsr CC.SYM.New
bcs .9
jsr CC.SYM.StoreL Store f() Args in Local scope
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
*--------------------------------------
2022-08-20 14:37:37 +00:00
CC.F.Def.END >LDYA L.PCC.LEAVE
jsr CODE.EmitPCC
bcs .9
2022-01-30 21:47:08 +00:00
jsr CC.Pop T
jsr CC.Pop Q
jsr CC.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
*--------------------------------------
2022-08-20 14:37:37 +00:00
CC.F.CallNoRetV ldy #0 no expected T/Q
tya
clc
2022-01-30 21:47:08 +00:00
.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
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 CC.EXP.GetSymSizeOfInAXC
2022-01-30 21:47:08 +00:00
jsr CODE.nAddLocal
2022-08-20 14:37:37 +00:00
.20 jsr CC.GetNextCharNB skip '('
2022-01-30 21:47:08 +00:00
bcs .10
2022-08-20 14:37:37 +00:00
ldy #SYM.Q
* >DEBUG
lda ZPPtr2 expected T
bne .1
2022-01-30 21:47:08 +00:00
2022-08-20 14:37:37 +00:00
lda (ZPLookupSymPtr) no check required
sta ZPPtr2
2022-01-30 21:47:08 +00:00
2022-08-20 14:37:37 +00:00
lda (ZPLookupSymPtr),y
and #$fC ignore SYM.Q.FUNC,SYM.Q.FASTCALL
bra .2
2022-01-30 21:47:08 +00:00
2022-08-20 14:37:37 +00:00
.1 cmp #SYM.T.VOID
beq .11
2022-01-30 21:47:08 +00:00
2022-08-20 14:37:37 +00:00
cmp (ZPLookupSymPtr)
bne .91
2022-01-30 21:47:08 +00:00
2022-08-20 14:37:37 +00:00
.11 lda (ZPLookupSymPtr),y
and #$fC ignore SYM.Q.FUNC,SYM.Q.FASTCALL
cmp ZPPtr2+1 expected Q
bne .91
*--------------------------------------
.2 sta ZPPtr2+1
2022-01-30 21:47:08 +00:00
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 CC.F.GetTQ get First Arg T/Q
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 CC.EXP.Eval
2022-01-30 21:47:08 +00:00
bcs .93
2022-08-20 14:37:37 +00:00
jsr CC.EXP.GetYASizeOfInAXC
2022-01-30 21:47:08 +00:00
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 >LDA.G CC.LookupSymPtr
clc
adc #2
sta (pData),y
2022-01-30 21:47:08 +00:00
.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
*--------------------------------------
2022-08-20 14:37:37 +00:00
CC.F.Call2 ldy #SYM.Q
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 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
2022-08-20 14:37:37 +00:00
.5
ldy #SYM.Addr+1
2022-06-12 20:42:22 +00:00
lda (ZPLookupSymPtr),y
2022-08-20 14:37:37 +00:00
cmp #3
2022-01-30 21:47:08 +00:00
bcs .8 not a SYS/FPU 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 CC.TYPE.SizeOf
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
*--------------------------------------
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
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
2022-08-20 14:37:37 +00:00
.2 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
*--------------------------------------
CC.F.GetTQ >LDA.G CC.LookupSymPtr
tay
2022-01-30 21:47:08 +00:00
CC.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