📄 bcd-bin.asm
字号:
.CODE
//=============================================================
// ----Function: unsigned int BIN_BCD(unsigned int Data);
// -Description: 十六位二进制转十进制,得5位十进制结果
// --Parameters: None
// -----Returns: None
// -------Notes: r1为源数据,r2、r1返回转换结果
//=============================================================
.PUBLIC _BIN_BCD
_BIN_BCD: push bp,bp to [sp]
r5 = 0 //结果暂存
push r5,r5 to [sp] //结果的高位,定义为局部变量
r4 = 16 //循环计数器
BIN_BCDa: r1 += r1
r3 = r5 & 0x000f
r3 += r3,Carry
cmp r3,9
jbe BIN_BCDb
r3 += 6
BIN_BCDb: r5 &= 0xfff0
r2 = r5 & 0x00f0
r5 += r3 //结果更新
r3 = r5 & 0x00f0
r3 += r2
cmp r3,0x0090
jbe BIN_BCDc
r3 +=0x0060
BIN_BCDc: r5 &= 0xff0f
r2 = r5 & 0x0f00
r5 += r3 //结果更新
r3 = r5 & 0x0f00
r3 += r2
cmp r3,0x0900
jbe BIN_BCDd
r3 +=0x0600
BIN_BCDd: r5 &= 0xf0ff
r2 = r5 & 0xf000
r5 += r3
r3 = r5 & 0xf000
r3 += r2
jcs BIN_BCDf
cmp r3,0x9000
jbe BIN_BCDe
r3 +=0x6000
BIN_BCDe: r5 &= 0x0fff
pop r2,r2 from [sp]
r2 += r2,Carry
push r2,r2 to [sp]
BIN_BCDg: r5 += r3
r4 -= 1
jnz BIN_BCDa
r1 = r5
pop r4,bp from [sp]
retf
BIN_BCDf: pop r2,r2 from [sp]
r2 += r2,Carry
push r2,r2 to [sp]
r3 +=0x6000
r5 &= 0x0fff
jmp BIN_BCDg
//=============================================================
// ----Function: unsigned int BIN_BCD_DF(unsigned int Data);
// -Description: 二进制小数转十进制小数
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
.PUBLIC _BIN_BCD_DF
_BIN_BCD_DF: push bp,bp to [sp]
r5 = 0 //结果暂存
r4 = 16 //循环计数器
BIN_BCD_DFa:r5 = r5 lsr 1
r3 = r1 & 1
jz BIN_BCD_DFb
r5 |= 0x8000
BIN_BCD_DFb:r3 = r5 & 0xff00
r2 = r5 & 0x0080
jz BIN_BCD_DFc
r5 += 0x00d0
BIN_BCD_DFc:r2 = r5 & 0x0008
jz BIN_BCD_DFd
r5 += 0x00fd
BIN_BCD_DFd:r5 &= 0x00ff
r2 = r3 & 0x8000
jz BIN_BCD_DFe
r3 += 0xd000
BIN_BCD_DFe:r2 = r3 & 0x0800
jz BIN_BCD_DFf
r3 += 0xfd00
BIN_BCD_DFf:r5 |= r3
r1 = r1 lsr 1
r4 -= 1
jnz BIN_BCD_DFa
r1 = r5
pop bp,bp from [sp]
retf
//=============================================================
// ----Function: unsigned int BCD_BIN(unsigned int Data);
// -Description: 十进制整数转二进制整数
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
.PUBLIC _BCD_BIN
_BCD_BIN: push bp,bp to [sp]
r2 = 16 //循环计数器
r3 = 0 //结果寄存器
BCD_BINf: r3 = r3 lsr 1
r4 = r1 & 0x0001
jz BCD_BINa
r3 |= 0x8000
BCD_BINa: r1 = r1 lsr 1
r5 = r1 & 0xff00
r4 = r5 & 0x8000
jz BCD_BINb
r5 += 0xd000
BCD_BINb: r4 = r5 & 0x0800
jz BCD_BINc
r5 += 0xfd00
BCD_BINc: r4 = r1 & 0x0080
jz BCD_BINd
r1 += 0x00d0
BCD_BINd: r4 = r1 & 0x0008
jz BCD_BINe
r1 += 0x00fd
BCD_BINe: r1 &= 0x00ff
r1 |= r5
r2 -= 1
jnz BCD_BINf
r1 = r3
pop bp,bp from [sp]
retf
//=============================================================
// ----Function: unsigned int BCD_BIN_DF(unsigned int Data);
// -Description: 十进制小数转二进制小数
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
.PUBLIC _BCD_BIN_DF
_BCD_BIN_DF:push bp,bp to [sp]
r5 = 0 //结果暂存
r4 = 16 //循环计数器
BCD_BIN_DFa:r3 = r1 & 0x000f
r3 += r3
cmp r3,9
jbe BCD_BIN_DFb
r3 += 6
BCD_BIN_DFb:r2 = r1 & 0x00f0
r1 &= 0xfff0
r1 += r3 //结果更新
r3 = r1 & 0x00f0
r3 += r2
cmp r3,0x0090
jbe BCD_BIN_DFc
r3 +=0x0060
BCD_BIN_DFc:r2 = r1 & 0x0f00
r1 &= 0xff0f
r1 += r3 //结果更新
r3 = r1 & 0x0f00
r3 += r2
cmp r3,0x0900
jbe BCD_BIN_DFd
r3 +=0x0600
BCD_BIN_DFd:r2 = r1 & 0xf000
r1 &= 0xf0ff
r1 += r3
r3 = r1 & 0xf000
r3 += r2
jcs BCD_BIN_DFf //进位处理
cmp r3,0x9000
jbe BCD_BIN_DFe
r3 +=0x6000
BCD_BIN_DFe:r1 &= 0x0fff
jcs BCD_BIN_DFh
r1 += r3
r5 = r5 lsl 1
BCD_BIN_DFg:r4 -= 1
jnz BCD_BIN_DFa
r1 = r5
pop bp,bp from [sp]
retf
BCD_BIN_DFf:r3 += 0x6000
r1 &= 0x0fff
BCD_BIN_DFh:r1 += r3
r5 = r5 lsl 1
r5 |= 0x0001
jmp BCD_BIN_DFg
//============================================================================
// ----Function: unsigned int DIV16(unsigned int Data_A,unsigned int Data_B);
// -Description: 16/16 得16位结果 除数的高位不能为1
// --Parameters: None
// -----Returns: None
// -------Notes:
//============================================================================
.PUBLIC _DIV16
_DIV16: r4 = sp + 3 //3.27更改 r4 = sp + 4
r3 = [r4 ++] //3.27更改 r3 = r1
r2 = [r4]
r4 = 0
r3 += r3 //左移一位,规格化为Q31格式
r4 += r4,Carry
r1 = fr //清除AQ标志
r1 &= 0xbfff
fr = r1
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
r1 = r3 //返回结果
retf
//============================================================================
// ----Function: unsigned int DIV32_16(long unsigned int Data_A,unsigned int Data_B);
// -Description: 32/16 得16位结果的无符号数除法! 同时可得到余数
// --Parameters: None
// -----Returns: None
// -------Notes:
//============================================================================
.PUBLIC _DIV32_16
_DIV32_16: r4 = sp + 3 //3.27更改 r4 = sp + 5
r1 = [r4 ++] //3.27添加
r2 = [r4 ++] //3.27添加
r3 = [r4]
r4 = 16
DIV_3216B: r1 += r1 //商左移一位
r2 += r2,Carry
jcs DIV_3216C
cmp r2,r3
jcs DIV_3216C
r4 -= 1
jnz DIV_3216B
retf
DIV_3216C: r2 -= r3
DIV_3216D: r1 += 1
r4 -= 1
jnz DIV_3216B
retf
//============================================================================
// ----Function: long unsigned int DIV32(long unsigned int Data_A,long unsigned int Data_B);
// -Description: 32/32 得32位结果的无符号数除法! 同时可得到余数
// --Parameters: None
// -----Returns: None
// -------Notes:
//============================================================================
.SRAM
.VAR Temp_H
.VAR Temp_L
.CODE
.PUBLIC _DIV32
_DIV32: push bp,bp to [sp]
bp = sp + 1
r1 = [bp + 3] //3.27添加
r2 = [bp + 4] //3.27添加
r3 = [bp + 6]
[Temp_H] = r3
r3 = [bp + 5]
[Temp_L] = r3
r3 = 0
r4 = r3
r5 = 32
DIV_32B: r1 += r1 //商左移一位
r2 += r2,Carry
r3 += r3,Carry //被除数左移一位
r4 += r4,Carry
jcs DIV_32C
r3 -= [Temp_L]
r4 -= [Temp_H],Carry
jcs DIV_32D
r3 += [Temp_L] //不够减则恢复
r4 += [Temp_H],Carry
r5 -= 1
jnz DIV_32B
pop bp,bp from [sp]
retf
DIV_32C: r3 -= [Temp_L]
r4 -= [Temp_H],Carry
DIV_32D: r1 += 1
r5 -= 1
jnz DIV_32B
pop bp,bp from [sp]
retf
//============================================================================
// ----Function: unsigned int MUL_L_Shift6(unsigned int Data_A,unsigned int Data_B);
// -Description: (A*B) << 6
// --Parameters: None
// -----Returns: None
// -------Notes:
//============================================================================
.PUBLIC _MUL_L_Shift6
_MUL_L_Shift6:
r2 = sp + 3 //3.27更改 r2 = sp + 4
r1 = [r2 ++] //3.27添加
r3 = [r2]
mr = r1*r3,uu
r3 = r3 lsl 4
r4 = r4 rol 4
r3 = r3 lsl 4
r4 = r4 rol 2
r1 = r4 //返回结果
retf
//=============================================================
// ----Function: unsigned int MUL_DIV(unsigned int Data, \
// unsigned int Q_Data,unsigned int X_Data);
// -Description: Data*Q_Data/X_Data
// --Parameters: 这里主要用作数据格式转化
// -----Returns:
// -------Notes:
//=============================================================
.PUBLIC _MUL_DIV
_MUL_DIV: r2 = sp + 3 //3.27更改 r2 = sp + 4
r1 = [r2 ++] //3.27添加
r3 = [r2 ++]
mr = r3 * r1,uu
r2 = [r2]
r3 += r3
r4 += r4,Carry
r1 = fr
r1 &= 0xbfff
fr = r1
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
divq mr,r2
r1 = r3
retf
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -