* device/lib/_strlen.c: assembler version for mcs51
[fw/sdcc] / device / lib / _strlen.c
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