A2osX/BIN/CC.S.KW.txt
burniouf dad22dfc30 CC:SWITCH/CASE
ASM:added \%
KERNEL:BUGFIX in DevMgr
LIBGUI:New API
2022-10-18 07:56:59 +02:00

720 lines
11 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
*--------------------------------------
* Built in Keywords
*--------------------------------------
KW.IF jsr STMT.NewCPS00
bcs .99
jsr CC.GetCharNB
bcs .9
cmp #'('
bne .9
jsr CORE.GetNCharNB
bcs .9
jsr EXP.Eval00 Any var type
bcs .99
jsr KW.TestZero Y,A=T/Q
lda #'E'
jsr SYM.LookupA
bcs .99
lda #$4C emit JMP else
jsr CODE.TOABSYX
bcs .99
jsr CC.GetCharNB
bcs .99
cmp #')'
bne .9
jmp STMT.SetCPSType
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
KW.IF.END jsr CORE.GetCharNBNL
bcs .1
cmp #';'
beq .1
>LDYA L.CC.KW2.IF Check allowed KW for IF....
jsr CC.LookupID
bcc .2
.1 lda #'E' define ELSE Label
jsr STMT.NewLabelA
bcs .99
clv pop context
rts
*--------------------------------------
.2 lda #'X'
jsr SYM.LookupA
bcs .99
lda #$4C emit JMP exit
jsr CODE.TOABSYX
bcs .99
lda #'E' define ELSE Label
jsr STMT.NewLabelA
bcs .99
lda #KW.ELSE.ID replace IF by ELSE keyword
ldy CStackPtr
sta (ZPCCStack),y
jsr STMT.SetCPSType
bcs .99
bit .99 set V : DONT pop context
rts
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
KW.ELSE lda #E.CSYN illegal
sec
rts
*--------------------------------------
KW.ELSE.END lda #'X' define EXIT Label
jsr STMT.NewLabelA
bcs .99
clv pop context
.99 rts
*--------------------------------------
KW.WHILE jsr STMT.NewCPS00
bcs .99
lda #'C' define CONT Label
jsr SYM.NewA
bcs .99
jsr CC.GetCharNB
bcs .9
cmp #'('
bne .9
jsr CORE.GetNCharNB
bcs .9
jsr EXP.Eval00 Any var type
bcs .99
jsr KW.TestZero
lda #'B'
jsr SYM.LookupA
bcs .99
lda #$4C emit JMP break:
jsr CODE.TOABSYX
bcs .99
jsr CC.GetCharNB
bcs .99
cmp #')'
bne .9
jmp STMT.SetCPSType
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
KW.WHILE.END >LDYA L.PCC.SLEEP
jsr CODE.EmitPCC
bcs .99
lda #'C'
jsr STMT.GetLabelA
bcs .99
lda #$4C
jsr CODE.TOABSYX emit JMP cont:
bcs .99
lda #'B' define BREAK Label
jsr STMT.NewLabelA
bcs .99
clv pop context
.99 rts
*--------------------------------------
KW.DO jsr STMT.NewCPS00
bcs .99
lda #'C' define CONT Label
jsr SYM.NewA
bcs .99
jmp STMT.SetCPSType
.99 rts
*--------------------------------------
KW.DO.END >LDYA L.CC.KW2.DO Check allowed KW for DO....
jsr CC.LookupID
bcs .9
jsr CC.GetCharNB
bcs .9
cmp #'('
bne .9
jsr CORE.GetNCharNB
bcs .9
jsr EXP.Eval00 Any var type
bcs .99
jsr KW.TestnZero
lda #'C'
jsr STMT.GetLabelA
bcs .99
lda #$4C emit JMP cont
jsr CODE.TOABSYX
bcs .99
lda #'B' define BREAK Label
jsr STMT.NewLabelA
bcs .99
jsr CC.GetCharNB
bcs .99
cmp #')'
bne .9
jsr CORE.GetNCharNB
bcs .9
clv pop context
clc
rts
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
* for (s1;e2;s3) s;
*
* { <- new scope : allows for(int i=1; ....)
* s1;
* loop:
* while (e2) jmp break:
* {
* s; jsr s:
* cont:
* s3; jmp loop:
* }
* s:
* <s>;
* break:
* }
*--------------------------------------
KW.FOR jsr CC.GetCharNB
bcs .29
cmp #'('
bne .29
jsr STMT.NewCPS00
bcs .29
jsr CORE.GetNCharNB skip '('
bcs .29
>LDYA L.CC.TYPEQUAL
jsr CC.LookupID
bcs .1
jsr DECL.X
bcc .2
.19 rts
.1 jsr STMT.Get get s1
bcs .19
* jsr KW.StackDiscard
.2 jsr CC.GetCharNB
bcs .9
cmp #';'
bne .9
jsr CORE.GetNCharNB skip ';'
bcs .9
*--------------------------------------
lda #'L' LOOP Label
jsr SYM.NewA
bcs .99
jsr EXP.Eval00 get e2
.29 bcs .99
jsr KW.TestZero
bcs .99
lda #'B'
jsr SYM.LookupA
bcs .99
lda #$4C emit JMP break:
jsr CODE.TOABSYX
lda #'S'
jsr SYM.LookupA
bcs .99
lda #$20 emit JSR s:
jsr CODE.TOABSYX
jsr CC.GetCharNB
bcs .9
cmp #';'
bne .9
jsr CORE.GetNCharNB skip ';'
bcs .9
*--------------------------------------
lda #'C' CONT Label
jsr SYM.NewA
bcs .99
jsr STMT.Get get s3
bcs .99
* jsr KW.StackDiscard
jsr CC.GetCharNB
bcs .9
cmp #')'
bne .9
lda #'L'
jsr SYM.LookupA
bcs .99
lda #$4C
jsr CODE.TOABSYX emit JMP loop
lda #'S' S Label
jsr SYM.NewA
bcs .99
jmp STMT.SetCPSType
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
KW.FOR.END lda #$60
jsr CODE.EmitByte set RTS for JSR code;
bcs .99
lda #'B' define BREAK Label
jsr STMT.NewLabelA
bcs .99
clv pop context
.99 rts
*--------------------------------------
KW.SWITCH jsr CC.GetCharNB
bcs .98
cmp #'('
bne .98
jsr CORE.GetNCharNB
bcs .98
jsr EXP.Eval00 Any var type
bcs .99 Y,A=T/Q
tax
bne .97
cpy #SYM.T.UCHAR
bcc .97
cpy #SYM.T.ULONG
bcs .97
cpy #SYM.T.SINT+1
bcs .1
>LDYA L.PCC.8to16 make char an int
jsr CODE.EmitPCC
bcs .99
.1 >LDYAI 256
>SYSCALL GetMem
bcs .99
txa
jsr CC.Push push CPS.hMEM
lda #0
jsr CC.Push push CPS.Ptr
bcs .99
jsr STMT.NewCPS
bcs .99
jsr CC.GetCharNB
bcs .99
cmp #')'
bne .98
lda #'J'
jsr STMT.LookupLabelA
bcs .99
lda #$4C emit JMP JmpTable
jsr CODE.TOABSYX
bcs .99
jmp STMT.SetCPSType
.97 lda #E.TMISMATCH
sec
rts
.98 lda #E.CSYN
sec
.99
KW.SWITCH.RTS rts
*--------------------------------------
KW.SWITCH.END lda #'J' define JMP Label
jsr STMT.NewLabelA
bcs KW.SWITCH.RTS
lda CStackPtr
clc
adc #CPS.hMEM
tay
lda (ZPCCStack),y
>SYSCALL GetMemPtr
>STYA ZPPtr1
lda CStackPtr
clc
adc #CPS.Ptr
tay
lda (ZPCCStack),y
sta ZPPtr2+1
stz ZPPtr2
.1 ldy ZPPtr2
cpy ZPPtr2+1
beq .2
lda (ZPPtr1),y
pha
iny
lda (ZPPtr1),y
tax
pla
jsr CODE.LDAXI
bcs .99
>LDYA L.PCC.JmpOnYA
jsr CODE.EmitPCC
bcs .99
ldy ZPPtr2
iny
iny
lda (ZPPtr1),y
tax
iny
lda (ZPPtr1),y
iny
sty ZPPtr2
tay
lda #$4C emit JMP Case ...
jsr CODE.TOABSYX
bcs .99
bra .1
.2 >LDYA L.PCC.Pop16
jsr CODE.EmitPCC
bcs .99
lda #'D'
jsr STMT.LookupLabelA
bcs .3
lda #$4C emit JMP Default
jsr CODE.TOABSYX
bcs .99
.3 lda #'B' define BREAK Label
jsr STMT.NewLabelA
bcs .99
lda CStackPtr
clc
adc #CPS.hMEM
tay
lda (ZPCCStack),y
>SYSCALL FreeMem
clv pop context
.99 rts
*--------------------------------------
KW.CASE ldy CStackPtr
beq .98
lda (ZPCCStack),y
cmp #KW.SWITCH.ID SWITCH ??
bne .98
tya
clc
adc #CPS.hMEM
tay
lda (ZPCCStack),y
>SYSCALL GetMemPtr
>STYA ZPPtr1
jsr EXP.GetIntegral
bcs .99
>STYA ZPPtr2
lda CStackPtr
clc
adc #CPS.Ptr
tay
lda (ZPCCStack),y
tay
lda ZPPtr2
sta (ZPPtr1),y
iny
lda ZPPtr2+1
sta (ZPPtr1),y
iny
lda ZPCCCode
sta (ZPPtr1),y
iny
lda ZPCCCode+1
sta (ZPPtr1),y
iny
beq .97
phy
lda CStackPtr
clc
adc #CPS.Ptr
tay
pla
sta (ZPCCStack),y
jsr CC.GetCharNB
bcs .98
cmp #':'
bne .98
jsr CORE.GetNCharNB skip ':'
clc
rts
.97 lda #E.BUF
sec
rts
.98 lda #E.CSYN
sec
.99 rts
*--------------------------------------
KW.DEFAULT ldy CStackPtr
beq .9
lda (ZPCCStack),y
cmp #KW.SWITCH.ID
bne .9
jsr CC.GetCharNB
bcs .9
cmp #':'
bne .9
jsr CORE.GetNCharNB skip ':'
lda #'D' define DEFAULT Label
jmp STMT.NewLabelA
.9 lda #E.CSYN
sec
.99 rts
*--------------------------------------
KW.BREAK lda #'B'
jsr STMT.LookupLabelA
bcs .9
lda #$4C emit JMP break
jmp CODE.TOABSYX
.9 lda #E.CSYN
sec
rts
*--------------------------------------
KW.CONTINUE lda #'C'
jsr STMT.LookupLabelA
bcs .9
lda #$4C emit JMP cont
jmp CODE.TOABSYX
.9 lda #E.CSYN
sec
rts
*--------------------------------------
KW.RETURN ldy CStackPtr
beq .9
.1 lda (ZPCCStack),y CPS.KW
bmi .7 f()
tya
clc
adc #CPS skip CPStmt (6 bytes)
tay
bcc .1
.9 lda #E.STACKERROR
sec
.99 rts
.7 tya
clc
adc #CPS.T
tay
lda (ZPCCStack),y
pha
iny get CPS.Q
lda (ZPCCStack),y
ply T
jsr EXP.Eval
bcs .99
jsr SYM.GetYASizeOfInAXC Y,A=T/Q
tax X = sizeof
jsr CODE.SetRetValue
bcs .99
>LDYA L.PCC.LEAVE
jmp CODE.EmitPCC
*--------------------------------------
KW.SIZEOF
lda #E.CSYN
sec
rts
*--------------------------------------
* Input : Value on Stack, Y,A = Type/Qual
*--------------------------------------
KW.TestZero jsr EXP.GetYASizeOfInAXC
tax
cpx #1
bne .1
>LDYA L.PCC.TestZero1
jmp CODE.EmitPCC
.1 cpx #2
bne .2
>LDYA L.PCC.TestZero2
jmp CODE.EmitPCC
.2 jsr CODE.LDXI
bcs .9
>LDYA L.PCC.TestZeroX
jmp CODE.EmitPCC
.9 rts
*--------------------------------------
* Input : Value on Stack, Y,A = Type/Qual
*--------------------------------------
KW.TestnZero jsr EXP.GetYASizeOfInAXC
tax
cpx #1
bne .1
>LDYA L.PCC.TestnZero1
jmp CODE.EmitPCC
.1 cpx #2
bne .2
>LDYA L.PCC.TestnZero2
jmp CODE.EmitPCC
.2 jsr CODE.LDXI
bcs .9
>LDYA L.PCC.TestnZeroX
jmp CODE.EmitPCC
.9 rts
*--------------------------------------
* Input : Value on Stack, Y,A = Type/Qual
*--------------------------------------
KW.StackDiscard jsr TYPE.SizeOf
txa
beq .8 void
jsr CODE.AddLocal
.8 clc
.9 rts
*--------------------------------------
MAN
SAVE usr/src/bin/cc.s.kw
LOAD usr/src/bin/cc.s
ASM