;--------------------------------------------------
;这是三星八位单片机的宏定义集
;--------------------------------------------------
;这是清寄存器某一位为零的宏指令定义
;指令格式: CLRBIT REGISTER,REGBIT
;CLRBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲清零的寄存器位
;---------------------------------
CLRBIT: MACRO REGISTER,REGBIT
.IF REGBIT==0
AND REGISTER,#0FEH
.ENDIF
.IF REGBIT==1
AND REGISTER,#0FDH
.ENDIF
.IF REGBIT==2
AND REGISTER,#0FBH
.ENDIF
.IF REGBIT==3
AND REGISTER,#0F7H
.ENDIF
.IF REGBIT==4
AND REGISTER,#0EFH
.ENDIF
.IF REGBIT==5
AND REGISTER,#0DFH
.ENDIF
.IF REGBIT==6
AND REGISTER,#0BFH
.ENDIF
.IF REGBIT==7
AND REGISTER,#07FH
.ENDIF
.ENDM
;--------------------------------------------------------
;这是置寄存器某一位为1的宏指令定义
;指令格式: SETBIT REGISTER,REGBIT
;SETBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲置1的寄存器位
;---------------------------
SETBIT: MACRO REGISTER,REGBIT
.IF REGBIT==0
OR REGISTER,#01H
.ENDIF
.IF REGBIT==1
OR REGISTER,#02H
.ENDIF
.IF REGBIT==2
OR REGISTER,#04H
.ENDIF
.IF REGBIT==3
OR REGISTER,#08H
.ENDIF
.IF REGBIT==4
OR REGISTER,#10H
.ENDIF
.IF REGBIT==5
OR REGISTER,#20H
.ENDIF
.IF REGBIT==6
OR REGISTER,#40H
.ENDIF
.IF REGBIT==7
OR REGISTER,#80H
.ENDIF
.ENDM
;--------------------------------------------------------
;这是测试寄存器某一位状态的宏指令定义
;指令格式: TESTBIT REGISTER,REGBIT
;TMBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲测试的寄存器位
;---------------------------
TMBIT: MACRO REGISTER,REGBIT
.IF REGBIT==0
TM REGISTER,#01H
.ENDIF
.IF REGBIT==1
TM REGISTER,#02H
.ENDIF
.IF REGBIT==2
TM REGISTER,#04H
.ENDIF
.IF REGBIT==3
TM REGISTER,#08H
.ENDIF
.IF REGBIT==4
TM REGISTER,#10H
.ENDIF
.IF REGBIT==5
TM REGISTER,#20H
.ENDIF
.IF REGBIT==6
TM REGISTER,#40H
.ENDIF
.IF REGBIT==7
TM REGISTER,#80H
.ENDIF
.ENDM
;------------------------------------------------
;这是取反寄存器某一位状态的宏指令定义
;指令格式: XORBIT REGISTER,REGBIT
;XORBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲清零的寄存器位
;----------------------------
XORBIT: MACRO REGISTER,REGBIT
.IF REGBIT==0
XOR REGISTER,#01H
.ENDIF
.IF REGBIT==1
XOR REGISTER,#02H
.ENDIF
.IF REGBIT==2
XOR REGISTER,#04H
.ENDIF
.IF REGBIT==3
XOR REGISTER,#08H
.ENDIF
.IF REGBIT==4
XOR REGISTER,#10H
.ENDIF
.IF REGBIT==5
XOR REGISTER,#20H
.ENDIF
.IF REGBIT==6
XOR REGISTER,#40H
.ENDIF
.IF REGBIT==7
XOR REGISTER,#80H
.ENDIF
.ENDM
;----------------------------------------------------
;这是两个16位寄存器相加的宏
;REG_H1----被加数高位字节
;REG_L2----被加数低位字节
;REG_H2----加数高位字节
;REG_L2----加数低位字节
;相加结果在被加数中
ADD16: MACRO REG_H1,REG_L1,REG_H2,REG_L2
ADD REG_L1,REG_L2
ADC REG_H1,REG_H2
.ENDM
;--------------------------------------------------------
;这是两个16位寄存器相减的宏
;REG_H1----被减数高位字节
;REG_L2----被减数低位字节
;REG_H2----减数高位字节
;REG_L2----减数低位字节
;相减结果在被减数中
SUB16: MACRO REG_H1,REG_L1,REG_H2,REG_L2
SUB REG_L1,REG_L2
SBC REG_H1,REG_H2
.ENDM
;-----------------------------------------------------------
;这是一个延时几个NOP周期的宏
;注意: 该宏最多可以插入10个NOP,超过者将视作无效,不插入任何NOP
DELAY: MACRO CYCLES
.IF CYCLES == 1
NOP
.ENDIF
.IF CYCLES == 2
NOP
NOP
.ENDIF
.IF CYCLES == 3
NOP
NOP
NOP
.ENDIF
.IF CYCLES == 4
NOP
NOP
NOP
NOP
.ENDIF
.IF CYCLES == 5
NOP
NOP
NOP
NOP
NOP
.ENDIF
.IF CYCLES == 6
NOP
NOP
NOP
NOP
NOP
NOP
.ENDIF
.IF CYCLES == 7
NOP
NOP
NOP
NOP
NOP
NOP
NOP
.ENDIF
.IF CYCLES == 8
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
.ENDIF
.IF CYCLES == 9
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
.ENDIF
.IF CYCLES == 10
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
.ENDIF
.ENDM
;--------------------------------------------------------------
;该过程实现一个无符号的24位二进制数与一个16位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R10:R11:R12:R13:R14:R15
;本例中被乘数仅用到:R1,R2,R3,R4
;本例中乘数仅用到: R8,R9
;本例中乘积仅用到: R10,R11,R12,R13,R14,R15
;另外: R0:R1 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(16)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL3216_MACRO: MACRO
;该宏于20140513验证OK
;-----------------------
PUSH R6 ;R6:R7用作临时被乘数高位字节
PUSH R7
PUSH R0 ;R0用作循环计数器
CLR R6 ;R6:R7用作临时被乘数高位字节
CLR R7
CLR R10
CLR R11
CLR R12
CLR R13 ;清乘积值为0
CLR R14
CLR R15
;-----------------
_START:
LD R0,#16
_LOOP:
RCF
RRC R8
RRC R9 ;右移乘数值一位,并检测该位状态
JR NC,_SHF
;如果乘数当前位=1,则加乘积值
ADD R15,R4
ADC R14,R3
ADC R13,R2
ADC R12,R1
ADC R11,R7
ADC R10,R6
_SHF:
RCF ;首先必须清C=0
RLC R4
RLC R3
RLC R2
RLC R1
RLC R7
RLC R6
DEC R0
JR NZ,_LOOP
;8次循环完毕,则完成退出
_BACK:
POP R0
POP R7
POP R6
;------------------
.ENDM
;--------------------------------------------------------------
;该过程实现一个无符号的24位二进制数与一个16位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R11,R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R2,R3,R4
;本例中乘数仅用到: R8,R9
;本例中乘积仅用到: R11,R12,R13,R14,R15
;另外: R0:R1 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(16)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL2416_MACRO: MACRO
;该宏于20140511验证OK
;-----------------------
PUSH R10
PUSH R0
PUSH R1
CLR R0 ;R2用作临时被乘数高位字节
CLR R1
CLR R11
CLR R12
CLR R13 ;清乘积值为0
CLR R14
CLR R15
;-----------------
_START:
LD R10,#16
_LOOP:
RCF
RRC R8
RRC R9 ;右移乘数值一位,并检测该位状态
JR NC,_SHF
;如果乘数当前位=1,则加乘积值
ADD R15,R4
ADC R14,R3
ADC R13,R2
ADC R12,R1
ADC R11,R0
_SHF:
RCF ;首先必须清C=0
RLC R4
RLC R3
RLC R2
RLC R1
RLC R0
DEC R10
JR NZ,_LOOP
;8次循环完毕,则完成退出
_BACK:
POP R1
POP R0
POP R10
;------------------
.ENDM
;--------------------------------------------------------------
;该过程实现一个无符号的十六位二进制数与一个16位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R3,R4
;本例中乘数仅用到: R8,R9
;本例中乘积仅用到: R12,R13,R14,R15
;另外: R0:R1 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(16)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL1616_MACRO: MACRO
;该宏于20140511验证通过
;-----------------------
PUSH R10
PUSH R0
PUSH R1
CLR R0 ;R2用作临时被乘数高位字节
CLR R1
CLR R12
CLR R13 ;清乘积值为0
CLR R14
CLR R15
;-----------------
_START:
LD R10,#16
_LOOP:
RCF
RRC R8
RRC R9 ;右移乘数值一位,并检测该位状态
JR NC,_SHF
;如果乘数当前位=1,则加乘积值
ADD R15,R4
ADC R14,R3
ADC R13,R1
ADC R12,R0
_SHF:
RCF ;首先必须清C=0
RLC R4
RLC R3
RLC R1
RLC R0
DEC R10
JR NZ,_LOOP
;8次循环完毕,则完成退出
_BACK:
POP R1
POP R0
POP R10
;------------------
.ENDM
;---------------------------------------------------------------
;该过程实现一个无符号的十六位二进制数与一个八位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R3,R4
;本例中乘数仅用到: R9
;本例中乘积仅用到: R13,R14,R15
;另外: R0 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(8)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL1608_MACRO: MACRO
;该宏于20140511验证OK
;-----------------------
PUSH R10
PUSH R0
CLR R0 ;R2用作临时被乘数高位字节
CLR R13 ;清乘积值为0
CLR R14
CLR R15
;-----------------
_START:
LD R10,#08H
_LOOP:
RCF
RRC R9 ;右移乘数值一位,并检测该位状态
JR NC,_SHF
;如果乘数当前位=1,则加乘积值
ADD R15,R4
ADC R14,R3
ADC R13,R0
_SHF:
RCF ;首先必须清C=0
RLC R4
RLC R3
RLC R0
DEC R10
JR NZ,_LOOP
;8次循环完毕,则完成退出
_BACK:
POP R0
POP R10
;------------------
.ENDM
;--------------------------------------------------
;该宏实现两个无符号的八位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R4
;本例中乘数仅用到: R9
;本例中乘积仅用到: R14,R15
;另外: R0 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(8)
;-------------------------
;该宏于20140511验证OK
UMUL0808_MACRO: MACRO
;--------------------------
PUSH R0
PUSH R10
CLR R0 ;R3用作临时被乘数高位字节
CLR R14
CLR R15
;---------------
LD R10,#08H
_LOOP:
RCF
RRC R9 ;右移乘数值一位,并检测该位状态
JR NC,_SHF ;如果该位=0,则转
;如果乘数当前位=1,则加乘积值
ADD R15,R4
ADC R14,R0
_SHF:
;然后将被乘数左移一位
RCF ;首先必须清C=0
RLC R4
RLC R0
DEC R10
JR NZ,_LOOP
_BACK:
POP R10
POP R0
;--------------------
.ENDM
;这是实现一个48位数与一个24位数相除的过程
;输入:
;被除数:
; R1:R2:R3:R4:R5:R6
;除数:
; R7:R8:R9
;输入商值:
; R10:R11:R12:R13:R14:R15
;余数值退出时在原被除数中存放
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140513验证OK
UDIV4824_MACRO: MACRO
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 0AH
;予清商数为0
CLR R10
CLR R11
CLR R12
CLR R13
CLR R14
CLR R15
;检测除数是否为0
CP R7,#00H
JR NE,_ST
CP R8,#00H
JR NE,_ST
CP R9,#00H
JR NE,_ST
;如果除数为零,则错误,返回R0=0FFH
LD R0,#0FFH
JP _BACK
_ST:
;予清被除数临时字节为0
CLR 00H
CLR 01H
CLR 02H
CLR 03H
CLR 04H
CLR 05H
LD R0,#30H
_LOOP:
;予清商位为0
RCF
RLC R15
RLC R14
RLC R13
RLC R12
RLC R11
RLC R10
;将被除数最高位依次移入临时字节中并与除数进行比较
RCF ;必须予清C=0
RLC R6
RLC R5
RLC R4
RLC R3
RLC R2
RLC R1
RLC 05H
RLC 04H
RLC 03H
RLC 02H
RLC 01H
RLC 00H
;暂存值
PUSH 05H
PUSH 04H
PUSH 03H
PUSH 02H
PUSH 01H
PUSH 00H
;比较高位字节大小
SUB 05H,R9
SBC 04H,R8
SBC 03H,R7
SBC 02H,#0
SBC 01H,#0
SBC 00H,#0
JR C,_POP
;如果被除数高位大于或等于除数,则置该位商为1
OR R15,#01H
;比较成功,则平衡栈操作
POP 0AH
POP 0AH
POP 0AH
POP 0AH
POP 0AH
POP 0AH
JR _SHF
_POP:
;比较不成功,则复原R10,R11值
POP 00H
POP 01H
POP 02H
POP 03H
POP 04H
POP 05H
_SHF:
DEC R0
JR NZ,_LOOP
;最后重新调入余数值到原被除数中
LD R1,00H
LD R2,01H
LD R3,02H
LD R4,03H
LD R5,04H
LD R6,05H
_BACK:
POP 0AH
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
;---------------
.ENDM
;---------------------------------------------------------
;这是实现一个32位数与一个24位数相除的过程
;输入:
;被除数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R1,R2,R3,R4
;本例中除数仅用到: R7,R8,R9
;本例中商值仅用到: R12,R13,R14,R15
;余数值退出时在原被除数中存放
;另外: R5 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140511验证OK
UDIV3224_MACRO: MACRO
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH R5
;予清商数为0
CLR R12
CLR R13
CLR R14
CLR R15
;检测除数是否为0
CP R7,#00H
JR NE,_ST
CP R8,#00H
JR NE,_ST
CP R9,#00H
JR NE,_ST
;如果除数为零,则错误,返回R0=0FFH
LD R0,#0FFH
JR _BACK
_ST:
;予清被除数临时字节为0
CLR 00H
CLR 01H
CLR 02H
CLR 03H
LD R0,#20H
_LOOP:
;予清商位为0
RCF
RLC R15
RLC R14
RLC R13
RLC R12
;将被除数最高位依次移入临时字节中并与除数进行比较
RCF ;必须予清C=0
RLC R4
RLC R3
RLC R2
RLC R1
RLC 03H
RLC 02H
RLC 01H
RLC 00H
;暂存R10,R11值
PUSH 03H
PUSH 02H
PUSH 01H
PUSH 00H
;比较高位字节大小
SUB 03H,R9
SBC 02H,R8
SBC 01H,R7
SBC 00H,#0
JR C,_POP
;如果被除数高位大于或等于除数,则置该位商为1
OR R15,#01H
;比较成功,则平衡栈操作
POP R5
POP R5
POP R5
POP R5
JR _SHF
_POP:
;比较不成功,则复原R10,R11值
POP 00H
POP 01H
POP 02H
POP 03H
_SHF:
DEC R0
JR NZ,_LOOP
;最后重新调入余数值到原被除数中
LD R1,00H
LD R2,01H
LD R3,02H
LD R4,03H
_BACK:
POP R5
POP 03H
POP 02H
POP 01H
POP 00H
;---------------
.ENDM
;---------------------------------------------------------
;这是实现一个24位数与一个24位数相除的过程
;输入:
;被除数:
; R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R2,R3,R4
;本例中除数仅用到: R7,R8,R9
;本例中商值仅用到: R13,R14,R15
;余数值退出时在原被除数中存放
;另外: R6,R10,R11 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140511验证OK
UDIV2424_MACRO: MACRO
PUSH R11
PUSH R10
PUSH R6
PUSH R5
;予清商数为0
CLR R13
CLR R14
CLR R15
;检测除数是否为0
CP R7,#00H
JR NE,_ST
CP R8,#00H
JR NE,_ST
CP R9,#00H
JR NE,_ST
;如果除数为零,则错误,返回R0=0FFH
LD R0,#0FFH
JR _BACK
_ST:
;予清被除数临时字节为0
CLR R6
CLR R10
CLR R11
LD R0,#18H
_LOOP:
;予清商位为0
RCF
RLC R15
RLC R14
RLC R13
;将被除数最高位依次移入临时字节中并与除数进行比较
RCF ;必须予清C=0
RLC R4
RLC R3
RLC R2
RLC R11
RLC R10
RLC R6
;暂存R10,R11值
PUSH R11
PUSH R10
PUSH R6
;比较高位字节大小
SUB R11,R9
SBC R10,R8
SBC R6,R7
JR C,_POP
;如果被除数高位大于或等于除数,则置该位商为1
OR R15,#01H
;比较成功,则平衡栈操作
POP R5
POP R5
POP R5
JR _SHF
_POP:
;比较不成功,则复原R10,R11值
POP R6
POP R10
POP R11
_SHF:
DEC R0
JR NZ,_LOOP
LD R2,R6
LD R3,R10
LD R4,R11
_BACK:
POP R5
POP R6
POP R10
POP R11
;---------------------
.ENDM
;---------------------------------------------------------
;这是实现一个24位数与一个16位数相除的过程
;输入:
;被除数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R2,R3,R4
;本例中除数仅用到: R8,R9
;本例中商值仅用到: R13,R14,R15
;余数值退出时在原被除数中存放
;另外: R10,R11 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏在20140511验证OK
UDIV2416_MACRO: MACRO
;-------------------------
PUSH R12
PUSH R11
PUSH R10
PUSH R5
;予清商数为0
CLR R13
CLR R14
CLR R15
;检测除数是否为0
CP R8,#00H
JR NE,_ST
CP R9,#00H
JR NE,_ST
;如果除数为零,则错误,返回R0=0FFH
LD R0,#0FFH
JR _BACK
_ST:
;予清被除数临时字节为0
CLR R10
CLR R11
CLR R12
LD R0,#18H
_LOOP:
;予清商位为0
RCF
RLC R15
RLC R14
RLC R13
;将被除数最高位依次移入临时字节中并与除数进行比较
RCF ;必须予清C=0
RLC R4
RLC R3
RLC R2
RLC R12
RLC R11
RLC R10
;暂存R10,R11,R12值
PUSH R12
PUSH R11
PUSH R10
;比较高位字节大小
SUB R12,R9
SBC R11,R8
SBC R10,#0
JR C,_POP
;如果被除数高位大于或等于除数,则置该位商为1
OR R15,#01H
;比较成功,则平衡栈操作
POP R5
POP R5
POP R5
JR _SHF
_POP:
;比较不成功,则复原R10,R11值
POP R10
POP R11
POP R12
_SHF:
DEC R0
JR NZ,_LOOP
;重新调入余数值到被除数中
LD R2,R10
LD R3,R11
LD R4,R12
_BACK:
POP R5
POP R10
POP R11
POP R12
;---------------
.ENDM
;----------------------------------------------------------
;这是实现一个16位数与一个16位数相除的过程
;输入:
;被除数:
; R3(字节3),R4(低位字节)
;除数:
; R8(字节3),R9(低位字节)
;输入商值:
; R14(字节3),R15(低位字节)
;本例中被除数仅用到: R3,R4
;本例中除数仅用到: R8,R9
;本例中商值仅用到: R14,R15
;余数值退出时在原被除数中存放
;另外: R10,R11 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140510验证OK
UDIV1616_MACRO: MACRO
PUSH R11
PUSH R10
PUSH R5
;予清商数为0
CLR R14
CLR R15
;检测除数是否为0
CP R8,#00H
JR NE,_ST
CP R9,#00H
JR NE,_ST
;如果除数为零,则错误,返回R0=0FFH
LD R0,#0FFH
JR _BACK
_ST:
;予清被除数临时字节为0
CLR R10
CLR R11
LD R0,#10H
_LOOP:
;予清商位为0
RCF
RLC R15
RLC R14
;将被除数最高位依次移入临时字节中并与除数进行比较
RCF ;必须予清C=0
RLC R4
RLC R3
RLC R11
RLC R10
;暂存R10值
PUSH R10
PUSH R11
;比较高位字节大小
SUB R11,R9
SBC R10,R8
JR C,_POP
;如果被除数高位大于或等于除数,则置该位商为1
OR R15,#01H
;比较成功,则平衡栈操作
POP R5
POP R5
JR _SHF
_POP:
;比较不成功,则复原R10值
POP R11
POP R10
_SHF:
DEC R0
JR NZ,_LOOP
LD R3,R10
LD R4,R11
_BACK:
POP R5
POP R10
POP R11
;---------------------
.ENDM
;---------------------------------------------------------
;这是实现一个16位数与一个8位数相除的过程
;输入:
;被除数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R3,R4
;本例中除数仅用到: R9
;本例中商值仅用到: R14,R15
;余数值退出时在原被除数中存放
;;另外: R10被用作计算时被除数临时最高位字节;
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏已于20140510验证OK
UDIV1608_MACRO: MACRO
;------------------------
PUSH R11
PUSH R10
PUSH R5
;予清商数为0
CLR R14
CLR R15
;检测除数是否为0
CP R9,#00H
JR NE,_ST
;如果除数为零,则错误,返回R0=0FFH
LD R0,#0FFH
JR _BACK
_ST:
;予清被除数临时字节为0
CLR R10
CLR R11
LD R0,#10H
_LOOP:
;予清商位为0
RCF
RLC R15
RLC R14
;将被除数最高位依次移入临时字节中并与除数进行比较
RCF ;必须予清C=0
RLC R4
RLC R3
RLC R11
RLC R10
;暂存R10值
PUSH R11
PUSH R10
;比较高位字节大小
SUB R11,R9
SBC R10,#0
JR C,_POP
;如果被除数高位大于或等于除数,则置该位商为1
OR R15,#01H
;比较成功,则平衡栈操作
POP R5
POP R5
JR _SHF
_POP:
;比较不成功,则复原R10值
POP R10
POP R11
_SHF:
DEC R0
JR NZ,_LOOP
LD R3,R10
LD R4,R11
_BACK:
POP R5
POP R10
POP R11
;------------------
.ENDM
;------------------------------------------------------
;这是实现一个8位数与一个8位数相除的过程
;输入:
;被除数:
; R4(低位字节)
;除数:
; R9(低位字节)
;输入商值:
; R15(低位字节)
;本例中被除数仅用到: R4
;本例中除数仅用到: R9
;本例中商值仅用到: R15
;余数值退出时在原被除数中存放
;;另外: R10被用作计算时被除数临时最高位字节;
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏已于20140510验证OK
UDIV0808_MACRO: MACRO
PUSH R10
PUSH R5
;予清商数为0
CLR R15
;检测除数是否为0
CP R9,#00H
JR NE,_ST
;如果除数为零,则错误,返回R0=0FFH
LD R0,#0FFH
JR _BACK
_ST:
;予清被除数临时字节为0
CLR R10
LD R0,#08H
_LOOP:
;予清商位为0
RCF
RLC R15
;将被除数最高位依次移入临时字节中并与除数进行比较
RCF ;必须予清C=0
RLC R4
RLC R10
;暂存R10值
PUSH R10
;比较高位字节大小
SUB R10,R9
JR C,_POP
;如果被除数高位大于或等于除数,则置该位商为1
OR R15,#01H
;比较成功,则平衡栈操作
POP R5
JR _SHF
_POP:
;比较不成功,则复原R10值
POP R10
_SHF:
DEC R0
JR NZ,_LOOP
LD R4,R10
_BACK:
POP R5
POP R10
;-------------------------
.ENDM
;-----------------------------------------------------------
|
相关备注: |
无 |
|