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

📄 fract.asm

📁 这是用台湾KingB 8位单片机开发的科学计算器程序
💻 ASM
字号:
.include "CAL_MACRO.h"

     		  .area fraction_code(code)
;Input:OperandX
;Output:Denominator=S,Numerator=B     		  
Fract::
                  call    X_Trans_FractBuf
                  call    .X_trans_Z
                  call    GetInt
                  call    .Z_trans_Y
                  call    .X_trans_S
                  call    Subtration
                  call    .Z_trans_X
                  lda	  #OperandZ
	          sta     Addr1
	          call	  CheckData
	          lda	  DpCount
	          ora	  Temp2
	          brz     FractRet
        	  
1$:
                  call    .ClrY
                  lda     #6
                  sta     PointY
                  lda     #99h
                  sta     OperandY+6
                  sta     OperandY+5
                  sta     OperandY+4
                  lda	  #OperandX
		  sta0	  Addr1
		  lda	  #OperandY
		  sta0	  Addr2		
		  lda	  #07h
		  sta0	  DpCount
		  call	  CompareData
		  lda0	  Temp1
		  cmpe    #0 
		  brz     FractRet
                  call    .ClrY
                  lda     #7
                  sta     PointY
                  lda     #99h
                  sta     OperandY+6
                  sta     OperandY+5
                  sta     OperandY+4
                  lda     #09
                  sta     OperandY+3
                  lda	  #OperandX
		  sta0	  Addr1
		  lda	  #OperandY
		  sta0	  Addr2		
		  lda	  #07h
		  sta0	  DpCount
		  call	  CompareData
		  lda0	  Temp1
		  cmpe    #0 
		  brz     FractRet
		  call    .S_trans_X
		  call    .ClrY
		  lda     #8
                  sta     PointY
                  lda     #99h
                  sta     OperandY+6
                  sta     OperandY+5
                  sta     OperandY+4
                  sta     OperandY+3
                  lda	  #OperandX
		  sta0	  Addr1
		  lda	  #OperandY
		  sta0	  Addr2		
		  lda	  #07h
		  sta0	  DpCount
		  call	  CompareData
		  lda0	  Temp1
		  cmpe    #0 
		  brz     FractRet
		  call    .S_trans_X
                  call    .ClrY
                  lda     #9
                  sta     PointY
                  lda     #99h
                  sta     OperandY+6
                  sta     OperandY+5
                  sta     OperandY+4
                  sta     OperandY+3
                  lda     #09h
                  sta     OperandY+2
                  lda	  #OperandX
		  sta0	  Addr1
		  lda	  #OperandY
		  sta0	  Addr2		
		  lda	  #07h
		  sta0	  DpCount
		  call	  CompareData
		  lda0	  Temp1
		  cmpe    #0 
		  brz     FractRet
		  call    .S_trans_X
                  call    .ClrY
                  lda     #10
                  sta     PointY
                  lda     #99h
                  sta     OperandY+6
                  sta     OperandY+5
                  sta     OperandY+4
                  sta     OperandY+3
                  sta     OperandY+2
                  lda	  #OperandX
		  sta0	  Addr1
		  lda	  #OperandY
		  sta0	  Addr2		
		  lda	  #07h
		  sta0	  DpCount
		  call	  CompareData
		  lda0	  Temp1
		  cmpe    #0 
		  brz     FractRet
                    
2$:
                  call    .S_trans_X
                  lda0    SignX
                  sta0    SignT
                  lda     #0
                  sta0    SignX
                  call    X_Trans_Tmp     ;Keep input value
                  call   .X_trans_R       ;R=|X|                  
                  call   .Put_1_to_OperandX
                  call   .X_trans_S       ;FD=S=1
                  call   .ClrY
                  call   .Y_trans_Buf     ;Prev_FD(Buf)=0
                  call    .R_trans_Z
                  call    GetInt
                  call   .Z_trans_Y
                  call   .R_trans_X                  
                  call	  LineUp	
		  lda	  #OperandX
		  sta0	  Addr1
		  lda	  #OperandY
		  sta0	  Addr2		
		  lda	  #07h
		  sta0	  DpCount
		  call	  CompareData
		  lda0	  Temp1
		  cmpe    #0               ;X==Y
		  brnz    FractLoop
		  call    .Z_trans_B
		  br      EndFract
