📄 flofloor.asm
字号:
;********************FLOFLOOR********************
;本程序实现标准浮点数取整FLOOR(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:FLOOR(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,两重堆栈。
;说明: 用户需自行指定 AARGB4,AARGB7,DARGB1,DARGB2
IFNDEF FLOOR1
#DEFINE FLOOR1
FLOFLOOR
CLRF AARGB2 ; test for zero argument
MOVF AEXP,W
BTFSC STATUS,Z
RETLW 0x00
MOVF AARGB0,W
MOVWF AARGB3 ; save mantissa
MOVF AARGB1,W
MOVWF AARGB4
MOVLW .127 ; computed unbiased exponent
SUBWF AEXP,W
MOVWF DARGB2
BTFSC DARGB2,MSB
GOTO FLOOR24ZERO
SUBLW 0x10-1
MOVWF DARGB1 ; save number of zero bits in DARGB1
MOVWF DARGB2
BTFSC DARGB2,LSB+3 ; divide by eight
GOTO FLOOR24MASKH
FLOOR24MASKL
MOVLW 0x07 ; get remainder for mask pointer
ANDWF DARGB1,F
MOVLW LOW FLOOR24MASKTABLE
ADDWF DARGB1,F
MOVLW HIGH FLOOR24MASKTABLE
BTFSC STATUS,C
ADDLW 0x01
MOVWF PCLATH
INCF DARGB1,W
CALL FLOOR24MASKTABLE ; access table for mask
ANDWF AARGB1,F
BTFSS AARGB0,MSB ; if negative, round down
RETLW 0x00
MOVWF AARGB7
MOVF AARGB4,W
SUBWF AARGB1,W
BTFSS STATUS,Z
GOTO FLOOR24RNDL
RETLW 0x00
FLOOR24RNDL
COMF AARGB7,W
MOVWF DARGB2
INCF DARGB2,W
ADDWF AARGB1,F
BTFSC STATUS,Z
INCF AARGB0, F
BTFSS STATUS,Z ; has rounding caused carryout?
RETLW 0x00
RRF AARGB0,F
RRF AARGB1,F
INCFSZ AEXP,F ; check for overflow
RETLW 0x00
GOTO SETFOV
FLOOR24MASKH
MOVLW 0x07 ; get remainder for mask pointer
ANDWF DARGB1,F
MOVLW LOW FLOOR24MASKTABLE
ADDWF DARGB1,F
MOVLW HIGH FLOOR24MASKTABLE
BTFSC STATUS,C
ADDLW 0x01
MOVWF PCLATH
INCF DARGB1,W
CALL FLOOR24MASKTABLE ; access table for mask
ANDWF AARGB0,F
CLRF AARGB1
BTFSS AARGB0,MSB ; if negative, round down
RETLW 0x00
MOVWF AARGB7
MOVF AARGB4,W
SUBWF AARGB1,W
BTFSS STATUS,Z
GOTO FLOOR24RNDH
MOVF AARGB3,W
SUBWF AARGB0,W
BTFSS STATUS,Z
GOTO FLOOR24RNDH
RETLW 0x00
FLOOR24RNDH
COMF AARGB7,W
MOVWF DARGB2
INCF DARGB2,W
ADDWF AARGB0,F
BTFSS STATUS,C ; has rounding caused carryout?
RETLW 0x00
RRF AARGB0,F
RRF AARGB1,F
INCFSZ AEXP,F
RETLW 0x00
GOTO SETFOV ; check for overflow
FLOOR24ZERO
BTFSC AARGB0,MSB
GOTO FLOOR24MINUSONE
CLRF AEXP
CLRF AARGB0
CLRF AARGB1
RETLW 0x00
FLOOR24MINUSONE
MOVLW 0x7F
MOVWF AEXP
MOVLW 0x80
MOVWF AARGB0
CLRF AARGB1
RETLW 0x00
;----------------------------------------------------------------------------------------------
; table for least significant byte requiring masking, using pointer from
; the remainder of the number of zero bits divided by eight.
FLOOR24MASKTABLE
MOVWF PCL
RETLW 0xFF
RETLW 0xFE
RETLW 0xFC
RETLW 0xF8
RETLW 0xF0
RETLW 0xE0
RETLW 0xC0
RETLW 0x80
RETLW 0x00
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -