📄 muad32.asm
字号:
BTFSC STATUS,Z
INCF BARGB1,F
BTFSC STATUS,Z
INCF BARGB0,F
AOK32 MOVF BARGB3,W
ADDWF AARGB3,F
MOVF BARGB2,W
BTFSC STATUS,C
INCFSZ BARGB2,W
ADDWF AARGB2,F
MOVF BARGB1,W
BTFSC STATUS,C
INCFSZ BARGB1,W
ADDWF AARGB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF AARGB0,F
BTFSC TEMP,MSB
GOTO ACOMP32
BTFSS STATUS,C
GOTO NRMRND4032
RRF AARGB0,F ; shift right and increment EXP
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
INCFSZ AEXP,F
GOTO NRMRND4032
GOTO SETFOV32
ACOMP32 BTFSC STATUS,C
GOTO NRM4032 ; normalize and fix sign
COMF AARGB3,F
COMF AARGB2,F ; negate, toggle sign bit and
COMF AARGB1,F ; then normalize
COMF AARGB0,F
INCF AARGB3,F
BTFSC STATUS,Z
INCF AARGB2,F
BTFSC STATUS,Z
INCF AARGB1,F
BTFSC STATUS,Z
INCF AARGB0,F
MOVLW 0x80
XORWF SIGN,F
GOTO NRM32
; 32位浮点数左规格式化
NRM3232
NRM32 CLRF TEMP ;指数减小量清0
MOVF AARGB0,W ;高字节=0?
BTFSS STATUS,Z
GOTO NORM3232
MOVF AARGB1,W ;是,则移8位
MOVWF AARGB0
MOVF AARGB2,W
MOVWF AARGB1
CLRF AARGB2
BSF TEMP,3 ;指数减小量加8
MOVF AARGB0,W ;再次检测高字节=0?
BTFSS STATUS,Z
GOTO NORM3232
MOVF AARGB1,W ;是,则移8位
MOVWF AARGB0
CLRF AARGB1
BCF TEMP,3 ;指数减小量加8
BSF TEMP,4
MOVF AARGB0,W ;如果高字节=0, 则结果=0
BTFSC STATUS,Z
GOTO RES032
NORM3232 MOVF TEMP,W
SUBWF EXP,F
BTFSS STATUS,Z
BTFSS STATUS,C
GOTO SETFUN32
BCF STATUS,C ;清进位位
NORM3232A BTFSC AARGB0,MSB ;如果MSB=1,则格式化完成
GOTO FIXSIGN32
RLF AARGB2,F ;否则,左移并
RLF AARGB1,F ;将EXP-1
RLF AARGB0,F
DECFSZ EXP,F
GOTO NORM3232A
GOTO SETFUN32 ;如果 EXP=0 则发生下溢
FIXSIGN32 BTFSS SIGN,MSB
BCF AARGB0,MSB ;结果为正则清除MSB
RETLW 0
RES032 CLRF AARGB0 ;结果为0
CLRF AARGB1
CLRF AARGB2
CLRF AARGB3
CLRF EXP
RETLW 0
NRM4032 CLRF TEMP ; clear exponent decrement
MOVF AARGB0,W ; test if highbyte=0
BTFSS STATUS,Z
GOTO NORM4032
MOVF AARGB1,W ; if so, shift 8 bits by move
MOVWF AARGB0
MOVF AARGB2,W
MOVWF AARGB1
MOVF AARGB3,W
MOVWF AARGB2
CLRF AARGB3
BSF TEMP,3 ; increase decrement by 8
MOVF AARGB0,W ; test if highbyte=0
BTFSS STATUS,Z
GOTO NORM4032
MOVF AARGB1,W ; if so, shift 8 bits by move
MOVWF AARGB0
MOVF AARGB2,W
MOVWF AARGB1
CLRF AARGB2
BCF TEMP,3 ; increase decrement by 8
BSF TEMP,4
MOVF AARGB0,W ; test if highbyte=0
BTFSS STATUS,Z
GOTO NORM4032
MOVF AARGB1,W ; if so, shift 8 bits by move
MOVWF AARGB0
CLRF AARGB1
BSF TEMP,3 ; increase decrement by 8
MOVF AARGB0,W ; if highbyte=0, result=0
BTFSC STATUS,Z
GOTO RES032
NORM4032 MOVF TEMP,W
SUBWF EXP,F
BTFSS STATUS,Z
BTFSS STATUS,C
GOTO SETFUN32
BCF STATUS,C ; clear carry bit
NORM4032A BTFSC AARGB0,MSB ; if MSB=1, normalization done
GOTO NRMRND4032
RLF AARGB3,F ; otherwise, shift left and
RLF AARGB2,F ; decrement EXP
RLF AARGB1,F
RLF AARGB0,F
DECFSZ EXP,F
GOTO NORM4032A
GOTO SETFUN32 ; underflow if EXP=0
NRMRND4032 BTFSC FPFLAGS,RND
BTFSS AARGB2,LSB
GOTO FIXSIGN32
BTFSS AARGB3,MSB ; round if next bit is set
GOTO FIXSIGN32
INCF AARGB2,F
BTFSC STATUS,Z
INCF AARGB1,F
BTFSC STATUS,Z
INCF AARGB0,F
BTFSS STATUS,Z ; has rounding caused carryout?
GOTO FIXSIGN32
RRF AARGB0,F ; if so, right shift
RRF AARGB1,F
RRF AARGB2,F
INCF EXP,F
BTFSC STATUS,Z ; check for overflow
GOTO SETFOV32
GOTO FIXSIGN32
SETFUN32 BSF FPFLAGS,FUN ; set floating point underflag
BTFSS FPFLAGS,SAT ; test for saturation
RETLW 0xFF ; return error code in WREG
MOVLW 0x01 ; saturate to smallest floating
MOVWF AEXP ; point number = 0x 01 00 00 00
CLRF AARGB0 ; modulo the appropriate sign bit
CLRF AARGB1
CLRF AARGB2
RLF SIGN,F
RRF AARGB0,F
RETLW 0xFF ; return error code in WREG
SETFOV32 BSF FPFLAGS,FOV ; set floating point underflag
BTFSS FPFLAGS,SAT ; test for saturation
RETLW 0xFF ; return error code in WREG
MOVLW 0xFF
MOVWF AEXP ; saturate to largest floating
MOVWF AARGB0 ; point number = 0x FF 7F FF FF
MOVWF AARGB1 ; modulo the appropriate sign bit
MOVWF AARGB2
RLF SIGN,F
RRF AARGB0,F
RETLW 0xFF ; return error code in WREG
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -