X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2F_divslong.c;h=ac4d9c57768df799e4ea1399c47e1d7a898ae95d;hb=15e47104204a8eac41e3d9769d1493531a4c5906;hp=5165d01cc02d5e116b4eac352e6fc26f74c4758f;hpb=e06463c2f7f7e77ad74ce0319288798cfbed3e0d;p=fw%2Fsdcc diff --git a/device/lib/_divslong.c b/device/lib/_divslong.c index 5165d01c..ac4d9c57 100644 --- a/device/lib/_divslong.c +++ b/device/lib/_divslong.c @@ -26,7 +26,7 @@ #include #if _SDCC_MANGLES_SUPPORT_FUNS -unsigned long _divulong (unsigned long a, unsigned long b); +unsigned long _divulong (unsigned long x, unsigned long y); #endif /* Assembler-functions are provided for: @@ -37,7 +37,7 @@ unsigned long _divulong (unsigned long a, unsigned long b); #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 _DIVSLONG_ASM_SMALL_AUTO # else # define _DIVSLONG_ASM_SMALL @@ -49,212 +49,216 @@ unsigned long _divulong (unsigned long a, unsigned long b); #if defined _DIVSLONG_ASM_SMALL static void -_divslong_dummy (void) _naked +_divslong_dummy (void) __naked { - _asm - - #define a0 dpl - #define a1 dph - #define a2 b - #define a3 r3 - - .globl __divslong - - // _divslong_PARM_2 shares the same memory with _divulong_PARM_2 - // and is defined in _divulong.c - #define b0 (__divslong_PARM_2) - #define b1 (__divslong_PARM_2 + 1) - #define b2 (__divslong_PARM_2 + 2) - #define b3 (__divslong_PARM_2 + 3) - - __divslong: - ; a3 in acc - ; b3 in (__divslong_PARM_2 + 3) - mov a3,a ; save a3 - - clr F0 ; Flag 0 in PSW - ; available to user for general purpose - jnb acc.7,a_not_negative - - setb F0 - - clr a - clr c - subb a,a0 - mov a0,a - clr a - subb a,a1 - mov a1,a - clr a - subb a,a2 - mov a2,a - clr a - subb a,a3 - mov a3,a - - a_not_negative: - - mov a,b3 - jnb acc.7,b_not_negative - - cpl F0 - - clr a - clr c - subb a,b0 - mov b0,a - clr a - subb a,b1 - mov b1,a - clr a - subb a,b2 - mov b2,a - clr a - subb a,b3 - mov b3,a - - b_not_negative: - - mov a,a3 ; restore a3 in acc - - lcall __divulong - - jnb F0,not_negative - - mov a3,a ; save a3 - - clr a - clr c - subb a,a0 - mov a0,a - clr a - subb a,a1 - mov a1,a - clr a - subb a,a2 - mov a2,a - clr a - subb a,a3 - mov a3,a - - not_negative: - ret - - _endasm ; + __asm + + #define x0 dpl + #define x1 dph + #define x2 b + #define x3 r3 + + .globl __divslong + + // _divslong_PARM_2 shares the same memory with _divulong_PARM_2 + // and is defined in _divulong.c +#if defined(SDCC_PARMS_IN_BANK1) + #define y0 (b1_0) + #define y1 (b1_1) + #define y2 (b1_2) + #define y3 (b1_3) +#else + #define y0 (__divslong_PARM_2) + #define y1 (__divslong_PARM_2 + 1) + #define y2 (__divslong_PARM_2 + 2) + #define y3 (__divslong_PARM_2 + 3) +#endif +__divslong: + ; x3 in acc + ; y3 in (__divslong_PARM_2 + 3) + mov x3,a ; save x3 + + clr F0 ; Flag 0 in PSW + ; available to user for general purpose + jnb acc.7,a_not_negative + + setb F0 + + clr a + clr c + subb a,x0 + mov x0,a + clr a + subb a,x1 + mov x1,a + clr a + subb a,x2 + mov x2,a + clr a + subb a,x3 + mov x3,a + +a_not_negative: + + mov a,y3 + jnb acc.7,b_not_negative + + cpl F0 + + clr a + clr c + subb a,y0 + mov y0,a + clr a + subb a,y1 + mov y1,a + clr a + subb a,y2 + mov y2,a + clr a + subb a,y3 + mov y3,a + +b_not_negative: + + mov a,x3 ; restore x3 in acc + + lcall __divulong + + jnb F0,not_negative + + mov x3,a ; save x3 + + clr a + clr c + subb a,x0 + mov x0,a + clr a + subb a,x1 + mov x1,a + clr a + subb a,x2 + mov x2,a + clr a + subb a,x3 ; x3 ends in acc + +not_negative: + ret + + __endasm; } #elif defined _DIVSLONG_ASM_SMALL_AUTO static void -_divslong_dummy (void) _naked +_divslong_dummy (void) __naked { - _asm - - #define a0 dpl - #define a1 dph - #define a2 b - #define a3 r3 - - .globl __divslong - - __divslong: - - ; a3 in acc - mov a3,a ; save a3 - - clr F0 ; Flag 0 in PSW - ; available to user for general purpose - jnb acc.7,a_not_negative - - setb F0 - - clr a - clr c - subb a,a0 - mov a0,a - clr a - subb a,a1 - mov a1,a - clr a - subb a,a2 - mov a2,a - clr a - subb a,a3 - mov a3,a - - a_not_negative: - - mov a,sp - add a,#-2 ; 2 bytes return address - mov r0,a ; r0 points to b3 - mov a,@r0 ; b3 - - jnb acc.7,b_not_negative - - cpl F0 - - dec r0 - 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 - inc r0 - subb a,@r0 ; b2 - mov @r0,a - clr a - inc r0 - subb a,@r0 ; b3 - mov @r0,a - - b_not_negative: - dec r0 - dec r0 - dec r0 ; r0 points to b0 - - lcall __divlong - - jnb F0,not_negative - - mov a3,a ; save a3 - - clr a - clr c - subb a,a0 - mov a0,a - clr a - subb a,a1 - mov a1,a - clr a - subb a,a2 - mov a2,a - clr a - subb a,a3 - mov a3,a - - not_negative: - ret - - _endasm ; + __asm + + #define x0 dpl + #define x1 dph + #define x2 b + #define x3 r3 + + .globl __divslong + +__divslong: + + ; x3 in acc + mov x3,a ; save x3 + + clr F0 ; Flag 0 in PSW + ; available to user for general purpose + jnb acc.7,a_not_negative + + setb F0 + + clr a + clr c + subb a,x0 + mov x0,a + clr a + subb a,x1 + mov x1,a + clr a + subb a,x2 + mov x2,a + clr a + subb a,x3 + mov x3,a + +a_not_negative: + + mov a,sp + add a,#-2 ; 2 bytes return address + mov r0,a ; r0 points to y3 + mov a,@r0 ; y3 + + jnb acc.7,b_not_negative + + cpl F0 + + dec r0 + dec r0 + dec r0 + + clr a + clr c + subb a,@r0 ; y0 + mov @r0,a + clr a + inc r0 + subb a,@r0 ; y1 + mov @r0,a + clr a + inc r0 + subb a,@r0 ; y2 + mov @r0,a + clr a + inc r0 + subb a,@r0 ; y3 + mov @r0,a + +b_not_negative: + dec r0 + dec r0 + dec r0 ; r0 points to y0 + + lcall __divlong + + jnb F0,not_negative + + mov x3,a ; save x3 + + clr a + clr c + subb a,x0 + mov x0,a + clr a + subb a,x1 + mov x1,a + clr a + subb a,x2 + mov x2,a + clr a + subb a,x3 ; x3 ends in acc + +not_negative: + ret + + __endasm; } #else // _DIVSLONG_ASM long -_divslong (long a, long b) +_divslong (long x, long y) { long r; - r = _divulong((a < 0 ? -a : a), - (b < 0 ? -b : b)); - if ( (a < 0) ^ (b < 0)) + r = _divulong((x < 0 ? -x : x), + (y < 0 ? -y : y)); + if ( (x < 0) ^ (y < 0)) return -r; else return r;