📄 int3224.asm
字号:
;**********************************************************************************************
; 32位浮点数转化为24位整形数
;----------------------------------------------------------------------------------------------
IFNDEF INT32241
#DEFINE INT32241
INT3224
MOVF EXP,W ;检测是否为0
BTFSC STATUS,Z
RETLW 0x00
MOVF AARGB0,W ;保护符号位
MOVWF SIGN
BSF AARGB0,MSB ;MSB=1
MOVLW .127+D'23' ;去掉偏移
SUBWF EXP,F
BTFSS EXP,MSB
GOTO SETIOV3224
COMF EXP,F
INCF EXP,F
MOVLW 8 ; do byte shift if EXP >= 8
SUBWF EXP,W
BTFSS STATUS,C
GOTO TSHIFT3224
MOVWF EXP
RLF AARGB2,F ; rotate next bit for rounding
MOVF AARGB1,W
MOVWF AARGB2
MOVF AARGB0,W
MOVWF AARGB1
CLRF AARGB0
MOVLW 8 ; do another byte shift if EXP >= 8
SUBWF EXP,W
BTFSS STATUS,C
GOTO TSHIFT3224
MOVWF EXP
RLF AARGB2,F ; rotate next bit for rounding
MOVF AARGB1,W
MOVWF AARGB2
CLRF AARGB1
MOVLW 8 ; do another byte shift if EXP >= 8
SUBWF EXP,W
BTFSS STATUS,C
GOTO TSHIFT3224
MOVWF EXP
RLF AARGB2,F ; rotate next bit for rounding
CLRF AARGB2
MOVF EXP,W
BTFSS STATUS,Z
BCF STATUS,C
GOTO SHIFT3224OK
TSHIFT3224 MOVF EXP,W ; shift completed if EXP = 0
BTFSC STATUS,Z
GOTO SHIFT3224OK
SHIFT3224 BCF STATUS,C
RRF AARGB0,F ; right shift by EXP
RRF AARGB1,F
RRF AARGB2,F
DECFSZ EXP,F
GOTO SHIFT3224
SHIFT3224OK BTFSC FPFLAGS,RND
BTFSS AARGB2,LSB
GOTO INT3224OK
BTFSS STATUS,C
GOTO INT3224OK
INCF AARGB2,F
BTFSC STATUS,Z
INCF AARGB1,F
BTFSC STATUS,Z
INCF AARGB0,F
BTFSC AARGB0,MSB ; test for overflow
GOTO SETIOV3224
INT3224OK BTFSS SIGN,MSB ; if sign bit set, negate
RETLW 0
COMF AARGB0,F
COMF AARGB1,F
COMF AARGB2,F
INCF AARGB2,F
BTFSC STATUS,Z
INCF AARGB1,F
BTFSC STATUS,Z
INCF AARGB0,F
RETLW 0
IRES03224 CLRF AARGB0 ; integer result equals zero
CLRF AARGB1
CLRF AARGB2
RETLW 0
SETIOV3224 BSF FPFLAGS,IOV ; set integer overflow flag
BTFSS FPFLAGS,SAT ; test for saturation
RETLW 0xFF ; return error code in WREG
CLRF AARGB0 ; saturate to largest two's
BTFSS SIGN,MSB ; complement 24 bit integer
MOVLW 0xFF
MOVWF AARGB0 ; SIGN = 0, 0x 7F FF FF
MOVWF AARGB1 ; SIGN = 1, 0x 80 00 00
MOVWF AARGB2
RLF SIGN,F
RRF AARGB0,F
RETLW 0xFF ;带错误码返回
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -