#ifndef included_f32tosingle
 
#define included_f32tosingle
 
#include "pushpop.z80"
 
 
 
f32tosingle:
 
;convert an IEEE-754 binary32 to this library's "single" format.
 
;HL points to the input, BC is where to output
 
  call pushpop
 
 
 
;no matter what, the bottom 16 bits can be the same
 
  ld d,b
 
  ld e,c
 
  ld a,(hl)
 
  ldi
 
  or (hl)
 
  ldi
 
  ld c,a    ;the OR of the bottom two bytes. Needed for NaN vs. Inf
 
  ld a,(hl)
 
  inc hl
 
  ld h,(hl)
 
 
 
;first, check for special values
 
  add a,a
 
  ld l,a
 
  ld a,h
 
  adc a,a
 
  jr z,f32tosingle_return_0
 
  inc a
 
  jr z,f32tosingle_inf_NaN
 
;carry is the new sign
 
  rr l
 
 
 
;AL needs to be written to DE
 
  ex de,hl
 
  ld (hl),e
 
  inc hl
 
  ld (hl),a
 
  ret
 
 
 
f32tosingle_inf_NaN:
 
;if C is 0 and L is 0, then it is inf, else NaN
 
  rr h
 
  cp c
 
  jr nz,+_
 
  cp l
 
  jr nz,+_
 
;  add a,$40
 
  .db $F6     ;\  this branch becomes:
 
_:            ; |    or $C6   ;set's bit 7, which is what we want
 
  add a,$40   ;/     ld b,b   ;might cause issues on eZ80
 
  sla h
 
 
 
f32tosingle_return_0:
 
  rra
 
  ld (de),a
 
  inc de
 
  xor a
 
  ld (de),a
 
  ret
 
 
 
 
 
#endif