⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 float.s,v

📁 用TCP/IP进行网际互连这本书得源代码,偶得,希望大家喜欢.推荐下载
💻 S,V
📖 第 1 页 / 共 2 页
字号:
head	1.1;access;symbols;locks	dls:1.1; strict;comment	@# @;1.1date	97.09.21.19.27.40;	author dls;	state Dist;branches;next	;desc@@1.1log@pre-3e code@text@|J. Test	3/81|floating point routines for Nu(MC68000)				|offsets in internal float structureSIGN	= 0				|signEXPT	= 2				|exponent (-127/+127)MANH	= 4				|high mantissaMANL	= 8				|low mantissa	.dataafloat:				|internal-a floating representationa_sign:	.word	0a_expt:	.word	0a_manh:	.long	0a_manl:	.long	0bfloat:				|internal-b floating representationb_sign:	.word	0b_expt:	.word	0b_manh:	.long	0b_manl:	.long	0lsum:				|storage for multiply	.word	0	.long	0			|high part of accumulated sum	.long	0			|low part of accumulated sum	.word	0	||convert external float to internal format|d0,d1 contain the external float|a0 points to afloat or bfloat|	.textetoi:	clrw	a0@@			|clear sign	tstl	d0			|test sign of external	bge	1$			|set sign 0(+), 1(-)	movw	#1,a0@@1$:	movl	d1,a0@@(MANL)		|save low 32 bits of mantissa	movl	d0,d1	andl	#0x7FFFFF,d1	orl	#0x800000,d1		|add hidden high order bit	movl	d1,a0@@(MANH)		|save high 1+23 bits of mantissa	swap	d0	asrl	#7,d0	andw	#0xFF,d0		|isolate exponent	bne	2$	clrl	a0@@			|zero sign, exponent,	clrl	a0@@(MANH)		|  high mantissa, and	clrl	a0@@(MANL)		|  low mantissa	rts2$:	subw	#128,d0			|convert from excess 0200	movw	d0,a0@@(EXPT)		|store converted value	rts				|done||convert internal format to external float|a0 points to afloat or bfloat|external float returned in d0,d1|	.textitoe:	clrl	d0	movw	a0@@(EXPT),d0		|get exponent	addw	#128,d0			|convert to excess 0200	bne	1$			|if exponent is zero	clrl	d1			|  clear d0,d1	rts				|  and return1$:	tstw	a0@@			|set sign	beq	2$			|sign bit 0(+), 1(-)	orw	#0x100,d02$:	swap	d0			|align sign and exponent	asll	#7,d0			|  in high part of d0	movl	a0@@(MANH),d1		|get high part of mantissa	bne	3$			|check for zero mantissa	clrl	d0			|if zero - clear sign and	rts				|  exponent and return3$:	andl	#0x7FFFFF,d1		|delete high order hidden bit	orl	d1,d0			|put high 23 bits of mantissa	movl	a0@@(MANL),d1		|put low 32 bits of mantissa	rts				|done||normalize internal float by adjusting exponent and|shifting  mantissa appropriately so 1/2 <= mnt < 1|a0 points to afloat or bfloat|	.textnormal:	jsr	offset			|determine amount to shift	addw	d0,a0@@(EXPT)		|adjust exponent	jsr	shift			|shift mantissa	rts||determine position of most significant bit of|mantissa in relation to normalized decimal point|a0 points to afloat or bfloat|d0 returns offset of msb from decimal point|	.textoffset:	moveq	#1,d0	movl	a0@@(MANH),d1		|check for high order bits	bne	2$	movl	a0@@(MANL),d1		|check low order bits	bne	1$	clrw	d0			|zero shift count	rts1$:	subw	#32,d0			|need to shift at least 232$:	subqw	#1,d0			|find most significant bit	asll	#1,d1	bcc	2$	addqw	#8,d0			|d0 contains exponent correction	rts||shift mantissa according to offset in d0|a0 points to afloat or bfloat|d0 contains shift count, <0 -> left shift, >0 -> right shift|on return, d1 = 0, d2,d3 have shifted mantissa|	.textshift:	clrl	d1	movl	a0@@(MANH),d2		|d2 = high part of mantissa	movl	a0@@(MANL),d3		|d3 = low part of mantissa	movw	d0,d1			|examine exponent correction	bmi	2$			|shift left	bne	1$			|shift right	rts				|no shift - return1$:	asrl	#1,d2			|shift entire mantissa	roxrl	#1,d3			|  right by one bit	subqw	#1,d1			|repeat until count	bne	1$			|  is zero	andl	#0xFFFFFF,d2		|zero top byte	bra	shifte			|return2$:	asll	#1,d3			|shift entire mantissa	roxll	#1,d2			|  left by one bit	addqw	#1,d1			|repeat until count	bne	2$			|  is zero	shifte:	movl	d2,a0@@(MANH)		|store high part of mantissa	movl	d3,a0@@(MANL)		|store low part of mantissa	rts				|done	||fetch floating arguments off stack|convert to internal format in afloat and bfloat|on return, a0 points to afloat, a1 points to bfloat|getargs:	movl	#bfloat,a1		|a1 points to bfloat	tstw	d0			|branch to 1$ for	bne	1$			|  indirect argument fetch	movl	a6@@(16),d0		|b-high	movl	a6@@(20),d1		|b-low	movl	a1,a0			|setup a0 for conversion	jsr	etoi			|convert b-arg to internal form	movl	a6@@(8),d0		|a-high	movl	a6@@(12),d1		|a-low	movl	#afloat,a0		|a0 points to afloat	jsr	etoi			|convert a-arg to internal form	rts1$:	movl	a6@@(12),d0		|b-high	movl	a6@@(16),d1		|b-low	movl	a1,a0			|setup a0 for conversion	jsr	etoi			|convert b-arg to internal form	movl	a6@@(8),a0		|a0 points to a-arg	movl	a0@@+,d0			|a-high	movl	a0@@,d1			|a-low	movl	#afloat,a0		|a0 points to afloat	jsr	etoi			|convert a-arg to internal form	rts		.globl	fltused	.textfltused:	rts				|simply define fltused||free exponent returning fractional value|	.globl	frexp	.textfrexp:	link	a6,#0	movl	#afloat,a0		|a0 points to afloat	movl	a6@@(8),d0		|a-high	movl	a6@@(12),d1		|a-low	movl	a6@@(16),a1		|place to return exponent	jsr	etoi			|convert to internal form	movw	a0@@(EXPT),d0		|get unbiased exponent	extl	d0			|  convert to long and	movl	d0,a1@@			|  return value	clrw	a0@@(EXPT)		|set exponent for fractional	jsr	itoe			|  value, convert for return	unlk	a6	rts||add/load exponent of float|	.globl	ldexp	.textldexp:	link	a6,#0	movl	#afloat,a0		|a0 points to afloat	movl	a6@@(8),d0		|a-high	movl	a6@@(12),d1		|a-low	jsr	etoi			|convert to internal form	movl	a6@@(16),d0		|add argument	addw	d0,a0@@(EXPT)		|  to exponent	jsr	itoe			|convert and return	unlk	a6	rts||separate integer/fractional parts of float|	.globl	_modf	.text_modf:	link	a6,#0	moveml	#0x3800,sp@@-		|save d2,d3,d4	movl	a6@@(8),d0		|a-high	movl	a6@@(12),d1		|a-low	movl	#afloat,a0		|a0 -> afloat = fractional	jsr	etoi			|  part on return	movl	#bfloat,a1		|a1 -> bfloat = integer part on return	movw	a0@@,a1@@			|copy signs	movw	a0@@(EXPT),d4		|if exponent > 0	bgt	1$			|  separate integer/fractional	movw	#-128,a1@@(EXPT)		|else integer part = 0	movl	a1,a0			|  convert integer part first	bra	modfe			|  no need to separate1$:	movw	d4,a1@@(EXPT)		|set integer exponent	clrw	a0@@(EXPT)		|set fractional exponent	cmpw	#56,d4			|if shift count is < 56	blt	2$			|  shift mantissa	movl	a0@@(MANL),a1@@(MANL)	|else move mantissa to integer	movl	a0@@(MANH),a1@@(MANH)	|  part and set fractional	movw	#-128,a0@@(EXPT)		|  part = 0	movl	a1,a0			|convert decimal part first	bra	modfe			|  on exit from modf2$:	moveq	#-8,d0			|shift mantissa left	jsr	shift			|  by 8 for alignment	clrl	d03$:	asll	#1,d3			|rotate d0<--d1<--d2<--d3	roxll	#1,d2			|  registers until shift	roxll	#1,d1			|  count = 0	roxll	#1,d0	subqw	#1,d4	bne	3$	movl	d3,a0@@(MANL)		|save fractional components	movl	d2,a0@@(MANH)		|  of mantissa	movl	d1,a1@@(MANL)		|save integer components	movl	d0,a1@@(MANH)		|  of mantissa	jsr	normal			|align fractional part	subqw	#8,a0@@(EXPT)		|  and adjust exponent	movl	a1,a0			|align integer part at	jsr	offset			|  decimal point without	jsr	shift			|  altering exponentmodfe:	movl	a6@@(16),a1		|get pointer argument	jsr	itoe			|convert integer part	movl	d0,a1@@+			|  store in location	movl	d1,a1@@			|  given in argument	movl	#afloat,a0		|convert fractional	jsr	itoe			|  part and return	moveml	sp@@+,#0x1C	unlk	a6	rts||convert floating value to fixed 32-bit integer|	.globl	fix	.textfix:	link	a6,#0	moveml	#0x3000,sp@@-		|save d2,d3	movl	a6@@(8),d0		|d0 = high part of float	movl	a6@@(12),d1		|d1 = low order part	movl	#afloat,a0		|a0 points to afloat	jsr	etoi			|convert to internal format	tstw	a0@@(EXPT)		|test exponent	bgt	1$			|if exponent is less	clrl	d0			|  than or equal to zero	bra	fixe			|  return zero1$:	moveq	#-8,d0			|shift mantissa left	jsr	shift			|  by 8 for alignment	movw	a0@@(EXPT),d1		|(note: after shift d1 = 0)	clrl	d0			|clear d02$:	asll	#1,d3			|rotate d0<--d2<--d3	roxll	#1,d2			|  registers until exponent	roxll	#1,d0			|  count is exhausted	subqw	#1,d1			|resultant fixed 32-bit	bne	2$			|  value is in d0	tstw	a0@@			|check sign of float	beq	fixe			|positive - d0 is ok	negl	d0			|negative - negate d0fixe:	moveml	sp@@+,#0xC		|pop d2,d3	unlk	a6	rts||convert fixed 32-bit integer to floating|	.globl	float	.textfloat:	link	a6,#0	moveml	#0x3000,sp@@-		|save d2,d3	movl	#afloat,a0		|a0 points to afloat	clrl	a0@@(MANH)		|clear junk from mantissa	clrw	a0@@			|clear sign	movl	a6@@(8),d0		|d0 = 32-bit long	bmi	1$			|negative	bpl	2$			|positive	movw	#-128,a0@@(EXPT)		|floating zero

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -