Output of file : BIN_F.ASM contained in archive : MATHASM.ZIP
BIN_F PROC NEAR
;*************************************************************
; converts an ASCII decimal number to
; binary floating point
; Input--DI points to points to end of ASCII
; string; SI points to start
;*************************************************************
PUSH SI
PUSH DI
; convert ASCII mantissa to integer
CALL BIN32 ;integer in DX:AX
OR BX,BX ;did it convert OK?
JZ BINF1 ;if error
JMP BINF9 ;jump
; check for zero result
BINF1: MOV BX,DX
OR BX,AX
JNZ BINF2 ;finished if zero
JMP BINF8
; get sign
BINF2: PUSH CX ;save count of decimal places
SUB CX,CX ;assume positive sign
OR DX,DX
JNS BINF3
DEC CX ;negative sign
NOT AX ;make it positive
NOT DX
; convert 32-bit integer to f.p
BINF3: MOV BX,152 ;initial exponent=24+bias
OR DH,DH ;if DH
JZ BINF4 ;is not zero
XCHG AH,AL ;shift right 8 bits
XCHG DL,AH
XCHG DH,DL ;integer now in DL:AX:DH
; normalize
BINF4: OR DL,DL
JS BINF5 ;if no sign bit
SHL DH,1 ;shift integer left
RCL AX,1
RCL DL,1
DEC BX ;and decrement exponent
JMP BINF4
BINF5: MOV DH,BL ;exponent in DH
; ;restore sign
OR CX,CX
JNZ BINF6
AND DL,07FH ;make sign positive
BINF6: PUSH AX ;save result--ASCII mantissa
PUSH DX
; check for exponent
SUB AX,AX ;zero exponent
MOV DX,AX
CMP SI,DI ;if at end of ASCII string
JAE BINF7 ;no ASCII exponent
MOV BL,[SI] ;next unconverted char in BL
OR BL,32 ;convert to lower case
CMP BL,"e" ;if not an "E"
JNE BINF7 ;there is no exponent
; convert exponent
INC SI ;point to next char
CALL BIN32 ;convert exponent to binary
OR BX,BX ;check for error
JNZ BINF9
; check exponent range
OR DX,DX ;DX should be zero if exponent
JZ BINF7 ;positive and less than 2^16
CMP DX,-1 ;or -1 if negative
JNE BINF9 ;jump if out of range
; apply exponent to mantissa
BINF7: MOV BX,AX ;signed exponent in BX
POP DX ;retrieve mantissa in DX:AX
POP AX
POP CX ;count of decimal places
JZ BINF8 ;finished if exponent is zero
; compute exponent power of 10
PUSH AX ;save mantissa while we
PUSH DX ;compute exponent
MOV IM2,BX ;integer exponent in IM2
MOV SI,OFFSET IM2 ;address in SI
MOV IM1,0 ;floating point 10
MOV IM1+2,8420H ;in IM1
MOV DI,OFFSET IM1 ;address in DI
CALL IPOWER_F ;compute exponent
POP [DI]+2 ;retrieve mantissa and
POP [DI] ;put it in IM1
OR BX,BX ;check for errors
JNZ BINF9

MOV IM2,AX ;put exponent in IM2
MOV IM2+2,DX
; multiply mantissa x exponent
CALL MUL_F
OR BX,BX ;check for errors
JNZ BINF9
; exit with result in DX:AX
BINF8: SUB BX,BX ;BX=0--status OK
JMP EXIT
BINF9: MOV BX,1 ;exit with error
JMP EXIT
BIN_F ENDP

### 3 Responses to “Category : Assembly Language Source CodeArchive   : MATHASM.ZIPFilename : BIN_F.ASM”

1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/