A2osX/BIN/CC.S.EXP.txt
2022-01-30 22:47:08 +01:00

613 lines
9.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
.LIST OFF
*--------------------------------------
* Input:
* ZPLineBufPtr, Y,A = Expected type/qual
* Output:
* CS, A = EC
* CC, Y,A = type/qual
*--------------------------------------
CC.EXP.Eval00 lda #0
tay
CC.EXP.Eval ldx ZPPtr2 local : expected T/Q
phx
ldx ZPPtr2+1
phx
ldx ZPPtr3 local : BOP
phx
ldx ZPPtr3+1 local : PREOP
phx
>STYA ZPPtr2
lda #$ff no previous OP
pha
*--------------------------------------
.10 jsr CC.GetCharNB
bcs .19
cmp #'('
bne .20
jsr CC.GetNextCharNB skip (
bcs .19
>LDYA L.CC.TYPEQUAL
jsr CC.LookupID
bcs .12
jsr CC.EXP.Cast
bcs .19
bra .20
*--------------------------------------
.12 >LDYA ZPPtr2 expected T/Q
jsr CC.EXP.Eval
bcs .19
>STYA ZPPtr2 update T/Q
jsr CC.GetCharNB
bcs .19
cmp #')'
bne .19
jsr CC.GetNextCharNB skip )
bcc .31
.19 jmp CC.EXP.Eval.ESYN
*--------------------------------------
.20 jsr CC.ExpPreops
bcs .29
jsr CC.IsLetter define, f() or Var ?
bcs .22
jsr CC.GetDefine
bcc .10
jsr CC.SYM.Lookup
bcs .22
ldy #SYM.Q
lda (ZPSymBufPtr),y
and #SYM.Q.FUNC
bne .21
jsr CC.EXP.CheckGetSymType
bcs .29
jsr CC.EXP.Get Check T/Q & Get value on stack
bcs .29
jsr CC.SYM.FreeBufPop
bra .30
*--------------------------------------
.21 >LDYA ZPPtr2 get expected T/Q
jsr CC.F.CallRetV
bcs .29
>STYA ZPPtr2 store real T/Q
jsr CC.SYM.FreeBufPop
bra .30
*--------------------------------------
.22 jsr CC.IsDigit10 number ?
bcs .24
ldy ZPPtr2
bne .23
ldy #SYM.T.SINT
sty ZPPtr2
stz ZPPtr2+1
.23 jsr CC.EXP.GetNum
bcs .29
bra .30
*--------------------------------------
.24 cmp #'"' String literal
bne CC.EXP.Eval.ESYN
jsr CC.AddContCharP
.29 bcs CC.EXP.Eval.Err
*--------------------------------------
.30 jsr CC.GetCharNB
bcs CC.EXP.Eval.ESYN
.31 jsr CC.IsEndArg , ; ) ?
bcc CC.EXP.Eval.End
jsr CC.IsOPChar
bcs CC.EXP.Eval.ESYN
>LDYA L.CC.BOPS we are at V1 op1 V2 op2...
jsr CC.LookupOP
bcs CC.EXP.Eval.ESYN
stx ZPPtr3 save OP(n)
.33 plx get OP(n-1)
bmi .38 $ff....
cpx ZPPtr3
bcc .38 OP(n) has precedence, on stack : V1,V2
>LDYA ZPPtr2 OP(n-1) has precedence...
jsr CC.EXP.BOPS compute V(n-1) <OP(n-1)> V(n)
bcc .33
bcs CC.EXP.Eval.Err
.38 phx push back OP(n-1)
lda ZPPtr3 get OP(n)
pha push OP(n) on stack
jmp .10 go check for next token
*--------------------------------------
CC.EXP.Eval.End plx any OP on stack ?
bmi CC.EXP.Eval.Exit
>LDYA ZPPtr2 Var Type
jsr CC.EXP.BOPS
bcc CC.EXP.Eval.End
bra CC.EXP.Eval.Err
*--------------------------------------
CC.EXP.Eval.ESYN
lda #E.ESYN
CC.EXP.Eval.Err
plx
bpl CC.EXP.Eval.Err
sec
bra CC.EXP.Eval.ExitErr
*--------------------------------------
CC.EXP.Eval.Exit
>LDYA ZPPtr2 Type/Qual
clc
CC.EXP.Eval.ExitErr
plx
stx ZPPtr3+1
plx
stx ZPPtr3
plx
stx ZPPtr2+1
plx
stx ZPPtr2
rts
*--------------------------------------
CC.EXP.CheckGetSymType
lda ZPPtr2
ora ZPPtr2+1
bne .1
lda (ZPSymBufPtr)
sta ZPPtr2
ldy #SYM.Q
lda (ZPSymBufPtr),y
sta ZPPtr2+1
clc
rts
.1 >LDYA ZPPtr2
jmp CC.SYM.CheckTypeYA
*--------------------------------------
CC.EXP.Cast jsr CC.TYPE.Decl
bcs .99
>STYA ZPPtr2
jsr CC.GetCharNB
bcs .9
cmp #')'
bne .9
jsr CC.GetNextCharNB skip )
clc
rts
.9 lda #E.ESYN
sec
.99 rts
*--------------------------------------
CC.ExpPreops >LDYA L.CC.PREOPS
jsr CC.LookupOP
bcc .8
ldx #$ff
.8 stx ZPPtr3+1
jmp CC.GetCharNB
*--------------------------------------
* Y,A = Type/Qual, X = OP
*--------------------------------------
CC.EXP.BOPS cpy #SYM.T.UINT
bcs .3
cpy #SYM.T.UCHAR
beq .1
cpy #SYM.T.SCHAR
beq .2
lda #E.TMISMATCH
sec
rts
.1 lda J.CC.bBOPS,x
ldy J.CC.bBOPS+1,x
tax
lda #$20 JSR
jsr CODE.TOABSYX
clc
rts
.2 lda J.CC.cBOPS,x
ldy J.CC.cBOPS+1,x
tax
lda #$20 JSR
jsr CODE.TOABSYX
clc
rts
.3 txa
clc
adc CC.Type2FPU-SYM.T.UINT,y
tax
jsr CODE.FPUCALL
clc
rts
*--------------------------------------
CC.AddContCharP ldy #0
.1 jsr CC.GetNextChar
bcs .9
cmp #C.CR
beq .9
cmp #'"'
beq .2
sta (ZPCCConst),y
iny
bra .1
.2 lda #0
sta (ZPCCConst),y
lda ZPCCConst+1 Push PTR on stack
jsr CODE.PUSHI
lda ZPCCConst
jsr CODE.PUSHI
tya
sec
adc ZPCCConst
sta ZPCCConst
bcc .3
inc ZPCCConst+1
.3 jsr CC.GetNextChar Skip "
clc
rts
.9 lda #E.ESYN
sec
rts
*--------------------------------------
CC.EXP.GetNum cpy #SYM.T.FLOAT
bcc .1
beq .11
lda #E.TMISMATCH
* sec
rts
.11 >PUSHW ZPLineBufPtr
>PUSHWI ZPLineBufPtr
>SYSCALL StrToF
* bcs .9
ldy #4
.10 lda (pStack),y
jsr CODE.PUSHI
dey
bpl .10
>POP 5
clc
rts
*--------------------------------------
.1 >PUSHW ZPLineBufPtr
>PUSHWI ZPLineBufPtr
>PUSHBI 10
lda CC.TYPESIGN-1,y
bmi .2
>SYSCALL StrToUL
bra .3
.2 >SYSCALL StrToL
.3 bcs .9
ldy #1 anticipate 2 bytes if *
lda ZPPtr2+1
and #SYM.Q.PPPOINTER
bne .5
ldx ZPPtr2
lda CC.TYPESIZE-1,x
dec
tay
.5 lda (pStack),y
jsr CODE.PUSHI
dey
bpl .5
>POP 4
* clc
.9 rts
*--------------------------------------
* ZPPtr2 = expected T/Q
* ZPPtr3+1 = PREOPS
*--------------------------------------
CC.EXP.Get >LDYA L.CC.AOPS
jsr CC.LookupOP
bcs .20
>LDYA ZPPtr2 get expected T/Q
jsr CC.EXP.Eval
bcs .99
jsr CC.SYM.SetValue
bcs .99
clc
rts
*--------------------------------------
.20 >LDYA L.CC.POSTOPS
jsr CC.LookupOP
bcs .1
cpx #4 '['
bne *
jmp CC.EXP.Array
*--------------------------------------
.1 ldx ZPPtr3+1 preop
bpl .8
lda ZPPtr2 target T
beq .3
lda (ZPSymBufPtr) SYM.T
cmp #SYM.T.VOID
beq .2
cmp ZPPtr2 T
bne .9
.2 lda ZPPtr2+1 Q
ldy #SYM.Q
cmp (ZPSymBufPtr),y
bne .9
.3 lda (ZPSymBufPtr) SYM.T
sta ZPPtr2 T
pha
ldy #SYM.Q
lda (ZPSymBufPtr),y
sta ZPPtr2+1 Q
ply Y,A = T/Q
jsr CC.SYM.PushValue
clc
.99 rts
.9 lda #E.TMISMATCH
sec
rts
.8 jmp (J.CC.PREOPS,x)
*--------------------------------------
CC.EXP.Array ldy #SYM.Q
lda (ZPSymBufPtr),y
and #SYM.Q.AAARRAY
beq .9
jsr CC.EXP.PushDeref push base address
ldy #SYM.T.SINT
lda #0
jsr CC.EXP.Eval
bcs .99 int16 on stack
jsr CC.GetCharNB
bcs .9
cmp #']'
bne .9
jsr CC.GetNextCharNB skip ']'
bcs .9
jsr CC.SYM.GetSymSizeOfInAXC
pha
txa
jsr CODE.PUSHI
pla
jsr CODE.PUSHI sizeof on stack
ldx #FPU.iMUL
jsr CODE.FPUCALL sizeof*int16
ldx #FPU.iAdd
jsr CODE.FPUCALL add to base address
lda (ZPSymBufPtr) SYM.T
pha
ldy #SYM.Q
lda (ZPSymBufPtr),y
sec
sbc #SYM.Q.ARRAY
ply
jsr CC.SYM.GetYASizeOfInAXC
jsr CODE.PushFromPtr A = byte count
clc
rts
.9 lda #E.ESYN
sec
.99 rts
*--------------------------------------
CC.EXP.PushAddr ldy #SYM.Addr+1
lda (ZPSymBufPtr),y
bne .7
* LOCAL
jsr CODE.PUSHpBASEp1
ldy #SYM.Addr
lda (ZPSymBufPtr),y
eor #$FF
inc
jsr CODE.LDAI
jsr CODE.PUSHpBASEpA
clc
rts
* DATASEG
.7 jsr CODE.PUSHI
ldy #SYM.Addr
lda (ZPSymBufPtr),y
jsr CODE.PUSHI
clc
rts
*--------------------------------------
CC.EXP.PushDeref
ldy #SYM.Addr+1
lda (ZPSymBufPtr),y
bne .7
* LOCAL
jsr CODE.SETpBASEp1
ldy #SYM.Addr
lda (ZPSymBufPtr),y
eor #$FF
inc
jsr CODE.LDAI
jsr CODE.SETpBASEpA
jsr CODE.Deref
clc
rts
* DATASEG
.7 jsr CODE.LDAI
lda #$85 STA zp
jsr CODE.EmitByte
lda #ZPPtr1+1
jsr CODE.EmitByte
ldy #SYM.Addr
lda (ZPSymBufPtr),y
jsr CODE.LDAI
lda #$85 STA zp
jsr CODE.EmitByte
lda #ZPPtr1+1
jsr CODE.EmitByte
jsr CODE.Deref
clc
rts
*--------------------------------------
CC.EXP.GetRef ldy #SYM.Addr+1
lda (ZPSymBufPtr),y
jsr CODE.PUSHI
ldy #SYM.Addr
lda (ZPSymBufPtr),y
jsr CODE.PUSHI
lda (ZPSymBufPtr) SYM.T
sta ZPPtr2 T
ldy #SYM.Q
lda (ZPSymBufPtr),y
clc
adc #SYM.Q.POINTER
bcs .9 more than ***
sta ZPPtr2+1 Q
* clc
rts
.9 lda #E.TMISMATCH
sec
rts
*--------------------------------------
CC.EXP.GetDeref
clc
rts
*--------------------------------------
CC.EXP.IntConst >PUSHW ZPLineBufPtr
>PUSHWI ZPLineBufPtr
>PUSHBI 10
>SYSCALL StrToUL
>PULLA
tay
>PULLA
inc pStack
inc pStack
rts
*--------------------------------------
MAN
SAVE usr/src/bin/cc.s.exp
LOAD usr/src/bin/cc.s
ASM