* device/include/z180.h,
[fw/sdcc] / device / lib / _mulint.c
index 69a7cd41ab0a6e24d1182d26f25b33480c42db28..387585c02b16b67075decfc889f76c969ac268f4 100644 (file)
@@ -1,35 +1,30 @@
 /*-------------------------------------------------------------------------
 /*-------------------------------------------------------------------------
-
-  _mulint.c :- routine for (unsigned) int (16 bit) multiplication               
+  _mulint.c :- routine for (unsigned) int (16 bit) multiplication
 
              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1999)
 
 
              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1999)
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
+   This library is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published by the
    Free Software Foundation; either version 2, or (at your option) any
    later version.
    Free Software Foundation; either version 2, or (at your option) any
    later version.
-   
-   This program is distributed in the hope that it will be useful,
+
+   This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-   
-   You should have received a copy of the GNU General Public License
+   GNU Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public License
    along with this program; if not, write to the Free Software
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    along with this program; if not, write to the Free Software
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-   
+
    In other words, you are welcome to use, share and improve this program.
    You are forbidden to forbid anyone else to use, share and improve
    In other words, you are welcome to use, share and improve this program.
    You are forbidden to forbid anyone else to use, share and improve
-   what you give them.   Help stamp out software-hoarding!  
+   what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
 
 /* Signed and unsigned multiplication are the same - as long as the output
    has the same precision as the input.
 
 -------------------------------------------------------------------------*/
 
 /* Signed and unsigned multiplication are the same - as long as the output
    has the same precision as the input.
 
-   To do: _muluint and _mulsint should be replaced by _mulint.
-
-   bernhard@bernhardheld.de
-
    Assembler-functions are provided for:
      ds390
      mcs51 small
    Assembler-functions are provided for:
      ds390
      mcs51 small
      mcs51 large
 */
 
      mcs51 large
 */
 
-#if !defined(SDCC_USE_XSTACK) || defined(_SDCC_NO_ASM_LIB_FUNCS)
+#if !defined(SDCC_USE_XSTACK) && !defined(_SDCC_NO_ASM_LIB_FUNCS)
 #  if defined(SDCC_ds390)
 #    if !defined(SDCC_STACK_AUTO)
 #      define _MULINT_ASM_LARGE
 #    endif
 #  elif defined(SDCC_mcs51)
 #    if defined(SDCC_MODEL_SMALL)
 #  if defined(SDCC_ds390)
 #    if !defined(SDCC_STACK_AUTO)
 #      define _MULINT_ASM_LARGE
 #    endif
 #  elif defined(SDCC_mcs51)
 #    if defined(SDCC_MODEL_SMALL)
-#      if defined(SDCC_STACK_AUTO)
+#      if defined(SDCC_STACK_AUTO) && !defined(SDCC_PARMS_IN_BANK1)
 #        define _MULINT_ASM_SMALL_AUTO
 #      else
 #        define _MULINT_ASM_SMALL
 #        define _MULINT_ASM_SMALL_AUTO
 #      else
 #        define _MULINT_ASM_SMALL
 #  endif
 #endif
 
 #  endif
 #endif
 
-#ifdef _MULINT_ASM_LARGE
+#if defined(_MULINT_ASM_LARGE)
 
 
-unsigned int
-_muluint (unsigned int a, unsigned int b)      // in future: _mulint
+#pragma save
+#pragma less_pedantic
+int
+_mulint (int a, int b)
 {
   a*b; // hush the compiler
 
 {
   a*b; // hush the compiler
 
@@ -70,26 +67,38 @@ _muluint (unsigned int a, unsigned int b)   // in future: _mulint
       (char)(lsb_a*msb_b)<<8
   */
 
       (char)(lsb_a*msb_b)<<8
   */
 
-  _asm 
+  _asm
     mov r2,dph ; msb_a
     mov r3,dpl ; lsb_a
 
     mov b,r3 ; lsb_a
     mov r2,dph ; msb_a
     mov r3,dpl ; lsb_a
 
     mov b,r3 ; lsb_a
-    mov dptr,#__muluint_PARM_2
+#if defined(SDCC_PARMS_IN_BANK1)
+    mov a,b1_0
+#else
+    mov dptr,#__mulint_PARM_2
     movx a,@dptr ; lsb_b
     movx a,@dptr ; lsb_b
+#endif
     mul ab ; lsb_a*lsb_b
     mov r0,a
     mov r1,b
 
     mov b,r2 ; msb_a
     mul ab ; lsb_a*lsb_b
     mov r0,a
     mov r1,b
 
     mov b,r2 ; msb_a
+#if defined(SDCC_PARMS_IN_BANK1)
+    mov a,b1_0
+#else
     movx a,@dptr ; lsb_b
     movx a,@dptr ; lsb_b
+#endif
     mul ab ; msb_a*lsb_b
     add a,r1
     mov r1,a
 
     mov b,r3 ; lsb_a
     mul ab ; msb_a*lsb_b
     add a,r1
     mov r1,a
 
     mov b,r3 ; lsb_a
+#if defined(SDCC_PARMS_IN_BANK1)
+    mov a,b1_1
+#else
     inc dptr
     movx a,@dptr ; msb_b
     inc dptr
     movx a,@dptr ; msb_b
+#endif
     mul ab ; lsb_a*msb_b
     add a,r1
 
     mul ab ; lsb_a*msb_b
     add a,r1
 
@@ -98,63 +107,58 @@ _muluint (unsigned int a, unsigned int b)  // in future: _mulint
     ret
   _endasm;
 }
     ret
   _endasm;
 }
