* device/lib/_strlen.c: assembler version for mcs51
authorfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 13 Mar 2007 15:15:38 +0000 (15:15 +0000)
committerfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 13 Mar 2007 15:15:38 +0000 (15:15 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4686 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
device/lib/_strlen.c

index 925a69c41d79cf90521fd9e272935c6ca63e4e4c..b405d227b51d60a475beffe1a1308d42c08c2829 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-03-13 Frieder Ferlemann <Frieder.Ferlemann AT web.de>
+
+       * device/lib/_strlen.c: assembler version for mcs51
+
 2007-03-13 Raphael Neider <rneider AT web.de>
 
        * device/include/pic16/pic18f2221.h,
index 6d0e9acdaba288f7a8725580d0aa540f88d0ce9a..e2cbf4280475cc2d32eca004cd93361f74ff89b5 100644 (file)
@@ -1,7 +1,8 @@
 /*-------------------------------------------------------------------------
-  _strcpy.c - part of string library functions
+  _strlen.c - part of string library functions
 
              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1999)
+                           mcs51 assembler by Frieder Ferlemann (2007)
 
    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
    You are forbidden to forbid anyone else to use, share and improve
    what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
-#include "string.h"
 
-int strlen ( char * str ) 
-{
-       register int i = 0 ;
+#if (!defined (SDCC_mcs51))
 
-       while (*str++) 
-               i++ ;
+  /* Generic routine first */
+  int strlen ( char * str )
+  {
+    register int i = 0 ;
 
-       return i;
-}
+    while (*str++)
+      i++ ;
+
+    return i;
+  }
+
+#else
+
+  /* Assembler version for mcs51 */
+  int strlen ( char * str ) __naked
+  {
+    str;     /* hush the compiler */
+
+    __asm
+      ; dptr holds pointer
+      ; b holds pointer memspace
+      ;
+
+      ; char *ptr = str:
+      mov     r2,dpl
+      mov     r3,dph
+      ;
+
+      ; while ( *ptr ) ptr++;
+    L00101$:
+      lcall   __gptrget
+      jz      L00102$
+      inc     dptr
+      sjmp    L00101$
+      ;
+
+    L00102$:
+      ; return ptr - str;
+      clr     c
+      mov     a,dpl
+      subb    a,r2
+      mov     dpl,a
+      ;
+      mov     a,dph
+      subb    a,r3
+      mov     dph,a
+      ;
+      ret
+    __endasm;
+  }
+
+#endif