;/****************************************Copyright (c)****************************************
;** 文件名:DIV.S
;** 描述:替换ADS1.2的整数除法库。当用户程序使用了除法时,把这个文件与用户程序一齐编译即可
;*******************************************************************************************/
;引入的外部标号在这声明
;给外部使用的标号在这声明
EXPORT __rt_udiv
EXPORT __rt_sdiv
;段声明
IF {CONFIG} = 16
CODE16
ELSE
CODE32
ENDIF
AREA Init,CODE,READONLY
;/*********************************************************************************************************
;** 函数名称: Myclz
;** 功能描述: 仿真clz指令
;** 输 入: R0 : 需要计算前导零的数
;** 输 出: R0 :计算结果
;** 全局变量:
;** 调用模块:
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
Myclz
MOV R1, #32
MyclzSTR
CMP R0, #0
BMI MyclzRET
ADD R0, R0, R0
IF {CONFIG} = 16
SUB R1, R1, #1
ELSE
SUBS R1, R1, #1
ENDIF
BNE MyclzSTR
MyclzRET
IF {CONFIG} = 16
MOV R0, #32
SUB R0, R0, R1
ELSE
RSB R0, R1, #32
ENDIF
MOV PC, LR
;/*********************************************************************************************************
;** 函数名称: __rt_sdiv
;** 功能描述: 无符号数除以无符号数
;** 输 入: R0 : 除数
; R1 :被除数
;** 输 出: R0 :R1 / R0
; R1 : R1 % R0
;** 全局变量:
;** 调用模块:
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__rt_udiv
CMP R0, #0
IMPORT __rt_div0
IF {CONFIG} = 16
BNE __rt_udiv_1
LDR R0, =__rt_div0
BX R0
ELSE
BEQ __rt_div0
ENDIF
__rt_udiv_1
CMP R0, R1
IF {CONFIG} = 16
BLS __rt_udiv_2
MOV R0, #0
MOV PC, LR
__rt_udiv_2
PUSH {R4-R7, LR}
ELSE
MOVHI R0, #0
MOVHI PC, LR
STMFD SP!, {R4-R7, LR}
ENDIF
MOV R4, R1
MOV R5, R0
BL Myclz
MOV R7, R0
MOV R0, R4
BL Myclz
SUB R7, R7, R0
IF {CONFIG} = 16
LSL R5, R7
ELSE
MOV R5, R5, LSL R7
ENDIF
MOV R0, #0
__rt_udiv_3
ADD R0, R0, R0
IF {CONFIG} = 16
SUB R1, R4, R5
BLO __rt_udiv_4
MOV R4, R1
ADD R0, R0, #1
__rt_udiv_4
LSR R5, R5, #1
SUB R7, R7, #1
ELSE
SUBS R1, R4, R5
MOVHS R4, R1
ADDHS R0, R0, #1
MOV R5, R5 ,LSR #1
SUBS R7, R7, #1
ENDIF
BCS __rt_udiv_3
MOV R1, R4
IF {CONFIG} = 16
POP {R4-R7, PC}
ELSE
LDMFD SP!, {R4-R7, PC}
ENDIF
;/*********************************************************************************************************
;** 函数名称: __rt_sdiv
;** 功能描述: 有符号数除以有符号数
;** 输 入: R0 : 除数
; R1 :被除数
;** 输 出: R0 :R1 / R0
; R1 : R1 % R0
;** 全局变量:
;** 调用模块:
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__rt_sdiv
MOV R2, #0
CMP R0, #0
IF {CONFIG} = 16
BGE __rt_sdiv_1
SUB R0, R2, R0
ADD R2, R2, #1
ELSE
ADDLT R2, R2, #1
RSBLT R0, R0, #0
ENDIF
__rt_sdiv_1
CMP R1, #0
IF {CONFIG} = 16
BGE __rt_sdiv_2
MOV R3, #0
SUB R1, R3, R1
ADD R2, R2, #2
ELSE
ADDLT R2, R2, #2
RSBLT R1, R1, #0
ENDIF
__rt_sdiv_2
CMP R2, #0
BEQ __rt_udiv
IF {CONFIG} = 16
PUSH {R2, LR}
BL __rt_udiv
POP {R2}
MOV R3, #0
ELSE
STMFD SP!, {R2, LR}
BL __rt_udiv
LDMFD SP!, {R2}
ENDIF
CMP R2, #2
IF {CONFIG} = 16
BLE __rt_sdiv_3
BGE __rt_sdiv_4
POP {PC}
ELSE
RSBLE R0, R0, #0
RSBGE R1, R1, #0
LDMFD SP!, {PC}
ENDIF
__rt_sdiv_3
IF {CONFIG} = 16
SUB R0, R3, R0
CMP R2, #2
BGE __rt_sdiv_4
POP {PC}
ENDIF
__rt_sdiv_4
IF {CONFIG} = 16
SUB R1, R3, R1
POP {PC}
ENDIF
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/