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

📄 base.asm

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

                 .area base_code(code,rel)                                              
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 
;         Public functions
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                 
                
;Base-10 -> Base-2 
;Input:OperandX   (Dec)        
;Output:OperandZ  (Bin)
Base_Dec2Bin::
           lda0  SignX
           sta0  SignTmp
           ora   #0
           brz   1$
           lda   #0
           sta0  SignX
           call  .X_trans_R
           call	 .ClrY
           lda	 #05h
	   sta0	 OperandY+5
	   lda	 #13h
	   sta0	 OperandY+6
	   call	 LineUp	
           lda	 #OperandX
	   sta	 Addr1
	   lda	 #OperandY
	   sta	 Addr2		
	   lda	 #07h
	   sta	 DpCount
	   call	 CompareData
	   lda   Temp1
	   cmpe  #2
           brz   0$
           lda   #1
           sta0  ErrorFlag
           br    3$
;OperandX<0           
0$:       
           call  .R_trans_X
           lda0  SignTmp
           sta0  SignX
           call	 .ClrY
           lda	 #10h
	   sta0	 OperandY+5
	   lda	 #24h
	   sta0	 OperandY+6
	   call  Addition
	   call  .Z_trans_X
	   br    2$
1$:	   
           call  .X_trans_R
           call	 .ClrY
           lda	 #05h
	   sta0	 OperandY+5
	   lda	 #12h
	   sta0	 OperandY+6
	   call	 LineUp	
           lda	 #OperandX
	   sta	 Addr1
	   lda	 #OperandY
	   sta	 Addr2		
	   lda	 #07h
	   sta	 DpCount
	   call	 CompareData
	   lda   Temp1
	   cmpe  #2
           brz   22$
           lda   #1
           sta0  ErrorFlag
           br    3$
22$:           
           call  .R_trans_X
2$:           
           call  Dec2Bin
3$:           
           ret           
           
;Base-10 -> Base-8    
;Input:OperandX   (Dec)        
;Output:OperandZ  (Oct)
Base_Dec2Oct::
           lda0  SignX
           sta0  SignTmp
           ora   #0
           brz   1$
           lda   #0
           sta0  SignX
           call  .X_trans_R
           call	 .ClrY
           lda	 #05h
	   sta0	 OperandY+2
           lda	 #36h
	   sta0	 OperandY+3
           lda	 #87h
	   sta0	 OperandY+4
	   lda	 #09h
	   sta0	 OperandY+5
	   lda	 #13h
	   sta0	 OperandY+6
	   call	 LineUp	
           lda	 #OperandX
	   sta	 Addr1
	   lda	 #OperandY
	   sta	 Addr2		
	   lda	 #07h
	   sta	 DpCount
	   call	 CompareData
	   lda   Temp1
	   cmpe  #2
           brz   0$
           lda   #1
           sta0  ErrorFlag
           br    2$
;OperandX<0           
0$:       
           call  .R_trans_X
           lda0  SignTmp
           sta0  SignX
           call	 .ClrY
           lda	 #10h
	   sta0	 OperandY+2
           lda	 #73h
	   sta0	 OperandY+3
           lda	 #74h
	   sta0	 OperandY+4
	   lda	 #18h
	   sta0	 OperandY+5
	   lda	 #24h
	   sta0	 OperandY+6
           call  Addition
	   call  .Z_trans_X
1$:	   
           call  Dec2Oct
2$:           
           ret
           
;Base-10 -> Base-16           
;Input:OperandX   (Dec)        
;Output:OperandZ  (Hex)
Base_Dec2Hex::
           lda0  SignX
           sta0  SignTmp
           call  CheckDecLimit
           lda0  ErrorFlag
           cmpe  #1
           brc   2$
           lda0  SignTmp
           ora   #0
           brz   1$
;OperandX<0           
0$:       
           lda0  SignTmp
           sta0  SignX
           call	 .ClrY
           lda	 #42h
	   sta0	 OperandY+2
           lda	 #94h
	   sta0	 OperandY+3
           lda	 #96h
	   sta0	 OperandY+4
	   lda	 #72h
	   sta0	 OperandY+5
	   lda	 #96h
	   sta0	 OperandY+6
	   call  Addition
	   call  .Z_trans_X
1$:	   
           call  Dec2Hex
2$:           
           ret           
           
;Input:OperandX   (Hex)        
;Output:OperandZ  (Bin)
Base_Hex2Bin::
           call  Base_Hex2Dec
           call  .Z_trans_X
           call  Base_Dec2Bin
           ret           
           
;Input:OperandX   (Hex)        
;Output:OperandZ  (Oct)
Base_Hex2Oct::
           call  Base_Hex2Dec
           call  .Z_trans_X
           call  Base_Dec2Oct
           ret           
           
;Input:OperandX    (Hex)       
;Output:OperandZ   (Dec)
Base_Hex2Dec::
           lda    #0
	   sta    PP
           call   CheckHexLimit
           lda0   ErrorFlag
           cmpe   #1
           brc    3$
           lda    #HEX_DIGITS
           sta0   BufferZ
	   lda    #@Hex2DecTab
	   sta    BufferZ+1
	   lda    #<Hex2DecTab
	   sta    BufferZ+2
	   call   HBO2DecBase
	   lda0   Buffer+3
	   anda   #0xf0
	   rorc
	   rorc
	   rorc
	   rorc
	   anda   #0x0f
	   cmpe   #8
	   brnc   3$
	   call  .Z_trans_X
	   call	 .ClrY
           lda	 #42h
	   sta0	 OperandY+2
           lda	 #94h
	   sta0	 OperandY+3
           lda	 #96h
	   sta0	 OperandY+4
	   lda	 #72h
	   sta0	 OperandY+5
	   lda	 #96h
	   sta0	 OperandY+6
	   call  Subtration
3$:        
           ret
           
;Input:OperandX    (Bin)       
;Output:OperandZ   (Oct)
Base_Bin2Oct::
           call  Base_Bin2Dec
           call  .Z_trans_X
           call  Base_Dec2Oct
           ret           

;Input:OperandX  (Bin)         
;Output:OperandZ (Hex)
Base_Bin2Hex::
           call  Base_Bin2Dec
           call  .Z_trans_X
           call  Base_Dec2Hex
           ret           
           
;Input:OperandX   (Bin)        
;Output:OperandZ  (Decimal)
Base_Bin2Dec::
           lda    #0
	   sta    PP
           call   CheckBinLimit
           lda0   ErrorFlag
           cmpe   #1
           brc    3$
           lda    #BIN_DIGITS
           sta0   BufferZ
	   lda    #@Bin2DecTab
	   sta    BufferZ+1
	   lda    #<Bin2DecTab
	   sta    BufferZ+2
	   call   HBO2DecBase
	   lda0   Buffer+2
	   anda   #0xf0
	   rorc
	   rorc
	   rorc
	   rorc
	   anda   #0x0f
	   cmpe   #1
	   brnc   3$
	   call  .Z_trans_X
	   call	 .ClrY
           lda	 #10h
	   sta0	 OperandY+5
	   lda	 #24h
	   sta0	 OperandY+6
	   call  Subtration
3$:        
           ret

;Input:OperandX  (Oct)         
;Output:OperandZ (Bin)
Base_Oct2Bin::
           call  Base_Oct2Dec
           call  .Z_trans_X
           call  Base_Dec2Bin
           ret           
           
;Input:OperandX (Oct)          
;Output:OperandZ (Hex)
Base_Oct2Hex::
           call  Base_Oct2Dec
           call  .Z_trans_X
           call  Base_Dec2Hex
           ret           
           
           
;Input:OperandX  (Oct)         
;Output:OperandZ (decimal)
Base_Oct2Dec::
           lda    #0
	   sta    PP
           call   CheckOctLimit
           lda0   ErrorFlag
           cmpe   #1
           brc    3$
           lda    #OCT_DIGITS
           sta0   BufferZ
	   lda    #@Oct2DecTab
	   sta    BufferZ+1
	   lda    #<Oct2DecTab
	   sta    BufferZ+2
	   call   HBO2DecBase
	   lda0   Buffer+2
	   anda   #0xf0
	   rorc
	   rorc
	   rorc
	   rorc
	   anda   #0x0f
	   cmpe   #4
	   brnc   3$
	   call  .Z_trans_X
	   call	 .ClrY
           lda	 #10h
	   sta0	 OperandY+2
           lda	 #73h
	   sta0	 OperandY+3
           lda	 #74h
	   sta0	 OperandY+4
	   lda	 #18h
	   sta0	 OperandY+5
	   lda	 #24h
	   sta0	 OperandY+6
	   call  Subtration
	   
3$:        
           ret           

           
;;Input:OperandX  (decimal)         
;Output:ErrorFlag
CheckDecLimit::
           call  .X_trans_R
           lda0  SignX
           ora   #0
           brz   0$
           lda   #0
           sta0  SignX
           call	 .ClrY
           lda	 #21h
	   sta0	 OperandY+2
           lda	 #47h
	   sta0	 OperandY+3
           lda	 #48h
	   sta0	 OperandY+4
           lda	 #36h
	   sta0	 OperandY+5
	   lda	 #49h
	   sta0	 OperandY+6
	   
           call	 LineUp	
           lda	 #OperandX
	   sta	 Addr1
	   lda	 #OperandY
	   sta	 Addr2		
	   lda	 #07h
	   sta	 DpCount
	   call	 CompareData
	   lda   Temp1
	   cmpe  #2
           brz   1$
           lda   #1
           sta0  ErrorFlag
           br    2$
0$:           
           call	 .ClrY
           lda	 #21h
	   sta0	 OperandY+2
           lda	 #47h
	   sta0	 OperandY+3
           lda	 #48h
	   sta0	 OperandY+4
           lda	 #36h
	   sta0	 OperandY+5
	   lda	 #48h
	   sta0	 OperandY+6
	   
           call	 LineUp	
           lda	 #OperandX
	   sta	 Addr1
	   lda	 #OperandY
	   sta	 Addr2		
	   lda	 #07h
	   sta	 DpCount
	   call	 CompareData
	   lda   Temp1
	   cmpe  #2
           brz   1$
           lda   #1
           sta   ErrorFlag
           br    2$
1$:
           call  .R_trans_X
2$:
           ret
           
;;Input:OperandX (Oct)          
;Output:ErrorFlag
CheckOctLimit::
           lda0  PointX
           cmpe  #(OCT_DIGITS+1)
           brnc  0$
           lda   #1
           sta0  ErrorFlag
0$:                      
           ret
           
;;Input:OperandX (Hex)          
;Output:ErrorFlag
CheckHexLimit::
           lda0  PointX
           cmpe  #(HEX_DIGITS+1)
           brnc  0$
           lda   #1
           sta0  ErrorFlag
0$:                      
           ret     
                            
;;Input:OperandX (Binary)          
;Output:ErrorFlag
CheckBinLimit::
           lda0  PointX
           ;cmpe  #(BIN_DIGITS+1)
           cmpe  #(BIN_DIGITS+1)
           brnc  0$
           lda   #1
           sta0  ErrorFlag
0$:                      
           ret  
              
;InputOperandX,OperandY (decimal)
;Input:MathOp=1 (decimal)
;Output:OperandZ  (decimal)         
LogicAnd::    
           lda   #1
           sta0  MathOp
           call  LogicMathOp
           ret
            
            
;InputOperandX,OperandY (decimal)
;Input:MathOp=2 (decimal)
;Output:OperandZ (decimal)          
LogicOr::
           lda   #2
           sta0  MathOp
           call  LogicMathOp
           ret           

;InputOperandX,OperandY (decimal)
;Input:MathOp=3 (decimal)
;Output:OperandZ  (decimal)         
LogicXor::
           lda   #3
           sta0  MathOp
           call  LogicMathOp
           ret           
           
;InputOperandX,OperandY (decimal)
;Input:MathOp=4 (decimal)
;Output:OperandZ  (decimal)         
LogicXnor::        
           lda   #4
           sta0  MathOp
           call  LogicMathOp   
           ret
            
;InputOperandX (decimal)
;Output:OperandZ (decimal)          
LogicNeg::
           call   .X_trans_Buf
           call   CheckDecLimit
           lda0   ErrorFlag
           cmpe   #1
           brc    2$

⌨️ 快捷键说明

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