FractLoop:
                  
                  call   .R_trans_Z
                  call   GetInt                     
                  call   .Z_trans_Y
                  call   .R_trans_X                  
                  call   Subtration
                  call   .Z_trans_X
                  call   .ReciX
                  call   .Z_trans_R      ;R=Z
                  call    S_Trans_BZ
                  ;call   .R_trans_Z
                  call   GetInt                  
                  call   .S_trans_X      ;X=FD  (FD->Temp)
                  call   .Z_trans_Y      ;Y=(int)Z
                  call   Multiplation
                  call   .Z_trans_X      ;X=FD*(int)Z
                  call   .Buf_trans_Y    ;Y=Prev_FD
                  call   Addition
                  call   .Z_trans_S      ;FD=FD*(int)Z+Prev_FD;
                  Call    BZ_Trans_Buf
                  call   Tmp_Trans_X
                  call   .S_trans_Y      
                  call   Multiplation
                  call   .Z_trans_Y
                  call   Put_05_to_OperandX
                  call   Addition        ;compute Numerator
                  call   GetInt        
                  call  .Z_trans_X       ;FN=(int)(input*FD+0.5)
                  call  .Z_trans_B       ;FN->B
;                  
                  call  .S_trans_Y       ;FD(S)->Y
                  call   Division
                  call   .Z_trans_Y
                  call   Tmp_Trans_X
                  call   Subtration
                  call   .Z_trans_X
                  lda    #0
                  sta0   SignX
                  call  .ClrY
                  lda    #1
                  sta0   OperandY+6
                  lda    #13
                  sta0   PointY       ;Y=1E-13=10^(-13)
                  call	 LineUp	
		  lda	 #OperandX
		  sta0	 Addr1
		  lda	 #OperandY
		  sta0	 Addr2		
		  lda	#07h
		  sta0	DpCount
		  call	CompareData
		  lda0	Temp1
		  cmpe   #2               ;X<Y
		  brz   EndFract
		  call  .R_trans_Z
		  call   GetInt                  
		  call  .Z_trans_Y
		  call  .R_trans_X
		  call  Subtration
		  call  .Z_trans_X        ;Z-(int)Z
		  lda   #0
		  sta0  SignX
		  call  .ClrY
                  lda   #1
                  sta0  OperandY+6
                  lda   #5
                  sta0   PointY       ;Y=1E-5=10^(-5)
                  call	LineUp	
		  lda	#OperandX
		  sta0	Addr1
		  lda	#OperandY
		  sta0	Addr2		
		  lda	#07h
		  sta0	DpCount
		  call	CompareData
		  lda0	Temp1
		  cmpe  #2
		  brnz   FractLoop       
                  
EndFract:                  
                  
                  lda   #>Sign_s
                  sta   PP
                  lda0  SignT
                  sta   Sign_s                             
                  lda   #0
                  sta   PP
                  call  .S_trans_Y
                  call  .B_trans_X
                  call   Division
                  call	.Carry		;-----
                  call  .Z_trans_Y
                  call  FractBuf_Trans_X 
                  call	.X_trans_Z
                  call	.Carry
                  call	.Z_trans_X 
                  call	LineUp	
		  lda	#OperandX
		  sta0	Addr1
		  lda	#OperandY
		  sta0	Addr2		
		  lda	#05h
		  sta0	DpCount
		  call	CompareData
		  lda0	Temp1
		  cmpe  #0
		  brnz  FractRet  
                  ret                        		  
FractRet:
                  call    .ClrX
		  call    .X_trans_B
		  call    .X_trans_S
		  ret                  
;x=0.5                  
Put_05_to_OperandX:
	         call	.ClrX
		 lda     #1
		 sta0    PointX
		 lda	#05h
		 sta0	OperandX+6			
		 ret	
.if 0		 
;Input:OperandZ			
;Output:OperandZ
GetInt:
                 lda0    PointZ
                 ora     #0
                 brz     EndGetInt
                 cmpe    #0x80
                 brc     EndGetInt
                 call    DelPoint
EndGetInt:                 
                 ret
                 
DelPoint::	
		lda	#>PointY
		sta	PP	
		lda	#0eh
		sta	PointY
		lda	#OperandZ+6
		sta	DP	
		lda	PointZ
		cmpe	PointY
		brc	ClearPointEven
		lda0    PointZ
		sta0    PointY
ClearPointEven:	
		lda0	PointY
		ora     #0
		brz     EndClearPoint
		deca
		sta0	PointY		
		lda	i
		anda	#0xf0
		sta	i
		
ClearPointOdd:
                lda0	PointY
		ora     #0
		brz     EndClearPoint
		deca
		sta0	PointY		
                lda	i
		anda	#0x0f
		sta	i  
		decdp		
		br      ClearPointEven
EndClearPoint:		
                ;lda     #0
                ;sta0    PointZ
		ret
.endif                 
S_Trans_BZ:
                lda    #>Sign_s
                sta0   .PXPP                
                lda    #<Sign_s
                sta0   .PXDP  
                lda    #>SignBz
                sta0    .PYPP
                lda    #<SignBz
                sta0   .PYDP
                call   .CopyData           
                ret                 
                
BZ_Trans_Buf:
                lda    #>SignBz
                sta0   .PXPP                
                lda    #<SignBz
                sta0   .PXDP  
                lda    #>Sign_buf
                sta0    .PYPP
                lda    #<Sign_buf
                sta0   .PYDP
                call   .CopyData           
                ret        
.TransFract::     		  
		    
 		  call	.B_trans_Y 		  
 		  call	.ClrX
 		  call	Subtration
 		  lda0	SignZ
 		  cmpe	#0h 		  
 		  brz	.EndFract
 		  call	.B_trans_X
                  call	.B_trans_Z
                  lda	#0h
                  sta0	OperandZ+7
                  call  CheckOutData
                  call	.Z_trans_B                   
                  call	.S_trans_Y
                  call	.S_trans_Z
                  lda	#0h
                  sta0	OperandZ+7
                  call  CheckOutData
                  call	.Z_trans_T	;z_s 
                  call	Division
                  call	.Z_trans_Buf 
                  lda0	.KeyPos
                  cmpe	#31h
                  brz	.Y_beyond_X  
                  lda	#>.SetFlag
                  sta	PP
                  lda	.SetFlag
                  anda	#30h
                  cmpe	#30h
                  brz	.Y_beyond_X                                                         
                  call	.S_trans_Y
                  call	.B_trans_X
                  lda	#0h
                  sta0	SignY
                  call  Subtration
                  lda0	SignZ
                  cmpe	#01h
                  brz  .Y_beyond_X                                  
                  call	Mod                    
                  call	.X_trans_Z
                  lda	#0h
                  sta0	OperandZ+7
                  call  CheckOutData                              
                  call	.Z_trans_B
                  call	.T_trans_S	
                  br	.EndFraction
                 	
.Y_beyond_X:                                                                           
  		  call	.T_trans_S	
.EndFraction:  		
		  call	.I_trans_Z
		  lda0	SignT
		  sta0	SignZ	
		  br	.EnDtrans
.EndFract:	
		  call	.I_trans_Z
.EnDtrans:		  	    
		  ret                                                     

⌨️ 快捷键说明

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