'===========================================================================
' Subject: MBF TO IEEE CONVERSION             Date: 10-25-97 (10:49)       
'  Author: Mark Junker                        Code: QB, QBasic, PDS        
'  Origin: mjs@prg.hannover.sgh-net.de      Packet: BINARY.ABC
'===========================================================================
'here is a source that converts the MBF (Microsoft Binary Format) to the  
'local floating point representation (mostly IEEE). This may be needed by  
'some programmers working with old file formats ...

' MBF.BAS - written by Mark Junker (mjs@prg.hannover.sgh-net.de)
'
' Shows how numbers in the MBF format can be decoded.
' QB/PDS source. PB uses must use MKMD$ and MKMS$

DECLARE SUB PrintHexStr (a$)
DECLARE SUB PrintMBF (a$)
DEFINT A-Z

CLS

PRINT "nr", "HEX dump : "; "base", "exp", "val"
FOR a# = -1 TO 3 STEP .25
'FOR a# = -3 TO 3
  ' create MBF number:
  ' - MKDMBF$() for 8-byte values
  ' - MKSMBF$() for 4-byte values
  h$ = MKDMBF$(a#)
  PRINT a#,
  CALL PrintHexStr(h$)
  PRINT ; " : ";
  CALL PrintMBF(h$)
  PRINT
NEXT

END

SUB PrintHexStr (a$)
  ' print HEX dump
  FOR a = LEN(a$) TO 1 STEP -1
    PRINT RIGHT$(HEX$(256 + ASC(MID$(a$, a, 1))), 2);
  NEXT
END SUB

SUB PrintMBF (a$)
  ' split all bytes for data into several bytes
  DIM b(0 TO 7)
  isNull = -1
  FOR a = 1 TO LEN(a$)
    b(a - 1) = ASC(MID$(a$, a, 1))
    isNull = isNull AND (b(a - 1) = 0)
  NEXT

  IF isNull THEN
    ' special handling for NULL
    vExp = 0
    vBase# = 0
    vBaseSign = 0

  ELSEIF LEN(a$) = 4 THEN
    ' single MBF value

    ' 76543210 76543210 76543210 76543210
    ' eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm
    '
    ' e = exponent + 129
    ' s = sign of value
    ' m = mantissa

    vExp = b(3)

    vBase# = b(0) + b(1) * 256& + (b(2) AND &H7F) * 65536
    vBase# = vBase# / ((256 ^ 3) / 2)

    IF b(2) AND &H80 THEN vBaseSign = -1 ELSE vBaseSign = 1
    vExp = vExp - 129
  ELSE
    ' double MBF value

    ' 76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210
    ' eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm
    '
    ' e = exponent + 129
    ' s = sign of value
    ' m = mantissa

    vExp = b(7)

    vBase# = 0
    FOR a = 0 TO 5
      vBase# = b(a) * 256 ^ a
    NEXT
    vBase# = vBase# + (b(6) AND &H7F) * 256 ^ 6
    vBase# = vBase# / ((256 ^ 7) / 2)

    IF b(6) AND &H80 THEN vBaseSign = -1 ELSE vBaseSign = 1
    vExp = vExp - 129
  END IF

  if isNull=0 then
    ' if not NULL then add implied 1 to mantissa
    vBase# = 1 + vBase#
  end if

  PRINT vBase#, vExp,

  IF isNull THEN
    result# = 0
  ELSE
    result# = (vBase# * 2 ^ vExp) * vBaseSign
  END IF

  PRINT result#;
END SUB
