X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2F_modsint.c;h=6ca1f5201c095be8ba00c322f429f15e1a783a58;hb=1bb6a9b476754a7dd750c60972bbefe75c218f68;hp=fb0147dcfb4b72af4c97ec1add2c1e97c5793c86;hpb=e06463c2f7f7e77ad74ce0319288798cfbed3e0d;p=fw%2Fsdcc diff --git a/device/lib/_modsint.c b/device/lib/_modsint.c index fb0147dc..6ca1f520 100644 --- a/device/lib/_modsint.c +++ b/device/lib/_modsint.c @@ -37,7 +37,7 @@ unsigned unsigned _moduint (unsigned a, unsigned 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 _MODSINT_ASM_SMALL_AUTO # else # define _MODSINT_ASM_SMALL @@ -49,150 +49,149 @@ unsigned unsigned _moduint (unsigned a, unsigned b); #if defined _MODSINT_ASM_SMALL static void -_modsint_dummy (void) _naked +_modsint_dummy (void) __naked { - _asm - - #define a0 dpl - #define a1 dph - - .globl __modsint - - // _modsint_PARM_2 shares the same memory with _moduint_PARM_2 - // and is defined in _moduint.c - #define b0 (__modsint_PARM_2) - #define b1 (__modsint_PARM_2 + 1) - - __modsint: - ; a1 in dph - ; b1 in (__modsint_PARM_2 + 1) - - clr F0 ; Flag 0 in PSW - ; available to user for general purpose - mov a,a1 - jnb acc.7,a_not_negative + __asm + + #define a0 dpl + #define a1 dph + + .globl __modsint +#if defined(SDCC_PARMS_IN_BANK1) + #define b0 (b1_0) + #define b1 (b1_1) +#else + // _modsint_PARM_2 shares the same memory with _moduint_PARM_2 + // and is defined in _moduint.c + #define b0 (__modsint_PARM_2) + #define b1 (__modsint_PARM_2 + 1) +#endif +__modsint: + ; a1 in dph + ; b1 in (__modsint_PARM_2 + 1) - setb F0 + clr F0 ; Flag 0 in PSW + ; available to user for general purpose + mov a,a1 + jnb acc.7,a_not_negative - clr a - clr c - subb a,a0 - mov a0,a - clr a - subb a,a1 - mov a1,a + setb F0 - a_not_negative: + clr a + clr c + subb a,a0 + mov a0,a + clr a + subb a,a1 + mov a1,a - mov a,b1 - jnb acc.7,b_not_negative +a_not_negative: - cpl F0 + mov a,b1 + jnb acc.7,b_not_negative - clr a - clr c - subb a,b0 - mov b0,a - clr a - subb a,b1 - mov b1,a + clr a + clr c + subb a,b0 + mov b0,a + clr a + subb a,b1 + mov b1,a - b_not_negative: +b_not_negative: - lcall __moduint + lcall __moduint - 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,a0 + mov a0,a + clr a + subb a,a1 + mov a1,a - not_negative: - ret +not_negative: + ret - _endasm ; + __endasm; } #elif defined _MODSINT_ASM_SMALL_AUTO static void -_modsint_dummy (void) _naked +_modsint_dummy (void) __naked { - _asm - - #define a0 dpl - #define a1 dph + __asm - ar0 = 0 ; BUG register set is not considered - ar1 = 1 + #define a0 dpl + #define a1 dph - .globl __modsint + ar0 = 0 ; BUG register set is not considered + ar1 = 1 - __modsint: + .globl __modsint - clr F0 ; Flag 0 in PSW - ; available to user for general purpose - mov a,a1 - jnb acc.7,a_not_negative +__modsint: - setb F0 + clr F0 ; Flag 0 in PSW + ; available to user for general purpose + mov a,a1 + jnb acc.7,a_not_negative - clr a - clr c - subb a,a0 - mov a0,a - clr a - subb a,a1 - mov a1,a + setb F0 - a_not_negative: + clr a + clr c + subb a,a0 + mov a0,a + clr a + subb a,a1 + mov a1,a - mov a,sp - add a,#-2 ; 2 bytes return address - mov r0,a ; r0 points to b1 - mov a,@r0 ; b1 +a_not_negative: - jnb acc.7,b_not_negative + mov a,sp + add a,#-2 ; 2 bytes return address + mov r0,a ; r0 points to b1 + mov a,@r0 ; b1 - cpl F0 + jnb acc.7,b_not_negative - 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 ; b0 + mov @r0,a + clr a + inc r0 + subb a,@r0 ; b1 + mov @r0,a - b_not_negative: +b_not_negative: - mov ar1,@r0 ; b1 - dec r0 - mov ar0,@r0 ; b0 + mov ar1,@r0 ; b1 + dec r0 + mov ar0,@r0 ; b0 - lcall __modint + lcall __modint - 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,a0 + mov a0,a + clr a + subb a,a1 + mov a1,a - not_negative: - ret +not_negative: + ret - _endasm ; + __endasm; } #else // _MODSINT_ASM_ @@ -204,7 +203,7 @@ int _modsint (int a, int b) r = _moduint((a < 0 ? -a : a), (b < 0 ? -b : b)); - if ( (a < 0) ^ (b < 0)) + if (a < 0) return -r; else return r;