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

📄 g_ftoa.s

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 S
字号:
;--;;	File:	ftoa.asm;	Author:	George Gallant;	Date:	19OCT04;;	This routine provides a floating point to ascii conversion.;	It was written support the SDCC project.;;	SDCC C Syntax:;;	extern void g_ftoa(data char *buf, float num, char precision);;;	The routine is NOT reenterant but expects the entire parameter list;	to be placed on the stack.;;	Notes:	1. measured 105usec to convert -65535.996 on a 20MHz 18f252;		2. Software stack can not cross a RAM page boundary;;--		list	r=dec, n=96, st=off, mm=off		nolist		include		<p18fxxx.inc>		list		udata		extern	digitsexp:		res	1man:		res	4r:		res	5x:		res	3bp:		res	2prec:		res	1ctr:		res	1		code		extern	cvt_dec_word		global	_g_ftoa_g_ftoa:	movff	FSR2H,POSTDEC1		movff	FSR2L,POSTDEC1		movff	FSR1H,FSR2H		movff	FSR1L,FSR2L		movff	exp, POSTDEC1		movff	man+0, POSTDEC1		movff	man+1, POSTDEC1		movff	man+2, POSTDEC1		movff	man+3, POSTDEC1		movff	r+0, POSTDEC1		movff	r+1, POSTDEC1		movff	r+2, POSTDEC1		movff	r+3, POSTDEC1		movff	r+4, POSTDEC1		movff	x+0, POSTDEC1		movff	x+1, POSTDEC1		movff	bp+0, POSTDEC1		movff	bp+1, POSTDEC1		movff	prec, POSTDEC1		movff	ctr, POSTDEC1		movff	FSR0H,POSTDEC1		movff	FSR0L,POSTDEC1		movlw	3		addwf	FSR2L, f		btfsc	STATUS,C		incf	FSR2H, f		movff	POSTINC2,FSR0L		;get the low byte of buf pointer		movff	POSTINC2,FSR0H		movff	POSTINC2,man+0		;get the low byte of float		movff	POSTINC2,man+1		movff	POSTINC2,man+2		movff	POSTINC2,exp		movff	POSTINC2,prec		rlcf	man+2,w		rlcf	exp,f		bnc	@1		movlw	'-'		movwf	POSTINC0@1:		movff	man+0,r+0		movff	man+1,r+1		movff	man+2,r+2		bsf	r+2,7		clrf	r+3		clrf	r+4;	Shift the mantissa left or right by the expondent		movf	exp,w			;get the expondent		sublw	127			;subtract the bais		bz	@4			;skip shifting if zero		bn	@3			;shift left if neg@2:		bcf	STATUS,C		;otherwise, shift right		rrcf	r+4,f		rrcf	r+3,f		rrcf	r+2,f		rrcf	r+1,f		rrcf	r+0,f		decfsz	WREG,w		bra	@2		bra	@4@3:		bcf	STATUS,C		rlcf	r+0, f		rlcf	r+1, f		rlcf	r+2, f		rlcf	r+3, f		rlcf	r+4, f		incfsz	WREG,w		bra	@3@4:		rlcf	r+2,w			;extract bit 23		rlcf	r+3,f			;shift rest of whole number		rlcf	r+4,f		movff	r+3,PRODL		movff	r+4,PRODH		call	cvt_dec_word		movlw	'.'		movwf	POSTINC0@10:		movlw	0x7F					andwf	r+2,f		clrf	r+3		movff	r+0,x+0			;temp copy		movff	r+1,x+1		movff	r+2,x+2		bcf	STATUS,C		;mult by 2		rlcf	r+0,f		rlcf	r+1,f		rlcf	r+2,f		rlcf	r+3,f		bcf	STATUS,C		;mult by 4		rlcf	r+0,f		rlcf	r+1,f		rlcf	r+2,f		rlcf	r+3,f		movf	x+0,w			;mult by 5		addwf	r+0,f		movf	x+1,w		addwfc	r+1,f		movf	x+2,w		addwfc	r+2,f		movlw	0		addwfc	r+3,f		rlcf	r+2,w			;div by 0x400000					rlcf	r+3,f			;or just extract bits 24-22		rlcf	WREG,w		rlcf	r+3,f		movf	r+3,w			;this is the bcd value		addlw	0x30			;convert to ascii		movwf	POSTINC0		;and save in memory		bcf	STATUS,C		;mult by 2		rlcf	r+0,f		rlcf	r+1,f		rlcf	r+2,f		decfsz	prec,f		bra	@10		clrf	POSTINC0		;pack a nullbyte at the end		movff	ctr, POSTDEC1		movff	prec, POSTDEC1		movff	bp+1, POSTDEC1		movff	bp+0, POSTDEC1		movff	x+1, POSTDEC1		movff	x+0, POSTDEC1		movff	r+4, POSTDEC1		movff	r+3, POSTDEC1		movff	r+2, POSTDEC1		movff	r+1, POSTDEC1		movff	r+0, POSTDEC1 		movff	man+3, POSTDEC1		movff	man+2, POSTDEC1		movff	man+1, POSTDEC1		movff	man+0, POSTDEC1		movff	exp, POSTDEC1		movff	PREINC1,FSR0L		movff	PREINC1,FSR0H		movff	PREINC1,FSR2L		movff	PREINC1,FSR2H		return		end

⌨️ 快捷键说明

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