; ======================================================================
; CS617 CHAPTER 03 - NATIVE EXPANDED FP -> COMPACT F32
;
; Donor: exact OM-52C E6AF..E735
; Historical contract:
;   input : $10-$18 expanded 9-byte native FP
;   output: $15-$18 compact 32-bit FP
;
; The compact form contains:
;   $15-$17  six BCD significant digits
;   $18      mantissa/exponent sign bits + binary exponent magnitude
;
; This conversion is presentation support, not a new arithmetic primitive.
; ======================================================================
BCD_TO_F32:
        SBW     $10,$10
        SBCW    $17,$10
        JR      Z,BTF_ZERO

; rounding
        LD      $12,$13
        AN      $12,&H0F
        SBC     $12,&H05
        JR      C,BTF_RANGE
        LDW     $0,&H0010
        SBW     $2,$2
        ADBM    $13,$SZ,4

; normalisation
        SBC     $16,&H10
        JR      C,BTF_RANGE
        DIDM    $16,4
        LDW     $0,$SY
        ADBW    $17,$SZ

; exponent range
        SBC     $18,&H02
        JR      Z,BTF_ZERO
        SBC     $18,&H07
        JR      Z,BTF_ZERO

; sign of exponent
BTF_RANGE:
        LD      $10,$17
        LD      $11,$SX
        SBC     $18,$SY
        JR      Z,BTF_EXPBCD
        SBC     $18,&H06
        JR      Z,BTF_EXPBCD
        LD      $10,$SX
        SBB     $10,$17

; exponent BCD -> binary
BTF_EXPBCD:
        SBC     $10,&H10
        JR      C,BTF_EXPDONE
        SBB     $10,&H10
        AD      $11,&H0A,JR BTF_EXPBCD

BTF_EXPDONE:
        AD      $11,$10
        SBC     $11,&H40
        JR      NC,BTF_ZERO

; signs
        SBC     $18,$SY
        JR      NZ,BTF_SIGN2
        OR      $11,&H40,JR BTF_PACK

BTF_SIGN2:
        SBC     $18,&H05
        JR      NZ,BTF_SIGN3
        OR      $11,&H80,JR BTF_PACK

BTF_SIGN3:
        SBC     $18,&H06
        JR      NZ,BTF_PACK
        OR      $11,&HC0

BTF_PACK:
        LD      $18,$11
        DIUM    $13,5
        DIUM    $13,5
        DIUM    $13,5
        RTN

BTF_ZERO:
        SBW     $15,$15
        SBW     $17,$17
        RTN
