.global fp4816_to_float fp4816_to_float: ; fp4816_t (int64) r18:r25 ; return: float r22:r25 ; ; work: float r12:r15 ; exp r17 push r17 push r16 push r15 push r14 push r13 push r12 eor r15, r15 eor r14, r14 eor r13, r13 eor r12, r12 cp r18, r1 cpc r19, r1 cpc r20, r1 cpc r21, r1 cpc r22, r1 cpc r23, r1 cpc r24, r1 cpc r25, r1 breq _exit ldi r17, 0x2f ; 47d ; value < 0 : SIGN=1, value * -1 sbrs r25, 7 rjmp _l1 ldi r16, 0x80 or r15, r16 com r25 com r24 com r23 com r22 com r21 com r20 com r19 com r18 ldi r16, 0x01 add r18, r16 adc r19, r1 adc r20, r1 adc r21, r1 adc r22, r1 adc r23, r1 adc r24, r1 adc r25, r1 _l1: ; exponent bestimmen tst r25 brne _l2 mov r25, r24 mov r24, r23 mov r23, r22 mov r22, r21 mov r21, r20 mov r20, r19 mov r19, r18 eor r18, r18 ldi r16, 0x08 sub r17, r16 rjmp _l1 _l2: mov r16, r25 andi r16, 0x80 brne _l3 clc rol r18 rol r19 rol r20 rol r21 rol r22 rol r23 rol r24 rol r25 dec r17 rjmp _l2 _l3: ; Mantisse schreiben mov r12, r23 mov r13, r24 mov r14, r25 ldi r16, 0x7F and r14, r16 ; exponent schreiben add r17, r16 ldi r16, 0x80 sbrc r17, 0 or r14, r16 lsr r17 or r15, r17 _exit: movw r22, r12 movw r24, r14 pop r12 pop r13 pop r14 pop r15 pop r16 pop r17 ret