Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

#ifndef included_f24tof16
#define included_f24tof16

f24tof16:
;convert an f24 float to an IEEE-754 binary16 format.
;Input: AHL is the input float
;Output: HL is the f16 float
;Destroys: AF, C

  ; check for special values
  add a,a
  jr z,f24tof16_return_0_noA
  inc a
  inc a
  jr z,f24tof16_return_infnan
  rr c    ; save the sign
; subtract 63 and add 15 to the sign, net -48
; Note that exponent is currently doubled plus two
  sub 98
  jr c,f24tof16_return_0
  rra
  cp 31
  jr nc,f24tof16_return_inf
  add hl,hl
  rla
  add hl,hl
  rla
  ; now get the sign
  add a,a
  rl c
  rra
  ; we'll round
  sla l
  ld l,h
  ld h,a
  ret nc
  inc hl
  ret

f24tof16_return_infnan:
  ld a,%11111000
  rra
  ld c,a  ; sign and exponent set
  ld a,h
  or l
  ld l,a  ; if the input was NaN, this will be non-zero, else zero
  ld h,c
  ret

f24tof16_return_inf:
  rl c
  ld a,%11111000
  rra
  ld h,a
  ld l,0
  ret

f24tof16_return_0:
  xor a
  rl c
f24tof16_return_0_noA:
  ld l,a
  rra     ; shift the sign back in
  ld h,a
  ret
#endif