;-------------------------tfp2sfp routine begins--------------------------+
; ROUTINE FOR CONVERSION FROM TEMPORARY TO SINGLE PRECISION
;
; from BLUEBOOK OF ASSEMBLY ROUTINES FOR IBM PC & XT.
;         page : 80
;
; NAME TFP2SFP
;
; FUNCTION: This routine conveerts from temporary binary floating point
; to single precision floating point.
;
; INPUT: Upon entry a number is stored in temporary binary floating point
; form in FPTEMP1.  The temporary binary floating point number has a 72-bit
; binary mantissa with 8 bits to the left of those for internal use, a
; signal byte, and a 16-bit two's complement binary exponent (See fig 5-2).
;
; OUTPUT: Upon exit a single precision floating point number is stored in
; SFPBUFF.  The single precision floating point number has a 24-bit binary
; mantissa, a sign bit, and an 8-bit exponent biased by 128 (See fig 5-3).
;
; REGISTERS USED:  AX and DX are modified.
;
; SEGMENTS REFERENCED:  Upon entry the data segment must contain the
; messages INTERNAL, OVERFLOW and UNDERFLOW, and storage for the temporary
; binary floating point number FPTEMP1 and the single precision floating
; point number SFPBUFF.
;
; ROUTINES CALLED:  STDSPACE, MESSOUT and HEX16OUT
;
; SPECIAL NOTES: Equates are used to shorten address fields.  This is a
; near procedure needed by FPIN.  Include the file FPCEQU_S at assembly.
;
; ROUTINE TO CONVERT FROM TEMP FLOATING POINT TO SINGLE PRECISION
; FLOATING POINT
;
tfp2sfp proc	near
;
; move mantissa
	mov	ax,fptemp1w4	; below word
	rcl	ax,1		; carry for roundup
	mov	ax,fptemp1w6	; low word
	adc	ax,0		; low word + carry
	mov	sfpbuffw0,ax	; put in place
	mov	dx,ax		; check for zero
;
	mov	ax,fptemp1w8
	or	dx,ax		; check this part too
	and	ax,007Fh	; just bottom 7 bits
	mov	sfpbuffw2,ax	; put in place
;
; move sign bit
	mov	al,fptemp1b10	; byte 10 is sign
	and	al,80h
	or	sfpbuffb2,al	; bit 7 is sign
;
; move exponent
	mov	ax,fptemp1w11	; 16-bit two's complement exponent
	cmp	ax,-128		; too low ?
	jl	ftp2sfp2	; error message
	cmp	ax,127		; too high ?
	jg	tfp2sfp3	; error message
;
	add	ax,80h		; bias
	cmp	dx,0		; was mantissa 0 ?
	jne	tfp2sfp
	mov	al,0		; then -128 exponent
;
tfp2sfp1
	mov	sfpbuffb3,al	; put biased byte back
;
; normal return
;
; show hex for debugging
	lea	si,internal	; point to message
	call	stdmessout	; display message
;
	mov	dx,sfpbuffw2	; upper word
	call	hex16out	; show it
;
	mov	dx,sfpbuffw0	; lower word
	call	hex16out	; show it
;
	call	stdspace	; skip a space
	clc
	ret			; return
;
; underflow error
tfp2sfp3:
	lea	si,underflow	; point to message
	jmp	tfp2sfp4
;
tfp2sfp4:
	call	stdmessout	; send message
	stc			; set carry
	ret			; return
;
tfp2sfp	endp
;-------------------------tfp2sfp routine ends---------------------------+

