📄 postfix.asm
字号:
;/subrutine name : Postfix.asm
;/user bady : HE83137
;/fast clock : 4Mhz
;/slow clock : 32768khz
;/programer : Alton
.INPP EQU 0x02
.PSPP EQU 0x02
.PosfixDP EQU 0x50
.STPP EQU 0x03
.ADD EQU 0xa4
.DEC EQU 0xa5
.MUL EQU 0xa6
.DIV EQU 0xa7
.LC EQU 0xb2
.RC EQU 0xb3
.XY EQU 0xd3
.SQUX EQU 0xd7
.POL EQU 0xd0
.REC EQU 0xd6
.NUM EQU 0xa1
.Comma EQU 0xb4
.DMS EQU 0xb7
.Fract EQU 0xc3
.NCR EQU 0xc9
.NPR EQU 0xd5
.REG EQU 0xb1
.MCL EQU 0xb6
.Degree EQU 0xab
.Minute EQU 0xac
.Second EQU 0xad
.Point EQU 0xa0
.Negative EQU 0xa8
.area postfix(code)
.Postfix::
lda0 .DataDP
cmpe #0h
brz .NoERROR
call .InitPsData
;===========================================
.IN2PS:
lda0 ErrorFlag
cmpe #0h
brnz .PosFixEnd
lda #>.INDP
sta PP
lda0 .INDP
cmpe .DataDP
brz .PopAllFunc
.STPostfix:
lda0 .PSDP
cmpe #0f0h
brc .StackErr
lda #.INPP
sta PP
lda0 .INDP
sta DP
lda i
sta0 .DataBuf
sta0 Temp2
incdp
lda DP
sta0 .INDP
lda0 .DataBuf
cmpe #0ah
brc .FunLCode
lda0 .Buf1
cmpe #0h
brnz .CmpUpDown
call .StoPosfix
lda0 Temp2
sta0 .Buf1
br .IN2PS
.StackErr:
lda #03h
sta0 ErrorFlag
br .PosFixEnd
;-------------------------------------------
.PopAllFunc:
lda #.PSPP
sta PP
lda0 .PSDP
sta DP
decdp
lda DP
lda i
cmpe #0ffh
brz .PopAllFunct
call .ClosEndPS
.PopAllFunct:
lda #.PSPP
sta PP
lda #.PosfixDP ;posfix start dp addr
sta DP
lda i
cmpe #.MCL
brz .EndPostfix
lda #.STPP
sta PP
lda0 .STDP
sta DP
lda DP
cmpe #0ffh
brz .EndPostfix
lda i
sta0 .DataBuf
lda0 .FractCount
cmpe #01h
brnz .NoFractcode
lda0 .DataBuf
cmpe #0dfh
brnz .NoFractcode
lda #0deh
sta0 .DataBuf
.NoFractcode:
lda0 .DataBuf
cmpe #0h
brz .EndPostfix
cmpe #.LC
brz .NotC
cmpe #.RC
brz .NotC
cmpe #.REG
brnz .ClsFont
lda0 .CommaFlag
cmpe #0ffh
brnz .NotC
.ClsFont:
call .NoSignal
call .ClosEndPS
.NotC:
lda0 .STDP
deca
sta0 .STDP
br .PopAllFunct
.EndPostfix:
lda #.PSPP
sta PP
lda0 .PSDP
sta DP
decdp
lda #0eeh ;EEH Posfix end code
sta i
.PosFixEnd:
lda0 ErrorFlag
cmpe #0h
brz .NoERROR
lda0 .INDP
sta0 .SFDP
ret
.NoERROR:
lda #03h
sta PP
lda #0h
sta DP
.CKloop:
lda i
cmpe #0h
brz .EndFractCK
cmpe #0dfh ;Fract 1
brz .CKnext
incdp
br .CKloop
.CKnext:
incdp
lda i
cmpe #0b2h ;(
brnz .CKloop
lda #02h
sta0 ErrorFlag
.EndFractCK:
ret
;-------------------------------------------
.FunLCode::
lda0 .DataBuf
sta0 .DataBuf+1
call .CheckPari
call .CheckMem
lda0 .AfterPari
cmpe #01h
brz .MemoryData
br .CmpFunct
;-------------------------------------------
.CmpUpDown:
lda0 .Buf1
sta0 .DataBuf+1
cmpe #.Degree ;#0aah
brz .SaveNum
cmpe #.Minute ;#0bbh
brz .SaveNum
cmpe #.Second ;#0ceh
brz .SaveNum
cmpe #.Negative
brz .SaveNum
cmpe #.Comma
brz .SaveNum
cmpe #0b0h ;---5
brz .SaveNum ;---5
cmpe #0aeh
brz .SaveNum
lda0 .DataBuf
sta0 .Buf1 ;.Buf1
lda0 .DataBuf+1
sta0 .DataBuf
call .CheckPari
lda0 Temp2
sta0 .DataBuf
lda #02h
sta PP
lda #.PosfixDP
sta DP
lda i
cmpe #0h
brz .SaveNum
lda0 .AfterPari
cmpe #0h
brz .SaveNum
cmpe #01h
brz .ErrorFlag
cmpe #02h
brz .SaveNum
cmpe #03h
brz .SaveNum
cmpe #04h
brz .SaveNum
cmpe #05h ;cnr
brz .SaveNum
cmpe #06h ;05h
brz .SaveNum
cmpe #07h ;06h
brz .SaveNum
cmpe #08h ;07
brz .SaveNum
cmpe #09h
brz .SaveNum
cmpe #0ah
brz .ErrorFlag
cmpe #0bh
brz .SaveNum
cmpe #0ch
brz .SaveNum
br .IN2PS
;-------------------------------------------
.SaveNumCls:
call .ClosEndPS
.SaveNum:
lda0 .DataBuf
cmpe #.Point ;Point
brnz .NumSave
lda0 .PointFlag
inca
sta0 .PointFlag
cmpe #02h
brc .ErrorFlag
.NumSave:
call .StoPosfix
lda0 Temp2
sta0 .Buf1
br .IN2PS
.ErrorFlag:
lda #02h
sta0 ErrorFlag
br .PosFixEnd
;===========================================
.CmpFunct:
lda0 .DataBuf
cmpe #.POL
brz .DoPolRec
cmpe #.REC
brz .DoPolRec
cmpe #.MCL
brz .StoInPosfix
cmpe #.DMS
brz .DoDMS
cmpe #.Fract
brz .DoFract
cmpe #.Point
brz .SaveNum
cmpe #.Negative
brz .SetSignDec
cmpe #.ADD
brz .SetADDEC
cmpe #.DEC
brz .SetADDEC
cmpe #.MUL
brz .SetMulDiv
cmpe #.DIV
brz .SetMulDiv
cmpe #.LC
brz .LeftC
cmpe #.RC
brz .RightC
cmpe #.Comma
brz .DoComma
cmpe #0b0h ;---5
brz .DoSime
lda0 .AfterPari
cmpe #01h
brz .MemoryData
br .FuncCheck
;-------------------------------------------
.DoComma:
lda #0h
sta0 .DmsCount
sta0 .PointFlag
call .ClosEndPS
call .PushData ;.StoFuncPS ;----219
call .ClosEndPS
br .EndComma ;219
.DoSime:
lda #0h
sta0 .PointFlag
call .ClosEndPS
call .PushData ;.StoFuncPS ;----219
call .ClosEndPS
lda #0b0h
sta0 .Buf1
br .EndSime ;219
.PopPolRec:
lda #.STPP
sta PP
lda0 .STDP
sta DP
lda i
sta0 .DataBuf
cmpe #.POL ;pol(
brz .EndComma
cmpe #.REG
brz .EndComma ;REG MODE
cmpe #.REC ;rec(
brz .EndComma
cmpe #0h
brz .SynErr
call .StoFuncPS
call .ClosEndPS
lda0 .STDP
deca
sta0 .STDP
br .PopPolRec
.EndComma:
lda #.Comma
sta0 .Buf1
.EndSime:
lda #>StateFlag
sta PP
lda StateFlag
anda #07h
brz .EndComCK
lda #0ffh
sta0 .CommaFlag
.EndComCK:
br .IN2PS
;-------------------------------------------
.DoPolRec:
lda0 .DataBuf
sta0 .Buf2
lda0 .Buf1
sta0 .DataBuf
sta0 .DataBuf+1
call .CheckPari
call .CheckMem
lda0 .Buf2
sta0 .DataBuf
lda0 .Buf1
cmpe #07ah ; formula '='
brz .PushPolRec
lda0 .INDP
cmpe #01h
brz .PushPolRec
lda0 .Buf1
cmpe #.LC
brz .PushPolRec
cmpe #.RC
brz .MulPushPolRec
lda0 .AfterPari
cmpe #01h
brz .MulPushPolRec
cmpe #02h
brz .MulPushPolRec
cmpe #03h
brz .PushPolRec
cmpe #04h
brz .PushPolRec
cmpe #05h
brz .PushPolRec
cmpe #06h
brz .PushPolRec
cmpe #09h
brz .PushPolRec
cmpe #0ah
brz .MulPushPolRec
cmpe #0ch
brz .PushPolRec
br .SynErr
.MulPushPolRec:
call .ClosEndPS
lda0 .DataBuf
sta0 .Buf2
lda #.Mul
sta0 .DataBuf
call .PushData
lda0 .Buf2
sta0 .DataBuf
.PushPolRec:
call .PushData
lda #.LC
sta0 .DataBuf
call .StoStack
lda0 .Buf2
sta0 .Buf1
br .IN2PS
;---------------------------------------
.DoDMS:
lda #0h
sta0 .PointFlag
.DoDmsCount:
lda0 .DmsCount
cmpe #0h
brz .IsDegree
cmpe #01h
brz .IsMin
cmpe #02h
brz .IsSec
cmpe #03h
brc .SynErr
.IsDegree:
lda #.Degree
sta0 .DataBuf
sta0 .Buf1
call .ClosEndPS
call .PushData
lda0 .DmsCount
inca
sta0 .DmsCount
br .IN2PS
.IsMin:
lda #.Minute
sta0 .DataBuf
br .PushDms
.IsSec:
lda #.Second
sta0 .DataBuf
br .PushDms
.PushDms:
lda0 .DmsCount
inca
sta0 .DmsCount
lda0 .DataBuf
sta0 .Buf1
call .ClosEndPS
call .PushData
lda #0aeh
sta0 .DataBuf
lda #09h ;07hae
sta0 .AfterPari
br .PushStack
.SynErr:
lda #02h
sta0 ErrorFlag
br .PosFixEnd
;-------------------------------------------
.DoFract::
lda #0h
sta0 .FractTrsCnt ;clr LC cnt
lda #01h
sta PP
lda .SetFlag
anda #14h
brnz .NoSetFract
.NoSetFract:
lda0 .DmsCount
cmpe #0h
brz .NoDmsMode
lda0 .Buf1
cmpe #0abh
brz .NoDmsMode
cmpe #0ach
brz .NoDmsMode
cmpe #0adh
brz .NoDmsMode
cmpe #0aeh ;3/13 add
brz .NoDmsMode
cmpe #.RC
brz .NoDmsMode
br .SynErr
.NoDmsMode:
lda #0h
sta0 .PointFlag
lda0 .DmsCount
cmpe #0h
brz .DOFractCount
lda #0h
sta0 .DmsCount
.DOFractCount:
lda0 .FractCount
cmpe #0h
brz .Intnum
cmpe #01h
brz .IntFen
cmpe #02h
br .MaErr ;4/19
.Intnum:
lda #0dfh
sta0 .DataBuf
br .PushFrant
.IntFen:
lda #0deh
sta0 .DataBuf
br .PushFrant
.PushFrant:
lda0 .FractCount
inca
sta0 .FractCount
br .PushStackCls
.MaErr:
lda #01h
sta0 ErrorFlag
br .PosFixEnd
;-------------------------------------------
.SetADDEC:
lda0 .DmsCount
cmpe #0h
brz .AddNoDms
lda0 .Buf1
cmpe #.Degree
brz .ClrDmsCntA
cmpe #.Minute
brz .ClrDmsCntA
cmpe #.Second
brz .ClrDmsCntA
cmpe #0aeh
brz .ClrDmsCntA
cmpe #.RC
brnz .SynErr
; .AddNoDms 2003 1 14.
.ClrDmsCntA:
lda #0h
sta0 .DmsCount
.AddNoDms:
lda0 .FractTrsCnt
cmpe #0h
brnz .CKNormaldec
lda0 .Buf1
cmpe #0dfh
brz .AdjustOpt
cmpe #0deh
brz .ClrFractCnt
.CheckFractCNT:
lda0 .FractCount
cmpe #01h
brz .AdjustOptmuldiv
cmpe #02h
brz .ClrFractCntMul
.CKNormaldec:
lda #0h
sta0 .PointFlag
lda0 .INDP ; .PSDP
cmpe #01h
brz .Sign
lda0 .Buf1
cmpe #.NUM
brnc .PushStackCls
cmpe #0aeh ;06h
brz .PushStack
cmpe #.ADD
brz .Sign
cmpe #.DEC
brz .Sign
cmpe #.Mul
brz .Sign
cmpe #.Div
brz .Sign
cmpe #.LC
brz .Sign
cmpe #.Negative
brz .Sign
cmpe #.Comma
brz .Sign
cmpe #0b0h ;----5
brz .Sign
cmpe #.RC
brz .ClrFractCntMul ;.PushStackCls
lda0 .DataBuf
sta0 Temp2; .Buf2
lda0 .Buf1
sta0 .DataBuf
sta0 .DataBuf+1
call .CheckPari
call .CheckMem
lda0 Temp2
sta0 .Buf1
sta0 .DataBuf
lda0 .AfterPari
cmpe #01h
brz .PushStackCls
cmpe #02h
brz .PushStackCls
cmpe #05h ;CNR
brz .Sign
cmpe #06h ;06h
brz .Sign
cmpe #0ah
brz .PushStack ;.Sign
cmpe #09h
brz .Sign
cmpe #07h ;06h
brz .Sign ;.PushStack
cmpe #0bh
brz .Sign
cmpe #0ch
brz .Sign
br .IN2PS
.ClrFractCnt:
lda #0h
sta0 .FractCount
br .Sign ;
.ClrFractCntMul:
lda #0h
sta0 .FractCount
br .PushStackCls
.ClrDmsCnt:
lda #0h
sta0 .DmsCount
br .PushStack
;-------------------------------------------
.SetMulDiv:
lda0 .DmsCount
cmpe #0h
brz .MulNoDms
lda0 .Buf1
cmpe #.Degree
brz .ClrDmsCntM
cmpe #.Minute
brz .ClrDmsCntM
cmpe #.Second
brz .ClrDmsCntM
cmpe #0aeh
brz .ClrDmsCntM
cmpe #.RC
brz .MulNoDms
br .SynErr
.ClrDmsCntM:
lda #0h
sta0 .DmsCount
.MulNoDms:
lda #0h
sta0 .PointFlag
lda0 .FractCount
cmpe #01h
brz .AdjustOptmuldiv ;.AdjustOpt
cmpe #02h
brz .ClrFractCntMul
lda0 .DmsCount
cmpe #0h
brnz .ClrDmsCnt
br .PushStackCls; .PushStack
.AdjustOpt:
lda #.STPP
sta PP
lda0 .STDP
sta DP
lda i
cmpe #.LC
brz .PushStackCls
lda #0deh
sta i
br .Sign
.AdjustOptmuldiv:
lda0 .FractTrsCnt
cmpe #0h
brnz .PushStackCls
lda #.STPP
sta PP
lda0 .STDP
sta DP
.ChangDFMul:
lda i
cmpe #.LC
brz .SearchFract
lda #0deh
sta i
lda #0h
sta0 .FractCount
br .PushStackCls
.SearchFract:
decdp
br .ChangDFMul
;-------------------------------------------
.SetSignDec:
lda0 .Buf1
cmpe #0dfh
brz .CheckFractCNT1
cmpe #0deh
brnz .CKNormalsigndec
.CheckFractCNT1:
lda0 .FractCount
cmpe #01h
brz .AdjustOpt
cmpe #02h
brz .ClrFractCnt
.CKNormalsigndec:
lda0 .DataBuf
sta0 Temp2 ;.Buf2
lda0 .INDP
cmpe #01h
brz .Sign
lda0 .Buf1
cmpe #.ADD
brz .Sign
cmpe #.DEC
brz .Sign
cmpe #.Mul
brz .Sign
cmpe #.Div
brz .Sign
cmpe #.LC
brz .Sign
cmpe #.Negative
brz .Sign
cmpe #.Comma
brz .Sign
cmpe #0b0h ;----5
brz .Sign
lda0 .Buf1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -