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

📄 calctools.asm

📁 这是用台湾KingB 8位单片机开发的科学计算器程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:

;/subrutine name : calc.asm
;/user bady      : HE84770
;/fast clock     : 4Mhz
;/slow clock     : 32768khz
;/programer      : Alton
		        

			  			      
;-------------------------------------------
       			.area   calc_data(data,ABS) 
       			.org	0xd6
Length   		EQU	0x07
.PointFlag::
.Hbuf::
.M_exp_Y::		.ds	1
.Lbuf::
.RandCnt::		.ds	1
			.area   calc_data1(data,abs) 
       			.org	0x64
.DmsCount::	 
;.KeyBuf1::
.PFlag::		.ds	1
.PYPP::
.PSDP::			.ds	1	
.INDP::			.ds	1
.CommaFlag::
.IFlag::		.ds	1
.STDP::			.ds	1
.FractDP::
.Buf1::			.ds	1
.InputDP::
.Buf2::       		.ds	1	
.LRcnt::		
.Buf3::
.SymFlag::		.ds	1
.SFDP::			.ds	1
.Buf4::

.Cnter::
.DecFlag::		.ds	1

.ErrorCnt::
.FractTrsCnt::
.ReleaseCnt::
.TFlag::		.ds	1
.Cnter2::
.PXPP::
.BeforePari::		.ds	1
.RCFlag::
;.KeyBuf::
.AfterPari::		.ds	1
	
.Temp::			.ds	1
.CntIndex::		.ds	1
.FormulaFlag::
.PosFlag::		.ds	1
.KeyPos::		.ds	1
.DataBuf::		.ds	2			 
.FractCount::
.DispFlag::
.ZeroFlag::
.PXDP::			.ds	1


.PYDP::			.ds	1

.Counter::		.ds	1
.SimeFlag::
.Data::			.ds	1
		.area   calc_data3(data,abs)
		.org	0x13a
.CntByte		EQU	0x08		;07
Sign_buf::		.ds	1
Point_buf::		.ds	1		
Operand_buf::		.ds	.CntByte
Sign_b::		.ds	1	
Point_b::		.ds	1
Operand_b::		.ds	.CntByte
Sign_s::		.ds	1
Point_s::		.ds	1
Operand_s::		.ds	.CntByte
Sign_r::		.ds	1
Point_r::		.ds	1
Operand_r::		.ds	.CntByte

Sign_i::		.ds	1
Point_i::		.ds	1
Operand_i::		.ds	.CntByte		
		        .area   calc(code)            			             
;--------------(.percent_add)----------------------                    
.Percent_Add::
                        
                        call    .Y_trans_Buf                       
                        call    Addition
                        call    CheckOutData                                    
                        call    .Z_trans_X
                        call    .Buf_trans_Y
                        call    Division
                        call    CheckOutData
                        call    .Z_trans_X      
                        call    .Put_100_to_OperandY
                        call    Multiplation    
                        ret
;-------------------(.percent_dec       )-------------                          
.Percent_Dec::                  
                        call    .Y_trans_Buf
                        call    Subtration
                        call    CheckOutData                                     
                        call    .Z_trans_X
                        call    .Buf_trans_Y
                        call    Division
                        call    CheckOutData
                        call    .Z_trans_X      
                        call    .Put_100_to_OperandY
                        call    Multiplation    
                        ret
;-------------------(.percent_mul       )-------------                   
.Percent_Mul::
  
                        call    Multiplation
                        call    CheckOutData
                        call    .Z_trans_X 
                        call    .Put_100_to_OperandY
                        call    Division
                        ret
                         
;-------------------(   .percent_div    )-------------
.Percent_Div::
                         
                         
                        call    Division
                        call    CheckOutData
                        call    .Z_trans_X 
                        call    .Put_100_to_OperandY
                        call    Multiplation
                        
                        ret
                        
;-----------------------(	ReciX 1/X      )----------------------
.ReciX::
			call	.X_Squ	
 			call	.ClrX
 			call	.Put_1_to_OperandX 				
			call	Division
			ret
;-----------------------(	Log	    )----------------------
.Log::
			call	Ln 
 			call	.Z_trans_Buf
 			call	.ClrZ
 			call	.ClrY
 			call	.ClrX
 			call	.Put_10_to_OperandX 
 			call	Ln
 			call	.Z_trans_Y	
 			call	.Buf_trans_X 			
 			call	Division	
 			ret

;-----------------------(        X ^2       )-----------------------
.XSqu::
		        call	.X_Squ
		        call	Multiplation
		        ret
;-----------------------(        X ^3       )-----------------------
.XCube::
			call	.X_trans_Buf
		        call	.X_Squ
		        call	Multiplation
		        call	.Buf_trans_X
		        call	.Z_trans_Y
		        call	Multiplation
		        ret

;-------------------------------------------
.Factorial::		
			lda0	ErrorFlag		;N!
			brnz	.EndFactorial
			lda	#0h
			sta0	OperandX+7
			call	.X_trans_Z
			call	CheckOutData
			call	.Z_trans_X						
			call	.X_trans_R			 					 					
			lda0	SignX
			cmpe	#01h
			brz	.DataError
			lda0	PointX
			cmpe	#0h
			brnz	.DataError
			lda0	OperandX+5
			cmpe	#0h
			brnz	.DataError
			call	.ClrY
			lda	#70h		;Max69!
			sta0	OperandY+6
			lda	#0h
			sta	PP
			call    Subtration
			lda0	SignZ
			cmpe	#0h
			brz	.DataError			 			
			call	.R_trans_X
			lda	#0h
			sta	PP
			call	.ClrY
			lda	#08h
			sta0	OperandY+6
			call    Multiplation
			lda	#01h
			sta	PP
			lda0	OperandZ+5
			sta	.M_bcdbuf
			lda0	OperandZ+6
			sta	.M_bcdbuf+1
			call	.Bcd2Hex
			lda     #^(Order_tab)
                	sta0    TableC+2
                	lda     #@(Order_tab)
               	 	sta0    TableC+1
               		lda     #<(Order_tab)
               		sta0    TableC
               		lda0	TableC+1
               		addc	.M_hexbuf 
               		sta0	TableC+1
               		lda0	TableC
               		addc	.M_hexbuf+1
               		sta0	TableC
               		brnc	.GetDataTable	
 			lda0	TableC+1
 			inca
 			sta0	TableC+1
.GetDataTable: 		
			lda0	TableC+2
			sta	TPP
			lda0	TableC+1
			sta	TPH
			lda0	TableC 
			sta	TPL
			lda	#>OperandZ
			sta	PP
			lda	#<OperandZ
			sta	DP
			lda	#07h
			sta0	.NumCnt
.SaveTbData:			
			lda0	.NumCnt
			cmpe	#0h
			brz	.EndSaveTbData
			ldv
			sta 	i
			incdp
			lda0	.NumCnt
			deca
			sta0	.NumCnt
			br	.SaveTbData
.EndSaveTbData:
			ldv
			sta0	PointZ	
			lda	#>Sign_r
			sta	PP
			lda	Sign_r
			sta0	SignZ		
			br	.EndFactorial					 							
.DataError:
			lda	#01h
			sta0	ErrorFlag
.EndFactorial:			
			ret	
;--------------------------------------------						
.InputCheck::		
			lda	#0h
			sta0	ErrorFlag			
			call	CheckOutData
			lda0	PointZ
			cmpe	#0h
			brnz	.ErrData
			lda0	OperandZ+5
			cmpe	#0h
			brnz	.ErrData
			lda0	OperandZ+6
			cmpe	#70h
			brnc	.ErrData
			ret
			 
.ErrData:
			lda	#01h
			sta0	ErrorFlag
 			ret
;-------------------------------------------
.CKNear_1::
			
			call	.ClrY
			lda	#99h
			sta0	OperandY
			sta0	OperandY+1
			sta0	OperandY+2
			sta0	OperandY+3			
			sta0	OperandY+4
			sta0	OperandY+5
			call	.Z_trans_B			 			
			call	.Z_trans_X
			lda 	#OperandX
			sta0	Addr1
			call	CheckData
			lda0	DpCount
			cmpe	#0ch
			brz	.StartCK
			cmpe	#0dh
			brz	.ModifyOp6R
			cmpe	#0eh
			brz	.ModifyOp6
			br	.NoModify	
.StartCK:			
			lda	#0h			
			sta0	OperandX+7			
			sta0	SignX
			sta0	SignY
			lda0	PointX
			sta0	PointY			
			call	Subtration
			lda0	SignZ
			cmpe	#0h
			brnz	.NoModify
			call	.B_trans_Z
			call	.DelPoint
			call	.Z_trans_X
			call	.ClrY
			lda	#01h
			sta0	OperandY+6
			call	.Z_trans_X
			call	Addition
			br	.EndCKNear_1
