📄 syntax.asm
字号:
;/subrutine name : Syntax.asm
;/user bady : HE83137
;/fast clock : 4Mhz
;/slow clock : 32768khz
;/programer : Alton
.INPP EQU 0x02
.Calc EQU 0x7b
.area Syntaxc(code)
.Syntax::
lda #0h
sta0 .LRcnt
sta0 .BeforePari
sta0 .DmsCount
sta0 .AfterPari
sta0 ErrorFlag ;ErrorFlag=1 ma error
sta0 .INDP ;ErrorFlag=2 syntax error
sta0 .CommaFlag ;ErrorFlag=3 stack error
sta0 .SimeFlag
lda0 .FormulaFlag ;IF flag=1 belong to formula mode
cmpe #01h
brnz .SyntaxCK
lda #02h
sta0 .INDP
;----------------.EndSyntaxCK---------------------------
.SyntaxCK:
lda #0h
sta PP
lda0 .DataDP
cmpe #0h
brz .EndSymbor
cmpe .INDP
brz .EndSyntaxCK
;-------------------------------------------
.StartCK:
lda0 ErrorFlag
cmpe #02h
brz .EndSymbor
lda #.INPP
sta PP
lda0 .INDP
sta DP
lda i
sta0 .DataBuf
sta0 .DataBuf+1
lda0 .INDP
inca
sta0 .INDP
br .Complier
;-------------------------------------------
.Complier::
lda0 ErrorFlag
cmpe #02h
brz .ErrorSym
call .SymborCK
lda0 .BeforePari
cmpe #0h
brnz .StartCmp
.StartCmp:
call .StackCk
lda0 ErrorFlag
cmpe #02h
brz .ErrorSym
.EndComplier:
lda0 .AfterPari
sta0 .BeforePari
lda0 .DataBuf
sta0 .Buf1
br .EndSyntax
.ErrorSym:
lda #02h
sta0 ErrorFlag
lda #0h
sta0 .TFlag
lda0 .INDP
deca
sta0 .SFDP
br .StartCK
.EndSyntax:
br .SyntaxCK
;-------------------------------------------
.SymborCK:
call .FunctCode
lda0 .AfterPari
cmpe #08h
brz .EndSymbor
lda0 .DataBuf
cmpe #07ah
brz .ErrorSym
cmpe #0d0h
brz .EnPolRec
cmpe #0d6h
brz .EnPolRec
cmpe #0b0h
brz .Semicolon
cmpe #0a4h
brz .IsADD
cmpe #0a5h
brz .IsDEC
cmpe #0a6h
brz .IsMUL
cmpe #0a7h
brz .IsDIV
cmpe #0b2h
brz .IsLC
cmpe #0b3h
brz .IsRC
cmpe #0aah
brz .IsDRG
cmpe #0bbh
brz .IsDRG
cmpe #0ceh
brz .IsDRG
cmpe #0a8h
brz .IsSignDec
cmpe #0b6h
brz .IsMemoryClr
cmpe #0b4h
brz .Comma
cmpe #0c3h
brz .Fraction
cmpe #0b7h
brz .Dms
cmpe #0a0h
brz .IsPoint
brnc .IsNum
call .CkMemory
lda0 .AfterPari
cmpe #0h
brnz .EndSymbor
;-------------------------------------------
.IsNum:
lda #01h
sta0 .AfterPari
br .EndSymbor
.IsADD:
lda #02h
sta0 .AfterPari
br .EndSymbor
.IsDEC:
lda #03h
sta0 .AfterPari
br .EndSymbor
.IsMUL:
lda #04h
sta0 .AfterPari
br .EndSymbor
.IsDIV:
lda #05h
sta0 .AfterPari
br .EndSymbor
.IsLC:
lda #06h
sta0 .AfterPari
br .EndSymbor
.IsRC:
lda #07h
sta0 .AfterPari
br .EndSymbor
.IsDRG:
lda #0ah
sta0 .AfterPari
br .EndSymbor
.IsPoint:
lda #09h
sta0 .AfterPari
br .EndSymbor
.IsSignDec:
lda #0bh
sta0 .AfterPari
br .EndSymbor
.IsMemoryClr:
lda #0ch
sta0 .AfterPari
br .EndSymbor
.Comma:
lda #0fh
sta0 .AfterPari
lda0 .CommaFlag
deca
sta0 .CommaFlag
br .EndSymbor
.Fraction:
lda #10h
sta0 .AfterPari
br .EndSymbor
.Dms:
lda #11h
sta0 .AfterPari
br .EndSymbor
.Semicolon:
lda #12h
sta0 .AfterPari
br .EndSymbor
.OtherFunc:
lda #02h
sta0 ErrorFlag
lda #0h ;set error site
sta0 .TFlag
lda0 .INDP
deca
sta0 .SFDP
br .EndSymbor
;-------------------------------------------
.EndSyntaxCK:
lda0 .DmsCount
cmpe #0h
brz .ChkSimeflag
lda0 .DataBuf
cmpe #0b7h ;dms
brz .ChkSimeflag
br .SyntaxError
.ChkSimeflag:
lda0 .CommaFlag
cmpe #0h
brz .CheckSime
lda0 .KeyPos
cmpe #0b5h
brz .CheckSime
cmpe #0dfh
brnz .SyntaxError
.CheckSime:
lda0 .SimeFlag
cmpe #01h
brnz .CkCommaFlag
lda0 .KeyPos
cmpe #0b5h
brz .3$
cmpe #0dfh
brnz .SyntaxError
.3$:
lda #02h
sta PP
lda #0h
sta DP
lda i
cmpe #0b0h ;bo is Simecolon ";"
brz .CkCommaFlagFirst
lda #>StateFlag
sta PP
lda StateFlag
anda #40h ;check SDmode
cmpe #40h
brz .CheckSDmd
lda StateFlag
anda #07h ;check SDmode
brnz .CheckLRmd
br .SyntaxError
.CheckSDmd:
lda0 .CommaFlag
cmpe #0h
brz .Endck
br .SyntaxError
.CheckLRmd:
lda0 .CommaFlag
cmpe #0ffh
brnz .SyntaxError
.CkCommaFlag:
lda0 .SimeFlag
cmpe #02h
brc .SyntaxError
lda #>StateFlag
sta PP
lda StateFlag
anda #07h
brz .CompSDmode
lda0 .KeyPos
cmpe #0b5h
brz .4$
cmpe #0dfh
brnz .CompSDmode
;br .Endck
.4$:
lda0 .CommaFlag
cmpe #0ffh
brz .Endck
lda0 .SimeFlag
cmpe #01h
brz .Endck
br .SynError
.CkCommaFlagFirst:
lda0 .CommaFlag
cmpe #0h
brnz .SynError
br .Endck
.CompSDmode:
lda0 .CommaFlag
cmpe #0h
brz .Endck
lda #>StateFlag
sta PP
lda StateFlag
anda #07h ;check LRmode
brz .SynError
lda0 .CommaFlag
cmpe #0ffh
brz .Endck
br .SynError
.Endck:
lda #01h
sta PP
lda #^(.DataEndCheck)
sta TPP
lda #@(.DataEndCheck)
sta TPH
lda #<(.DataEndCheck)
sta TPL
.SearchEnd:
ldv
sta0 .DataBuf+1
cmpe #0ffh
brz .Endend
lda #0h
sta PP
lda0 .DataBuf+1
cmpe .DataBuf
brnz .SearchEnd
br .EndSymbor
.Endend:
lda0 .DataBuf
cmpe #0ah
brc .SyntaxError
lda0 .DmsCount
cmpe #0h
brz .EndSymbor
br .EndSymbor
.SyntaxError:
lda #02h
sta0 ErrorFlag
lda #0h ;set error site
sta0 .TFlag
lda0 .INDP
deca
sta0 .SFDP
.EndSymbor:
ret
;-------------------------------------------
.StackCk:
lda0 .BeforePari
cmpe #0h
brz .HeadCodCK
lda0 .AfterPari
cmpe #01h
brz .NumCK
cmpe #02h
brz .AddDecCK
cmpe #03h
brz .AddDecCK
cmpe #04h
brz .MulDivCK
cmpe #05h
brz .MulDivCK
cmpe #06h
brz .LCCK
cmpe #07h
brz .RCCK
cmpe #08h
brz .FuncCK
cmpe #09h
brz .PointCK
cmpe #0ah
brz .DRGCK
cmpe #0bh
brz .SignDec
cmpe #0ch
brz .MemCLR
cmpe #0eh
brz .MemCmp
cmpe #0fh
brz .CommaFractDms
cmpe #10h
brz .CommaFractDms
cmpe #11h
brz .CommaFractDms
cmpe #12h
brz .DoSemicolon
br .EndStackCk
;-------------------------------------------
.HeadCodCK:
lda0 .DataBuf
cmpe #0b0h
brz .DoSemicolon
lda #01h
sta PP
lda #^(.HeadCheck)
sta TPP
lda #@(.HeadCheck)
sta TPH
lda #<(.HeadCheck)
sta TPL
.Searchhead:
ldv
sta0 .DataBuf+1
cmpe #0ffh
brz .EndHead
lda #0h
sta PP
lda0 .DataBuf+1
cmpe .DataBuf
brnz .Searchhead
br .SynError
.EndHead:
lda0 .DataBuf
cmpe #0aah
brz .SynError
cmpe #0bbh
brz .SynError
cmpe #0ceh
brz .SynError
cmpe #0b2h
brz .LCCK
br .EndStackCk
;-------------------------------------------
.NumCK:
lda0 .Buf1
cmpe #0b3h ;)
brz .SynError
cmpe #0d4h ;x!
brz .SynError
cmpe #0c8h ;X^-1
brz .SynError
cmpe #0d2h ;x!
brz .SynError
cmpe #0c5h ;X^-1
brz .SynError
cmpe #0b7h
brz .CKdMS
lda0 .AfterPari
cmpe #0ah ;4/11
brz .SynError
cmpe #0eh
brz .SynError
br .EndStackCk
.MemCmp:
lda0 .Buf1
cmpe #0b3h ;)
brz .EndStackCk
cmpe #0aah ;4/11
brz .SynError
cmpe #0bbh ;4/11
brz .SynError
cmpe #0ceh ;4/11
brz .SynError
;cmpe #0d4h ;x!
;brz .SynError
;cmpe #0c8h ;X^-1
;brz .SynError
;cmpe #0d2h ;x!
;brz .SynError
;cmpe #0c5h ;X^-1
;brz .SynError
cmpe #0b7h
brz .CKdMS
br .EndStackCk
.CKdMS:
lda #01h
sta0 .DmsCount
br .EndStackCk
;--------------------------------------------
.AddDecCK:
lda #01h
sta PP
lda #^(.SignCheck)
sta TPP
lda #@(.SignCheck)
sta TPH
lda #<(.SignCheck)
sta TPL
.SearchAD:
ldv
sta0 .DataBuf+1
cmpe #0ffh
brz .EndAD
lda #0h
sta PP
lda0 .DataBuf+1
cmpe .Buf1
brnz .SearchAD
br .EndStackCk
.EndAD:
lda0 .DataBuf
sta0 .Buf2
lda0 .Buf1
sta0 .DataBuf
cmpe #0a1h
brnc .IsNumDt
call .CheckFuncd
lda0 .AfterPari
cmpe #06h ;05h
brnz .SynError
.IsNumDt:
lda0 .Buf2
sta0 .DataBuf
br .EndStackCk
;-------------------------------------------
.MulDivCK:
lda #01h
sta PP
lda #^(.SignMUL)
sta TPP
lda #@(.SignMUL)
sta TPH
lda #<(.SignMUL)
sta TPL
.SearchMD:
ldv
sta0 .DataBuf+1
cmpe #0ffh
brz .EndMD
lda #0h
sta PP
lda0 .DataBuf+1
cmpe .Buf1
brnz .SearchMD
br .EndStackCk
.EndMD:
lda0 .Buf1
cmpe #0a1h
brnc .EndStackCk
br .SynError
;-------------------------------------------
.LCCK:
lda0 .LRcnt
inca
sta0 .LRcnt
br .EndStackCk
.RCCK:
lda0 .DataBuf
sta0 .Buf2
lda0 .Buf1
sta0 .DataBuf
call .CheckMem
lda0 .Buf2
sta0 .DataBuf
lda0 .LRcnt
deca
sta0 .LRcnt
cmpe #0ffh
brz .SynError
lda0 .Buf1
cmpe #0d4h ;x!
brz .EndStackCk
cmpe #0c8h ;X^-1
brz .EndStackCk
cmpe #0d2h ;x!
brz .EndStackCk
cmpe #0c5h ;X^-1
brz .EndStackCk
cmpe #0B3h ;)
brz .EndStackCk
cmpe #0b2h ;(
brz .SynError
cmpe #0c3h ;Fraction
brz .SynError
cmpe #0b4h ;Comma
brz .SynError
cmpe #0b7h ;DMS ;2002.02.06
brz .EndStackCk ;.SynError
cmpe #0ah
brnc .EndStackCk
lda0 .AfterPari
cmpe #01h
brz .EndStackCk
br .SynError
;-------------------------------------------
.FuncCK:
lda0 .DataBuf
sta0 .DataBuf+1
call .CheckPari
call .CheckMem
lda0 .AfterPari
cmpe #05h
brz .Function2
cmpe #06h ;05h
brz .EndStackCk
cmpe #09h
brz .Function2
cmpe #0ah
brz .Function2
br .EndStackCk
.Function2:
lda #01h
sta PP
lda #^(.Function)
sta TPP
lda #@(.Function)
sta TPH
lda #<(.Function)
sta TPL
.Funct2:
ldv
sta0 .DataBuf+1
lda0 .AfterPari
cmpe #09h
brnz .Paris08
lda0 .DataBuf+1
cmpe #0abh
brz .EndFunction2
br .cmpeData
.Paris08:
lda0 .DataBuf+1
cmpe #0ffh
brz .EndFunction2
.cmpeData:
lda #0h
sta PP
lda0 .Buf1
cmpe .DataBuf+1
brnz .Funct2
lda0 .DataBuf
cmpe #0d0h
brz .EnPolRec
cmpe #0d6h
brz .EnPolRec
br .EndStackCk
.EndFunction2:
lda0 .Buf1
cmpe #0ah
brc .SynError
br .EndStackCk
.EnPolRec:
lda0 .CommaFlag
inca
sta0 .CommaFlag
br .LCCK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -