mirror of
https://github.com/A2osX/A2osX.git
synced 2024-10-31 23:09:33 +00:00
dad22dfc30
ASM:added \% KERNEL:BUGFIX in DevMgr LIBGUI:New API
720 lines
11 KiB
Plaintext
720 lines
11 KiB
Plaintext
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
|