.ModifyOp6R:
						
			lda0	OperandX+6
			anda	#0f0h
			sta0	OperandX+6
			br	.StartCK
.ModifyOp6:
						
			lda	#0h			
			sta0	OperandX+6
			br	.StartCK			
			
				
.NoModify:
			call	.B_trans_Z
			
			 			 
.EndCKNear_1:
			call	.Z_trans_X
			ret			
;----------------(POL)----------------------                
.POL::
	
		call	.X_trans_S	
		call	.Y_trans_Buf
		call	.XSqu
		call	.Z_trans_B
		call	.Buf_trans_X	
		call	.XSqu
		call	.Z_trans_Y
		call	.B_trans_X
		lda	#0h
		sta0	OperandX+7
		sta0	OperandY+7
		call    Addition	
		call	.Z_trans_X
		call	Squ
		call	.GetDpCount
		lda0	DpCount
		cmpe	#0h
		brz	.Pow_x_y_Err
		call	.Carry 
		call	.Z_trans_X		
		call	.X_TO_E	
						
		call	.Buf_trans_X				
		call	.X_trans_R
		call	.S_trans_Y
		call	.Y_trans_I
		call	.GetDpCountY
		lda0	DpCount
		cmpe	#0h
		brz	.Degree90
		call	Division		
		call	.Z_trans_X
		call	.Atan
		call	.R_trans_Y
		call	.I_trans_X
		call	.CheckQuadrant	
		call	.CheckAsinRrdDegre
		call	.Carry 
.SavetoF:		
		call	.Z_trans_X		 
		call	.X_TO_F
		call	.E_TO_Z
		call	.Z_trans_I
		ret
.Degree90:
		call	.ClrZ
		lda	#90h
		sta0	OperandZ+6
		br	.SavetoF		
;----------------(REC)----------------------                
.REC::		
		lda0	SignX
		cmpe	#0h
		brnz	.Pow_x_y_Err
		call	.X_trans_S	;S
		call	.Y_trans_Buf
		call	.Buf_trans_X
		call	.X_trans_Z
		call	.CheckRrdDegre
		call	Sin
		call	.Z_trans_Y
		call	.S_trans_X
		lda     #0h
		sta     PP
		call    Multiplation
		call	.Carry 
		call	.Z_trans_X
		call	.X_TO_F
		
		call	.Buf_trans_X
		call	.X_trans_Z
		call	.CheckRrdDegre
		call	Cos
		call	.Z_trans_Y
		call	.S_trans_X
		lda     #0h
		sta     PP
		call    Multiplation
		call	.Carry 
		call	.Z_trans_X
		call	.X_TO_E
		ret
;-------------------------------------------
.CKPowx_y::
		call	X_SatDataCnt_Trans                          
		call	.Y_trans_T
		call	.Y_trans_X
		call	Fract
		call	.S_trans_X
		call	.ClrY
		lda	#02h
		sta0	OperandY+6
		call	Mod
		call    MoveData
		lda0	OperandX+6
		cmpe	#0h
		brnz	.EndCKPowx_y
		lda	#01h
		sta0	ErrorFlag
.EndCKPowx_y:		
		ret				
;----------------(X^Y)----------------------                  
.Pow_x_y::      
		call	.IsX_Zero
		brnz	1$
		call	.IsY_Zero
		brz	.Pow_x_y_Err
		call	ClearBuffer
		lda	#0
		sta0	.DataBuf
		ret
1$:
		lda0	SignX
		sta0	.DataBuf
		lda0	SignX
		cmpe	#01h
		brnz	.Normal_x_y
		lda0	PointY
		cmpe	#0h
		brnz	.Pow_x_y_Err
		lda	#0h
		sta0	SignX
		lda0	OperandY+6
		anda	#01h
		brnz	.Normal_x_y
		lda	#0h
		sta0	.DataBuf
.Normal_x_y:					 
                call    .Y_trans_Buf
                call    Ln
                call	CheckOutData
                call    .Z_trans_X
                call    .Buf_trans_Y
                call    Multiplation
                call	CheckOutData
                call    .Z_trans_X
                call    Ex
                lda0	.DataBuf
                sta0	SignZ
                lda	#0h
                sta0	OperandZ+7
                call    CheckOutData
                call    check_Z_carry
                br	.EndPow_x_y
.Pow_x_y_Err:
                lda	#01h
                sta0	ErrorFlag
               
.EndPow_x_y:              
                ret
;----------------(X^1/Y)--------------------          
.Pow_x_invy::    		
		call	.IsX_Zero
		brnz	1$
		call	ClearBuffer
		lda	#0
		sta0	.DataBuf
		ret
1$:
		lda0	SignX
		sta0	.DataBuf
		cmpe	#01h
		brnz	.Nomalx_invy
		lda0	OperandY+6
		anda	#01h
		brnz	.ChkY
.x_inverr:		
		lda	#01h
		sta0	ErrorFlag
		br	.EndPow_x_invy
.ChkY:
		lda0	PointY
		cmpe	#0h
		brnz	.x_inverr		
.Nomalx_invy:		
		lda	#0h
		sta0	SignX			                        
                call    .Y_trans_Buf
                call    Ln                            
                call    .Z_trans_X               
                call    .Buf_trans_Y
                call    Division                            
                call    .Z_trans_X
                call    Ex  
                lda0	.DataBuf
                sta0	SignZ          
.EndPow_x_invy:
                ret
                
.IsX_Zero:
		lda	OperandX
		ora	OperandX+1
		ora	OperandX+2
		ora	OperandX+3
		ora	OperandX+4
		ora	OperandX+5
		ora	OperandX+6
		ret
.IsY_Zero:
		lda	OperandY
		ora	OperandY+1
		ora	OperandY+2
		ora	OperandY+3
		ora	OperandY+4
		ora	OperandY+5
		ora	OperandY+6
		ret
;----------------(X^Y)---------------------- 
.Pow_10_X::      
		call	.X_trans_Buf
		lda0	SignX
		cmpe	#01h
		brnz	.Dopow_10_x
		lda	#0h
		sta0	SignX
		call	.ClrY		
		lda	#01h
		sta0	OperandY+5
		call	Subtration
		lda0	SignZ	
		cmpe	#0h
		brnz	.Dopow_10_x
		call	.ClrZ
		br	.EndPow_10_X
.Dopow_10_x:		   		   
 		call	.Buf_trans_Y 		               
              	call	.ClrX
		lda	#10h
	   	sta0	OperandX+6	   	 
	   	call	.Pow_x_y
.EndPow_10_X:	   	
	   	ret
	   	
;----------------(X^1/3)--------------------                
.Pow_x_inv3::
		call	.ClrY
		lda	#03h
	   	sta0	OperandY+6
	   	lda	#0h
	   	sta0	PointY
	   	sta0	SignY	   		   	
	   	call	 .Pow_x_invy
	   	lda0	.DataBuf
	   	sta0	SignZ
	   	ret            
;-------------------------------------------                
check_Z_carry::
		lda0	SignZ
		sta0 	.DataBuf
		lda	#0h
		sta0	SignZ
                lda0    PointZ                
                cmpe    #3
                brc     1$
                lda0	OperandZ+1
                anda	#0fh
                brnz	1$               
                ret
1$:
                call    .Z_trans_X
                lda     OperandX+Length-2
                anda	#0f0h
                cmpe    #50h 
                brc     2$              
                ret
2$:
                lda     #0
                sta     OperandX+Length-1
                sta     OperandX+Length-2                
                call    .ClrY
                lda     #01h                ;#05h
                sta     OperandY+Length-3                
                lda     PointX
                sta     PointY
                call    Addition                
                lda0	.DataBuf
                sta0	SignZ
                ret
;-----------------------(       EXP  X*10^Y )------------------------
.Expp::			
			call	.X_trans_Y
			call	.Put_1_to_OperandX			 
.Expp2::			
                        
                        lda	#>.M_bcdbuf
                        sta	PP
                        lda0     OperandY+Length-1
                        sta     .M_bcdbuf
                        call    .bcdtohex
                        lda     .M_bcdbuf
                        sta0     .M_exp_Y
                        lda	#0h
                        sta	PP
			lda0	OperandY+5
			cmpe	#0h
			brnz	.ErrFlag
			lda0	PointY
			cmpe	#0h
			brnz	.ErrFlag						
                        lda0    SignY
                        cmpe    #0
                        brnz    .18$
                        lda0     PointX
                        suba    .M_exp_Y
                        sta     .M_exp_Y
                        br      .28$
.18$:
                        lda     PointX
                        adda    .M_exp_Y
                        sta     .M_exp_Y
.28$:
                        call    .X_trans_Z

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -