⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 postfixvalume.asm

📁 这是用台湾KingB 8位单片机开发的科学计算器程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;/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 + -