📄 postfixvalume.asm
字号:
;/subrutine name : PostfixValume.asm
;/user bady : HE
;/fast clock : 4Mhz
;/slow clock : 32768khz
;/programer : Alton
.STPP EQU 0x02
.INPP EQU 0x02
.area .PosValData(data,abs)
.org 0x7b
.PsValDP:: .ds 1
.IndexDP:: .ds 1
.P3DP:: .ds 1
.P2DP:: .ds 1
.FunDP:: .ds 1
.area .PosVal(code)
.PosValue::
lda #0h ;Clear ErrorCnt
sta0 .ErrorCnt
lda0 .DataDP
cmpe #0h
brz .NoDataInp
lda #0h
sta0 .FinFlag
call .ClrSK
call .PushSkData
lda #0f0h
sta0 .P2DP
lda #50h
sta0 .P3DP
lda #0h
sta0 .IndexDP
sta DP
lda #03h
sta PP
lda i
sta0 .PsValDP
.PosValueHead:
lda #0h
sta0 .IndexDP
.CalcPsVal:
lda0 .IndexDP
sta DP
lda #03h
sta PP
lda i
sta0 .PsValDP
lda i
cmpe #0f0h
brc .CKnextIS0
cmpe #0h
brz .PsValEnd
cmpe #0ffh
brz .SchNext
.CalcPosfixAns:
call .CalcVal
lda0 .ErrorCnt
inca
sta0 .ErrorCnt
cmpe #80h
brnz .GetNextVal
lda #04h
sta0 ErrorFlag
.GetNextVal:
lda0 ErrorFlag
cmpe #0h
brnz .EndPos
lda0 .FinFlag
cmpe #0h
brz .SchNext
call .MoveP3DP
call .ReSetP3ST
lda #0h
sta0 .IndexDP
sta0 .FinFlag
br .CalcPsVal
.SchNext:
lda0 .IndexDP
inca
sta0 .IndexDP
br .CalcPsVal
.CKnextIS0:
incdp
lda i
cmpe #0h
brnz .CalcPosfixAns
.PsValEnd:
call .MoveP3DP
call .ReSetP3ST
lda #03h
sta PP
lda #01h
sta DP
.KeepCK:
lda i
cmpe #0h
brz .EndPosValue
cmpe #0ffh
brnz .PosValueHead
incdp
br .KeepCK
.EndPosValue:
;;;;;;;SDmode--------------------------
lda #01h
sta PP
lda StateFlag
anda #40h
cmpe #40h
brnz .EndValCalc
lda0 .KeyPos
cmpe #0b5h
brz .StoreSD
cmpe #0dfh
brnz .EndValCalc
.StoreSD:
lda #02h
sta PP
lda #0h
sta DP
lda i
cmpe #0b0h
brz .EndValCalc
lda0 .Buf4
cmpe #0b0h
brz .EndValCalc
call .Z_trans_I
call .Z_trans_X
call .ChkOverExp50
lda0 ErrorFlag
cmpe #0h
brnz .EndPos
call .I_trans_X
call .X_trans_LRX
lda0 .KeyPos
cmpe #0dfh
brnz .SD_DTmode
call .ClrX
lda #02h
sta0 OperandX+6
call .SimeCounter
br .EndValCalc
.SD_DTmode:
call SD_Prepare
call .I_trans_Z
;---------------------------
.EndValCalc:
lda0 .DataDP
cmpe #01h
brnz 1$
lda #02h
sta PP
lda #0h
sta DP
lda i
cmpe #0b6h ;mcl
brz .BaseN_Mode_Check
1$:
call .Z_trans_I ;I=ANS
.BaseN_Mode_Check:
lda #>StateFlag
sta PP
lda StateFlag
anda #08h
brz .ChkFormula
call .DelPoint
call .Z_trans_X
call .X_trans_Buf
lda #>BasenFlag
sta PP
lda BasenFlag
anda #0f0h
cmpe #80h ;DEC Mode
brz .Dec2Dec
cmpe #40h ;Hex Mode
brz .Dec2Hex
cmpe #20h ;Bin Mode
brz .Dec2Bin
cmpe #10h
brz .Dec2Oct ;Oct Mode
br .EndPos
.Dec2Hex::
call Base_Dec2Hex
call .Z_trans_X
call CheckHexLimit
call .X_trans_Z
br .EndPos
.Dec2Bin::
call Base_Dec2Bin
call .Z_trans_X
call CheckBinLimit
call .X_trans_Z
br .EndPos
.Dec2Oct::
call Base_Dec2Oct
call .Z_trans_X
call CheckOctLimit
call .X_trans_Z
br .EndPos
.Dec2Dec::
call CheckDecLimit
call .X_trans_Z
br .EndPos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ChkFormula:
lda #>.SFlag
sta PP
lda .SFlag
anda #80h
brz .2$
lda0 .ForData
sta0 .KeyPos
call .STOReg
lda #0h
sta0 .StoFlag
br .NomalMode
.2$:
lda0 .FormulaFlag ;sto formula value
cmpe #01h
brnz .NomalMode
lda #02h
sta PP
lda #0h
sta DP
lda i
sta0 .KeyPos
call .STOReg
br .EndPos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.NoDataInp:
lda #>StateFlag
sta PP
lda StateFlag
anda #80h
brz .EndPos
lda0 .KeyPos
cmpe #0dfh
brz .AnsToZ
cmpe #0b5h
brnz .EndPos
.AnsToZ:
call .I_trans_Z
.NomalMode:
.EndPos:
ret
;-------------------------------------------
.CalcVal:
lda0 .PsValDP
cmpe #0f0h
brc .CKY
lda #02h
sta PP
lda0 .PsValDP
sta DP
lda i
sta0 .DataBuf+1
sta0 .DataBuf
cmpe #0b6h
brz .ClearrMem
lda0 .DataBuf
cmpe #0a0h
brz .CKY
call .CheckPari
call .CheckMem
lda0 .AfterPari
cmpe #01h
brz .CKY
cmpe #02h
brz .CKY
br .EndCalcVal
.CKY:
lda0 .IndexDP
sta DP
lda #03h
sta PP
incdp
lda i
sta0 .PsValDP
cmpe #0h
brz .StartCalcV
cmpe #0f0h
brc .CKOP
lda #02h
sta PP
lda0 .PsValDP
sta DP
lda i
sta0 .DataBuf+1
sta0 .DataBuf
cmpe #0b4h
brz .StartCalcV
cmpe #0b0h
brz .StartCalcV
cmpe #0a0h
brz .CKOP
call .CheckPari
call .CheckMem
lda0 .AfterPari
cmpe #01h
brz .CKOP
cmpe #02h
brz .CKOP
cmpe #06h ;05h
brz .StartCalcV
cmpe #0ah
brz .StartCalcV
cmpe #0bh
brz .StartCalcV
br .EndCalcVal
.CKOP:
lda0 .IndexDP
sta DP
lda #03h
sta PP
incdp
incdp
lda i
sta0 .PsValDP
cmpe #0h
brz .EndCalcVal
cmpe #0f0h
brc .EndCalcVal
lda #02h
sta PP
lda0 .PsValDP
sta DP
lda i
sta0 .DataBuf+1
cmpe #0a0h
brz .EndCalcVal
cmpe #0b0h
brz .StartCalcV
cmpe #0b4h
brz .CheckNowMode
cmpe #0b6h
brz .EndCalcVal
cmpe #0aeh ;07h ae
brz .StartCalcV
call .CheckPari
lda0 .AfterPari
cmpe #0h
brz .StartCalcV
cmpe #01h
brz .EndCalcVal
cmpe #02h
brz .EndCalcVal
cmpe #03h
brz .StartCalcV
cmpe #04h
brz .StartCalcV
cmpe #05h
brz .StartCalcV
cmpe #07h ;07hae
brz .StartCalcV
cmpe #08h ;07h
brz .StartCalcV
cmpe #09h
brz .StartCalcV
cmpe #0bh
brz .StartCalcV
cmpe #0ch
brz .StartCalcV
br .EndCalcVal
.CheckNowMode:
lda #01h ;only x','y cann't use comp mode
sta PP
lda StateFlag
anda #07h
cmpe #0h
brnz .StartCalcV
br .EndCalcVal
.StartCalcV:
lda0 .IndexDP
sta DP
lda #03h
sta PP
lda i
sta0 .PsValDP
lda0 .PsValDP
cmpe #0h
brz .EndCalcVal
cmpe #0f0h
brc .P3DPX
lda #02h
sta PP
lda0 .PsValDP
sta DP
lda i
sta0 .DataBuf+1
sta0 .DataBuf
cmpe #0a0h
brz .SaveX
call .CheckPari
call .CheckMem
lda0 .AfterPari
cmpe #01h
brz .MemoryToX
.SaveX:
call .SaveToZ
lda #0h
sta PP
call .Z_trans_R ;R store X
br .GetY
.MemoryToX:
call .MemoryToZ
call .Z_trans_R
br .GetY
;=============
.GetY:
lda0 .IndexDP
sta DP
lda #03h
sta PP
incdp
lda i
sta0 .PsValDP
cmpe #0h
brz .NormalYmode
cmpe #0f0h
brc .P3DPY
lda #02h
sta PP
lda0 .PsValDP
sta DP
lda i
sta0 .DataBuf+1
sta0 .DataBuf
sta0 .Buf1
.NormalYmode:
lda0 .PsValDP
cmpe #0h
brz .EndCalcVal
lda0 .Buf1
cmpe #0b0h
brz .CalcFunct56V
cmpe #0a0h
brz .SaveY
lda0 .DataBuf
;cmpe #0aah
;brz .CalcDMS
cmpe #0abh
brz .CalcDMS
cmpe #0ach
brz .CalcDMS
cmpe #0adh
brz .CalcDMS
cmpe #0b4h
brz .CalcFunct56V
call .CheckPari
call .CheckMem
lda0 .AfterPari
cmpe #01h
brz .MemoryToY
cmpe #06h ;05h
brz .CalcFunct56V
cmpe #0ah
brz .CalcFunct56V
cmpe #0bh
brz .CalcFunct56V
.SaveY:
call .SaveToZ
lda #0h
sta PP
sta0 OperandY+7
call .Z_trans_Y
br .GetOPC
.MemoryToY:
call .MemoryToZ
call .Z_trans_Y
br .GetOPC
.CalcFunct56V:
call .R_trans_X
lda #0h
sta0 OperandX+7
call .ChoiceFunc
br .MarkDP1
;=============
.GetOPC:
call .R_trans_X
lda #0h
sta0 OperandX+7
sta0 OperandY+7
lda0 .IndexDP
sta DP
lda #03h
sta PP
incdp
incdp
lda i
sta0 .PsValDP
lda0 .KeyPos
cmpe #77h ;%=
brnz .IsEqu
incdp
lda i
cmpe #0h
brz .PercentEqu
.IsEqu:
lda #02h
sta PP
lda0 .PsValDP
sta DP
.CalcOperand:
lda i
sta0 .Buf4
cmpe #0a4h
brz .DOadd
cmpe #0dfh
brz .DoSpadd ;.Doadd
cmpe #0a5h
brz .DOdec
cmpe #0a6h
brz .DOmul
cmpe #0ech ;LC *
brz .DOmul
cmpe #0cdh
brz .DOmul
cmpe #0deh
brz .DOdiv
cmpe #0a7h
brz .DOdiv
cmpe #0d3h
brz .Pow_x_yD
cmpe #0d7h
brz .Pow_x_invyD
cmpe #0d5h
brz .NPRD
cmpe #0c9h
brz .NCRD
cmpe #0d0h
brz .DoPol
cmpe #0d6h
brz .DoRec
cmpe #0aeh
brz .DOadd
cmpe #0b4h
brz .REGD
cmpe #0b0h
brz .LRCnterInp
cmpe #0a1h
brz .Doexp2
cmpe #20h
brz .DOand
cmpe #21h
brz .DOor
cmpe #22h
brz .DOxnor
cmpe #23h
brz .DOxor
br .MarkDP2
.P3DPX:
call .P3dataToZ
lda #0h
sta PP
call .Z_trans_R
br .GetY
.P3DPY:
call .P3dataToZ
lda #0h
sta PP
call .Z_trans_Y
br .GetOPC
.DOadd:
;call .GetDataLimit10
lda #0h
sta PP
call Addition
br .MarkDP2
.DoSpadd:
lda #0h
sta PP
lda0 SignX
adda SignY
anda #01h
sta0 .Buf1
lda #0h
sta0 SignY
sta0 SignX
lda #0h
sta PP
call Addition
lda0 .Buf1
sta0 SignZ
br .MarkDP2
.DOdec:
;call .GetDataLimit10
lda #0h
sta PP
call Subtration
br .MarkDP2
.DOmul:
lda #0h
sta PP
call Multiplation
;call .Carry
br .MarkDP2
.DOdiv:
lda #0h
sta PP
call Division
lda #>StateFlag
sta PP
lda StateFlag
anda #08h
brz .MarkDP2
call GetInt
lda #0h
sta PP
;call .Carry
br .MarkDP2
.Doexp2:
call .Expp2
br .MarkDP2
.Pow_x_yD:
lda #0h
sta PP
call .Pow_x_y
call .CKNear_1
br .MarkDP2
.Pow_x_invyD:
lda #0h
sta PP
call .Y_trans_Z
call .X_trans_Y
call .Z_trans_X
call .Pow_x_invy
br .MarkDP2
.DOand:
call LogicAnd
br .MarkDP2
.DOor:
call LogicOr
br .MarkDP2
.DOxnor:
call LogicXnor
br .MarkDP2
.DOxor:
call LogicXor
br .MarkDP2
.DoPol:
call .POL
call .Z_trans_X
br .MarkDP2
.DoRec:
call .REC
br .MarkDP2
.NPRD:
lda #0h
sta PP
call .NPR ;NPR
br .MarkDP2
.NCRD:
lda #0h
sta PP
call .NCR ;NCR
br .MarkDP2
.REGD:
call .X_trans_LRX
call .Y_trans_LRY
call .ChkOverExp50
lda0 ErrorFlag
cmpe #0h
brnz .MarkDP2
call .LRY_trans_Y
call .Y_trans_X
call .ChkOverExp50
lda0 ErrorFlag
cmpe #0h
brnz .MarkDP2
call .LRX_trans_X
call .LRY_trans_Y
lda #01h
sta PP
lda StateFlag
anda #07h
cmpe #01h
brz .DoLin
cmpe #02h
brz .DoLog
cmpe #03h
brz .DoExp
cmpe #04h
brz .DoPwr
cmpe #05h
brz .DoInv
cmpe #06h
brz .DoQuad
br .MarkDP2
;;;;----------------------------------------
.LRCnterInp:
lda #>StateFlag
sta PP
lda StateFlag
anda #40h
cmpe #40h
brz .SDCnterInp
lda #03h
sta PP
lda #0h
sta DP
.SimeCK:
lda i
cmpe #0h
brz .D0lrSimeCnt
incdp
br .SimeCK
.D0lrSimeCnt:
decdp
lda i
sta DP
lda #02h
sta PP
lda i
cmpe #0b0h
brnz .SimeERROR
call .Y_trans_X
call .SimeCounter
call .I_trans_Z
br .MarkDP2
.SDCnterInp:
call .X_trans_I
call .X_trans_LRX
call .Y_trans_LRY
call .LRY_trans_Y
call .Y_trans_X
call .ClrY
lda0 SignX
sta0 SignY
lda #01h
sta0 OperandY+6
lda0 SignX
cmpe #01h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -