From: frief Date: Tue, 13 Mar 2007 15:15:38 +0000 (+0000) Subject: * device/lib/_strlen.c: assembler version for mcs51 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=018a6f8c8ded8202afb6e3eb0becf7b98e76a93c;p=fw%2Fsdcc * device/lib/_strlen.c: assembler version for mcs51 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4686 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 925a69c4..b405d227 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-03-13 Frieder Ferlemann + + * device/lib/_strlen.c: assembler version for mcs51 + 2007-03-13 Raphael Neider * device/include/pic16/pic18f2221.h, diff --git a/device/lib/_strlen.c b/device/lib/_strlen.c index 6d0e9acd..e2cbf428 100644 --- a/device/lib/_strlen.c +++ b/device/lib/_strlen.c @@ -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 @@ -21,14 +22,58 @@ 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