#include <sdcc-lib.h>
#if _SDCC_MANGLES_SUPPORT_FUNS
-unsigned unsigned _divuint (unsigned a, unsigned b);
+unsigned unsigned _divuint (unsigned x, unsigned y);
#endif
/* Assembler-functions are provided for:
#if !defined(SDCC_USE_XSTACK) && !defined(_SDCC_NO_ASM_LIB_FUNCS)
# if defined(SDCC_mcs51)
# if defined(SDCC_MODEL_SMALL)
-# if defined(SDCC_STACK_AUTO)
+# if defined(SDCC_STACK_AUTO) && !defined(SDCC_PARMS_IN_BANK1)
# define _DIVSINT_ASM_SMALL_AUTO
# else
# define _DIVSINT_ASM_SMALL
#if defined _DIVSINT_ASM_SMALL
static void
-_divsint_dummy (void) _naked
+_divsint_dummy (void) __naked
{
- _asm
+ __asm
- #define a0 dpl
- #define a1 dph
+ #define xl dpl
+ #define xh dph
- .globl __divsint
+ .globl __divsint
- // _divsint_PARM_2 shares the same memory with _divuint_PARM_2
- // and is defined in _divuint.c
- #define b0 (__divsint_PARM_2)
- #define b1 (__divsint_PARM_2 + 1)
-
- __divsint:
- ; a1 in dph
- ; b1 in (__divsint_PARM_2 + 1)
+ // _divsint_PARM_2 shares the same memory with _divuint_PARM_2
+ // and is defined in _divuint.c
+#if defined(SDCC_PARMS_IN_BANK1)
+ #define yl (b1_0)
+ #define yh (b1_1)
+#else
+ #define yl (__divsint_PARM_2)
+ #define yh (__divsint_PARM_2 + 1)
+#endif
+__divsint:
+ ; xh in dph
+ ; yh in (__divsint_PARM_2 + 1)
- clr F0 ; Flag 0 in PSW
- ; available to user for general purpose
- mov a,a1
- jnb acc.7,a_not_negative
+ clr F0 ; Flag 0 in PSW
+ ; available to user for general purpose
+ mov a,xh
+ jnb acc.7,a_not_negative
- setb F0
+ setb F0
- clr a
- clr c
- subb a,a0
- mov a0,a
- clr a
- subb a,a1
- mov a1,a
+ clr a
+ clr c
+ subb a,xl
+ mov xl,a
+ clr a
+ subb a,xh
+ mov xh,a
- a_not_negative:
+a_not_negative:
- mov a,b1
- jnb acc.7,b_not_negative
+ mov a,yh
+ jnb acc.7,b_not_negative
- cpl F0
+ cpl F0
- clr a
- clr c
- subb a,b0
- mov b0,a
- clr a
- subb a,b1
- mov b1,a
+ clr a
+ clr c
+ subb a,yl
+ mov yl,a
+ clr a
+ subb a,yh
+ mov yh,a
- b_not_negative:
+b_not_negative:
- lcall __divuint
+ lcall __divuint
- jnb F0,not_negative
+ jnb F0,not_negative
- clr a
- clr c
- subb a,a0
- mov a0,a
- clr a
- subb a,a1
- mov a1,a
+ clr a
+ clr c
+ subb a,xl
+ mov xl,a
+ clr a
+ subb a,xh
+ mov xh,a
- not_negative:
- ret
+not_negative:
+ ret
- _endasm ;
+ __endasm;
}
#elif defined _DIVSINT_ASM_SMALL_AUTO
static void
-_divsint_dummy (void) _naked
+_divsint_dummy (void) __naked
{
- _asm
-
- #define a0 dpl
- #define a1 dph
+ __asm
- ar0 = 0 ; BUG register set is not considered
- ar1 = 1
+ #define xl dpl
+ #define xh dph
- .globl __divsint
+ .globl __divsint
- __divsint:
+__divsint:
- clr F0 ; Flag 0 in PSW
- ; available to user for general purpose
- mov a,a1
- jnb acc.7,a_not_negative
+ clr F0 ; Flag 0 in PSW
+ ; available to user for general purpose
+ mov a,xh
+ jnb acc.7,a_not_negative
- setb F0
+ setb F0
- clr a
- clr c
- subb a,a0
- mov a0,a
- clr a
- subb a,a1
- mov a1,a
+ clr a
+ clr c
+ subb a,xl
+ mov xl,a
+ clr a
+ subb a,xh
+ mov xh,a
- a_not_negative:
+a_not_negative:
- mov a,sp
- add a,#-2 ; 2 bytes return address
- mov r0,a ; r0 points to b1
- mov a,@r0 ; b1
+ mov a,sp
+ add a,#-2 ; 2 bytes return address
+ mov r0,a ; r0 points to yh
+ mov a,@r0 ; a = yh
- jnb acc.7,b_not_negative
+ jnb acc.7,b_not_negative
- cpl F0
+ cpl F0
- dec r0
+ dec r0
- clr a
- clr c
- subb a,@r0 ; b0
- mov @r0,a
- clr a
- inc r0
- subb a,@r0 ; b1
- mov @r0,a
+ clr a
+ clr c
+ subb a,@r0 ; yl
+ mov @r0,a
+ clr a
+ inc r0
+ subb a,@r0 ; a = yh
- b_not_negative:
+b_not_negative:
- mov ar1,@r0 ; b1
- dec r0
- mov ar0,@r0 ; b0
+ mov r1,a ; yh
+ dec r0
+ mov a,@r0 ; yl
+ mov r0,a
- lcall __divint
+ lcall __divint
- jnb F0,not_negative
+ jnb F0,not_negative
- clr a
- clr c
- subb a,a0
- mov a0,a
- clr a
- subb a,a1
- mov a1,a
+ clr a
+ clr c
+ subb a,xl
+ mov xl,a
+ clr a
+ subb a,xh
+ mov xh,a
- not_negative:
- ret
+not_negative:
+ ret
- _endasm ;
+ __endasm;
}
#else // _DIVSINT_ASM_
int
-_divsint (int a, int b)
+_divsint (int x, int y)
{
register int r;
- r = _divuint((a < 0 ? -a : a),
- (b < 0 ? -b : b));
- if ( (a < 0) ^ (b < 0))
+ r = _divuint((x < 0 ? -x : x),
+ (y < 0 ? -y : y));
+ if ( (x < 0) ^ (y < 0))
return -r;
else
return r;