- #ifndef included_xtof64 
- #define included_xtof64 
-   
- #include "routines/rr64.z80" 
- #include "mov.z80" 
- #include "pushpop.z80" 
-   
- xtof64: 
- ;Inputs: 
- ;   HL points to the input extended-precision float 
- ;   BC points to where to output the result 
- ;Outputs: 
- ;   The extended-precision float is converted to a double (binary64) at BC. 
- ; 
-   
- ;bias is 1023, so 0x03FF is exponent of 0 
- ;sign is 1 bit 
- ;exponent is 11 bits 
- ;mantissa is 53 bits (top bit is implicit) 
- ; 
-   
-   call pushpop 
- xtof64_nopush: 
-   
-   ; The extended precision float has a 64-bit mantissa, so drop the bottom byte. 
-   inc hl 
-   
-   ; Move the remaining 7 bytes to our output 
-   ld d,b 
-   ld e,c 
-   call mov6 
-   ld a,(hl) 
-   ld (de),a 
-   
-   ; the next two bytes are the exponent and sign 
-   inc hl 
-   ld c,(hl) 
-   inc hl 
-   ld b,(hl) 
-   
-   ; Check if the input is a special number 
-   ld a,b 
-   add a,a 
-   or c 
-   jr z,xtof64_special 
-   
-   ;save the sign 
-   ld a,b 
-   res 7,b 
-   
-   ; make sure the exponent is not too small 
-   ld hl,-15362 
-   add hl,bc 
-   jr nc,xtof64_zero 
-   
-   ; make sure the exponent is not too big 
-   ld bc,-2045 
-   add hl,bc 
-   jr c,xtof64_inf 
-   
-   ; now we need to adjust the exponent 
-   ld bc,2046 
-   add hl,bc 
-   
-   ;now we shift the exponent down into the top bit of the mantissa 
-   ex de,hl 
-   rl (hl) 
-   rr d 
-   rr e 
-   rr (hl) 
-   
- ;now shift DE down 3 more bits into the old mantissa 
- ;final shift, shift the sign into E 
-   ld bc,6 
-   rr d \ rr e \ call rr56 \ add hl,bc 
-   rr d \ rr e \ call rr56 \ add hl,bc 
-   rla \ rr e \  call rr56 
-   ;need to potentially round up! 
-   jr nc,+_ 
-   dec c 
-   jr z,$+7 
-   inc (hl) 
-   inc hl 
-   jr z,$-5 
-   .db $FE 
-   inc e 
- _: 
-   inc c \ add hl,bc 
-   
- ;now write the top 7 bits of the exponent and the sign to the output 
-   ld (hl),e 
-   ret 
-   
- xtof64_special: 
-   ld a,(de) 
-   add a,a 
-   jr c,xtof64_inf 
-   jp p,xtof64_zero 
- xtof64_nan: 
- ;mantissa needs to be non-zero to encode NaN 
-   ld a,-1 
-   ex de,hl 
-   ld (hl),a 
-   inc hl 
-   ld (hl),a 
-   inc hl 
- ;  rl b 
- ;  rra 
-   ld (hl),a 
-   ret 
-   
- xtof64_inf: 
- ;carry is always set here 
- xtof64_zero: 
- ;carry is always reset here 
-   sbc a,a 
-   ex de,hl 
-   
-   inc hl 
-   and $F0 
-   ld (hl),a 
-   add a,a 
-   sbc a,a 
-   inc hl 
-   rl b 
-   rra 
-   ld (hl),a 
-   
- ; need to set mantissa to 0 
-   dec hl 
-   ld bc,$0600 
- _: 
-   dec hl 
-   ld (hl),c 
-   djnz -_ 
-   ret 
- #endif 
-