📄 floatbin.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 + -