+#pragma restore
 
 
-int
-_mulsint (int a, int b)                // obsolete
-{
-  return _muluint (a, b);
-}
-
-#elif defined _MULINT_ASM_SMALL || defined _MULINT_ASM_SMALL_AUTO
+#elif defined(_MULINT_ASM_SMALL) || defined(_MULINT_ASM_SMALL_AUTO)
 
 
-void
+#pragma save
+#pragma less_pedantic
+int
 _mulint_dummy (void) _naked
 {
        _asm
 
        __mulint:
 _mulint_dummy (void) _naked
 {
        _asm
 
        __mulint:
-       __muluint:                              ; obsolete
-       __mulsint:                              ; obsolete
 
                .globl __mulint
 
                .globl __mulint
-               .globl __muluint                ; obsolete
-               .globl __mulsint                ; obsolete
 
 
-#if !defined(SDCC_STACK_AUTO)
+#if !defined(SDCC_STACK_AUTO) || defined(SDCC_PARMS_IN_BANK1)
 
 
-#if defined(SDCC_NOOVERLAY)            // BUG SDCC_NOOVERLAY is not set by -no-overlay
+#if defined(SDCC_NOOVERLAY)
                .area DSEG    (DATA)
 #else
                .area OSEG    (OVR,DATA)
 #endif
                .area DSEG    (DATA)
 #else
                .area OSEG    (OVR,DATA)
 #endif
-
+#if defined(SDCC_PARMS_IN_BANK1)
+       #define bl      (b1_0)
+       #define bh      (b1_1)
+#else
+       #define bl      (__mulint_PARM_2)
+       #define bh      (__mulint_PARM_2 + 1)
        __mulint_PARM_2:
        __mulint_PARM_2:
-       __muluint_PARM_2:                       ; obsolete
-       __mulsint_PARM_2:                       ; obsolete
 
                .globl __mulint_PARM_2
 
                .globl __mulint_PARM_2
-               .globl __muluint_PARM_2         ; obsolete
-               .globl __mulsint_PARM_2         ; obsolete
 
                .ds     2
 
                .ds     2
+#endif
 
                .area CSEG    (CODE)
 
                ; globbered registers none
 
                mov     a,dpl                   ;  1  al
 
                .area CSEG    (CODE)
 
                ; globbered registers none
 
                mov     a,dpl                   ;  1  al
-               mov     b,__mulint_PARM_2       ;  2  bl
+               mov     b,bl                    ;  2  bl
                mul     ab                      ;  4  al * bl
                xch     a,dpl                   ;  1  store low-byte of return value, fetch al
                push    b                       ;  2
 
                mul     ab                      ;  4  al * bl
                xch     a,dpl                   ;  1  store low-byte of return value, fetch al
                push    b                       ;  2
 
-               mov     b,__mulint_PARM_2 + 1   ;  2  bh
+               mov     b,bh                    ;  2  bh
                mul     ab                      ;  4  al * bh
                pop     b                       ;  2
                add     a,b                     ;  1
                xch     a,dph                   ;  1  ah -> acc
 
                mul     ab                      ;  4  al * bh
                pop     b                       ;  2
                add     a,b                     ;  1
                xch     a,dph                   ;  1  ah -> acc
 
-               mov     b,__mulint_PARM_2       ;  2  bl
+               mov     b,bl                    ;  2  bl
                mul     ab                      ;  4  ah * bl
                add     a,dph                   ;  1
                mov     dph,a                   ;  1
                mul     ab                      ;  4  ah * bl
                add     a,dph                   ;  1
                mov     dph,a                   ;  1
@@ -191,11 +195,12 @@ _mulint_dummy (void) _naked
                mov     dph,a                   ;  1
 
                ret
                mov     dph,a                   ;  1
 
                ret
-       
+
 #endif // SDCC_STACK_AUTO
 
        _endasm ;
 }
 #endif // SDCC_STACK_AUTO
 
        _endasm ;
 }
+#pragma restore
 
 #else
 
 
 #else
 
@@ -204,18 +209,18 @@ union uu {
         unsigned int t;
 } ;
 
         unsigned int t;
 } ;
 
-unsigned int
-_muluint (unsigned int a, unsigned int b)      // in future: _mulint
+int
+_mulint (int a, int b)
 {
 {
-#ifdef SDCC_MODEL_LARGE                // still needed for large + stack-auto
-       union uu _xdata *x;
-       union uu _xdata *y; 
+#if !defined(SDCC_STACK_AUTO) && (defined(SDCC_MODEL_LARGE) || defined(SDCC_ds390))    // still needed for large
+       union uu xdata *x;
+       union uu xdata *y;
        union uu t;
        union uu t;
-        x = (union uu _xdata *)&a;
-        y = (union uu _xdata *)&b;
+        x = (union uu xdata *)&a;
+        y = (union uu xdata *)&b;
 #else
        register union uu *x;
 #else
        register union uu *x;
-       register union uu *y; 
+       register union uu *y;
        union uu t;
         x = (union uu *)&a;
         y = (union uu *)&b;
        union uu t;
         x = (union uu *)&a;
         y = (union uu *)&b;
@@ -225,12 +230,6 @@ _muluint (unsigned int a, unsigned int b)  // in future: _mulint
         t.s.hi += (x->s.lo * y->s.hi) + (x->s.hi * y->s.lo);
 
        return t.t;
         t.s.hi += (x->s.lo * y->s.hi) + (x->s.hi * y->s.lo);
 
        return t.t;
-} 
-
-int
-_mulsint (int a, int b)                // obsolete
-{
-  return _muluint (a, b);
 }
 
 #endif
 }
 
 #endif