Code : Tout sélectionner
;********************************************************************
; variables:
; NBFLOAT contient le nombre flottant en hexa 32bits
; NBHEX le résultat sur 48 bits
; 2 variables temporaire pour boucles I et J
;
; PRÉCISION sur 8 bits
; Gestion erreur:
; 0 ok, 1 nb infini et NaNs, 2 > 48bits
;
; 144 octets de mémoire
; ******************************************
; Exemple de conversion:
;- 0.987654321 -> 0.98765430 en 479 cycles
;- 32600.9876543 -> 32600.9874022 en 643 cycles
;*********************************************************************
FLOAT_HEXA_32
MOVLW 0X5
MOVWF N_2+3
MOVWF NBHEX+3
MOVLW 0XF5
MOVWF N_2+2 ; charge la base de 1/2 sur 8bits
MOVWF NBHEX+2 ; et le résultat le 1 sous entendu
MOVLW 0XE1
MOVWF N_2+1
MOVWF NBHEX+1
MOVLW 0X00
MOVWF N_2
MOVWF NBHEX
BCF STATUS,C
RLCF NBFLOAT
RLCF NBFLOAT+1
RLCF NBFLOAT+2 ; on récupéré le signe
RLCF NBFLOAT+3
BTFSS STATUS,C
BRA EXPO ; si négatif
MOVLW '-'
MOVWF SIGNE
;********************** Gestion erreur ******************************
EXPO MOVLW 0XFE ;2^e -1 e= exposant sur 8 bits
SUBWF NBFLOAT+3,W
BNZ EXPO1
RETLW 1 ; NB infinie ou NaNs (pas un nombre)
;********************** Calcul exposant *****************************
EXPO1 MOVLW 0X7F
SUBWF NBFLOAT+3,W
MOVWF I
;******************** Calcul mantisse *****************************
MOVLW .22 ;
MOVWF J
SIGNIF0 BCF STATUS,C
RRCF N_2+3
RRCF N_2+2 ; base /2
RRCF N_2+1
RRCF N_2
BCF STATUS,C
RLCF NBFLOAT
RLCF NBFLOAT+1
RLCF NBFLOAT+2 ; rotation de la mantisse
BTFSS STATUS,C
BRA SIGNIF1
MOVF N_2,W
ADDWF NBHEX,F
MOVF N_2+1,W
ADDWFC NBHEX+1,F ;NBNHEX=NBHEX+base
MOVF N_2+2,W
ADDWFC NBHEX+2,F
MOVF N_2+3,W
ADDWFC NBHEX+3,F
SIGNIF1 DECFSZ J
BRA SIGNIF0
BTFSC I,7
BRA MANTISSE_N
;*********************** Flottant > 0 *******************************
MANTISSE_P
BCF STATUS,C
RLCF NBHEX
RLCF NBHEX+1
RLCF NBHEX+2
RLCF NBHEX+3
RLCF NBHEX+4
RLCF NBHEX+5 ;NBHEX * exposant
BTFSC STATUS,C
RETLW 2 ;dépassement 48bits
DECFSZ I
BRA MANTISSE_P
RETLW 0 ; retour sans erreur
;*********************** Flottant < 0 *******************************
MANTISSE_N
NEGF I
MANTISSE_N0 BCF STATUS,C
RRCF NBHEX+4
RRCF NBHEX+3 ;NBHEX / exposant
RRCF NBHEX+2
RRCF NBHEX+1
RRCF NBHEX
DECFSZ I
BRA MANTISSE_N0
RETLW 0 ; pas erreur
Nous avons fait le tour des conversions dans ce sens la, Il va de soit pour faire du flottant->ascii il faudra modifier la conversion hexa-ascii 16bits et la passer sous 48bits et prévoir un arrondi et pose de la virgule.mais la je vous laisse un peu faire
A+
