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

📄 floatbin.asm

📁 基于SPCE061A的出租车计价器
💻 ASM
字号:
//============================================================
//	文件名称:	FloatBin.asm
//	功能描述:	浮点数转BCD码程序
//	维护记录:	2003-6-9	v1.0
//	维护说明:	创建
//============================================================
//=============================================================================//
//格 式:long int F_FloatToBCD(float Fdata)
//描 述:单精度浮点数转换为BCD码的程序
//输 入:Float型数据,但有效数字不超过7个十进制位,即只能转出7个BCD码
//输 出:long int型数据,从高位到低位,每四个位表示一个BCD码,最后b3位表示正负数
//		 b2~b0表示小数点位置,如输入数据-674.567时,输出0x6745670b
//注 备:本程序纯为个人兴趣所写,时间紧,所以没有写注释,基本原则是按IEEE的Float数
//       成标准推算的,如在使用中有问题可以邮件与作者联系:zhang89c51@yahoo.com.cn
//       欢迎众高手参与讨论与赐教。
//作 者:小丑		Mz出品			2005年10月
//=============================================================================//
.ram
.var uiTemp_shift
.var uiBIN_Hight,uiBIN_Low
.var uiBIN_FH
.code
M_FloatToBCD_Set: .macro 
	test r3,0x8000
	jz ?M_FloatToBCD_Set_1
	r3 += 0xd000
?M_FloatToBCD_Set_1:
	test r3,0x0800
	jz ?M_FloatToBCD_Set_2
	r3 += 0xfd00
?M_FloatToBCD_Set_2:
	test r3,0x0080
	jz ?M_FloatToBCD_Set_3
	r3 += 0xffd0
?M_FloatToBCD_Set_3:
	test r3,0x0008
	jz ?M_FloatToBCD_Set_20
	r3 += 0xfffd
?M_FloatToBCD_Set_20:	
	test r4,0x8000
	jz ?M_FloatToBCD_Set_21
	r4 += 0xd000
?M_FloatToBCD_Set_21:
	test r4,0x0800
	jz ?M_FloatToBCD_Set_22
	r4 += 0xfd00
?M_FloatToBCD_Set_22:
	test r4,0x0080
	jz ?M_FloatToBCD_Set_23
	r4 += 0xffd0
?M_FloatToBCD_Set_23:
	test r4,0x0008
	jz ?M_FloatToBCD_Set_Exit
	r4 += 0xfffd
?M_FloatToBCD_Set_Exit:
.endm

.code
//**********************************************************************//
//二进制小数转换为BCD码
//
//**********************************************************************//
.public _F_FloatToBCD_Dot
_F_FloatToBCD_Dot:
F_FloatToBCD_Dot:
	push r5 to [sp]
	r5 = 24
?FloatToBCD_Dot_1:
	r2 = r2 lsr 1
	push r4 to [sp]
	r4 = r4 lsr 3
	r1 = r1 ror 1
	r4 = r4 lsr 3
	r3 = r3 ror 1
	r4 = r4 lsr 3
	pop r4 from [sp]
	r4 = r4 ror 1
	M_FloatToBCD_Set
	r5-=1
	jnz ?FloatToBCD_Dot_1
	pop r5 from [sp]
	retf
//**********************************************************************//
//Float单精度实数转换为BCD码
//
//**********************************************************************//	
.public _F_FloatToBCD
_F_FloatToBCD:
	push r5 to [sp]
	r5 = sp+1
	push r3,r4 to [sp]
	r1 = [r5+3]
	r2 = [r5+4]
	r5 = r2 lsr 4
	r5 = r5 lsr 3
	r3 = r5 & 0x0100
	[uiBIN_FH] = r3
	r5 &= 0x00ff
	r2 = r2 & 0x007f
	r2 = r2 | 0x0080
	r1 = r1 lsl 4
	r2 = r2 rol 4
	r1 = r1 lsl 4
	r2 = r2 rol 4
//	push r1,r2 to [sp]
	cmp r5,0x007f
	jae ?F_FloatToBCD_B
	r3 = 0x007f
	r3 = r3-r5
	r5 = r3
	[uiTemp_shift] = r5
?F_FloatToBCD_Low1:
	r2 = r2 lsr 1
	r5 = r5 lsr 3
	r1 = r1 ror 1
	r5 = [uiTemp_shift]
	r5-=1
	[uiTemp_shift] = r5
	jnz ?F_FloatToBCD_Low1
	r2 = r2 lsr 4
	r1 = r1 ror 4
	r2 = r2 lsr 3
	r5 = r5 lsr 1
	r1 = r1 ror 3
	r5 = 1
	call F_FloatToBCD_Dot
	r2 = r3 lsr 4
	r1 = r4 ror 4
	r1 = r1&0xfff0
	r1 = r1|r5
	r3 = [uiBIN_FH]
	r3 = r3 lsr 4 
	r3 = r3 lsr 1 
	r1 = r1|r3
	jmp ?F_FloatToBCD_Exit
?F_FloatToBCD_B:
	r5 = r5-0x007f
	r5 = r5+1
	[uiTemp_shift] = r5
	r3 = 0
	r4 = 0
?F_FloatToBCD_B1:
	r5 = r5+0
	r1 = r1+r1
	r2 = r2+r2,carry
	r3 = r3+r3,carry
	r4 = r4+r4,carry
	r5 = [uiTemp_shift]
	r5-=1
	[uiTemp_shift] = r5
	jnz ?F_FloatToBCD_B1
	[uiBIN_Hight] = r4
	[uiBIN_Low] = r3
	r2 = r2 lsr 4
	r1 = r1 ror 4
	r2 = r2 lsr 4
	r1 = r1 ror 4
	call F_FloatToBCD_Dot				//小数部份转换
	r1 = [uiBIN_Low]
	r2 = [uiBIN_Hight]
	call F_FloatToBCD_Int				//整数部份转换
	push r5 to [sp]
?F_FloatToBCD_L1:
	r4 = r4 lsl 4
	r3 = r3 rol 4
	r1 = r1 rol 4
	r2 = r2 rol 4
	r5+=0x1000
	cmp r5,0x8000
	jb ?F_FloatToBCD_L1
	pop r5 from [sp]
	r5 = r5 lsr 4
	r5 = r5 lsr 4
	r5 = r5 lsr 4	
	r3 = [uiBIN_FH]
	r3 = r3 lsr 4
	r3 = r3 lsr 1
	r3 = r3 | r5
	r1 = r1 & 0xfff0
	r1 = r1 | r3
?F_FloatToBCD_Exit:
	pop r3,r4 from [sp]
	pop r5 from [sp]
	retf
	
F_FloatToBCD_Int:
	push r3,r4 to [sp]
	r1 = r1 lsl 4
	r2 = r2 rol 4
	r1 = r1 lsl 4
	r2 = r2 rol 4
	r5 = 24
	r3 = 0
	r4 = 0
?F_FloatToBCD_Int1:
	r5 = r5+0
	r1 = r1+r1
	r2 = r2+r2,carry
	r3 = r3+r3,carry
	r4 = r4+r4,carry
	call F_FloatToBCD_Model
	r5-=1
	jnz ?F_FloatToBCD_Int1
	push r3,r4 to [sp]
///	r1 = r4
//	r2 = r3
	r5 = 0//
?F_FloatToBCD_Int2:
	r3 = r3 lsl 4
	r4 = r4 rol 4
	r1 = r1 rol 4
	r1 = r1&0x000f
	jnz ?F_FloatToBCD_Int3
	r5+=1
	cmp r5,7
	jb ?F_FloatToBCD_Int2
?F_FloatToBCD_Int3:
	r1 = 8
	r1 = r1-r5
	r5 = r1 lsl 4
	r5 = r5 lsl 4
	r5 = r5 lsl 4
	pop r1,r2 from [sp]
	r2 = r2 | r5
	pop r3,r4 from [sp]
	retf
	
F_FloatToBCD_Model:
	push r5 to [sp]
	test r3,0x0010
	jnz ?F_FloatToBCD_Model1
	r5 = r3&0x000f
	cmp r5,0x000a
	jb ?F_FloatToBCD_Model2
?F_FloatToBCD_Model1:
	r3 = r3+0x0006
//	r4 = r4+0,carry
?F_FloatToBCD_Model2:
	test r3,0x0100
	jnz ?F_FloatToBCD_Model3
	r5 = r3&0x00f0
	cmp r5,0x00a0
	jb ?F_FloatToBCD_Model4
?F_FloatToBCD_Model3:
	r3 = r3+0x0060
?F_FloatToBCD_Model4:
	test r3,0x1000
	jnz ?F_FloatToBCD_Model5
	r5 = r3&0x0f00
	cmp r5,0x0a00
	jb ?F_FloatToBCD_Model6
?F_FloatToBCD_Model5:
	r3 = r3+0x0600
?F_FloatToBCD_Model6:
	test r4,0x0001
	jnz ?F_FloatToBCD_Model7
	r5 = r3&0xf000
	cmp r5,0xa000
	jb ?F_FloatToBCD_Model8
?F_FloatToBCD_Model7:
	r3 = r3+0x6000
	r4 = r4+0,carry
?F_FloatToBCD_Model8:
	test r4,0x0010
	jnz ?F_FloatToBCD_Model9
	r5 = r4&0x000f
	cmp r5,0x000a
	jb ?F_FloatToBCD_Model10
?F_FloatToBCD_Model9:
	r4 = r4+0x0006
?F_FloatToBCD_Model10:
	test r4,0x0100
	jnz ?F_FloatToBCD_Model11
	r5 = r4&0x00f0
	cmp r5,0x00a0
	jb ?F_FloatToBCD_Model12
?F_FloatToBCD_Model11:
	r4 = r4+0x0060
?F_FloatToBCD_Model12:
	pop r5 from [sp]
	retf

⌨️ 快捷键说明

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