Dejo las funciones más significativas para operar con cadenas, he optado por trabajar con direcciones de memoria porque el código sale más reducido.
Si hay alguna duda sobre algo, pues por aquí estaré.
Los vectores se definen en las ultimas posiciones de memoria para que no sean ocupados por las declaraciones normales de variables que tienden a ocupar las primeras posiciones, y tienen que ser direcciones consecutivas. El código de control ASII 0 indica fin de cadena, pues para declarar una variable tipo vector de una longitud de 10 elementos se necesitan 11 bytes para que pueda ser gestionada por las funciones. En realidad todo esto se hace mas o menos de esta forma para cualquier lenguaje lo que ocurre es que el compilador nos lo oculta.
Los elementos de los vectores se nombran de la forma tradicional comenzando con el 0, 1, ..., hasta el final = (strlen-1). Es decir que el 0 cuenta.
'******************************************************************************
'Funciones para operar con cadenas cadenas
'By Dogflu66, 11/11.
'Basic del Pic Simulator IDE (PSI).
'******************************************************************************
'Puertos del LCD para simulador************************************************
Define LCD_BITS = 4 'Bus de datos del lcd a 4bit
Define LCD_DREG = PORTA 'Bus de datos el puerto A
Define LCD_DBIT = 0 'Bus datos los 4 bit menos significativos, puerto A
Define LCD_RSREG = PORTB 'Bit de control RS a puerto B
Define LCD_RSBIT = 7 'Se usa RB7 como RS
Define LCD_EREG = PORTB 'Bit de control E del puerto B
Define LCD_EBIT = 6 'Se usa RB6 como E
Define LCD_COMMANDUS = 100 '2000 'Espera despues de ejecutar comando lcd, uSeg.
Define LCD_DATAUS = 50 'Espera despues de enviar un dato al LCD, uSeg.
Define LCD_INITMS = 5 '50 'Espera despues de inicializar el Display
'******************************************************************************
Define SIMULATION_WAITMS_VALUE = 1 'Ignora los valores de Waitms
'*****************************************************************
Dim clave As Byte @ 0x12f 'Se declara variable en la dirección establecida
Dim nombre As Byte @ 0x13a 'Se declara variable en la dirección establecida
Dim apellido As Byte @ 0x145 'Se declara variable en la dirección establecida
Dim p_clave As Word 'Variable que apunta a otra variable
Dim p_nombre As Word 'Variable que apunta a otra variable
Dim p_apellido As Word 'Variable que apunta a otra variable
p_clave = 0x12f 'p_clave apunta a clave
p_nombre = 0x13a 'p_nombre apunta a nombre
p_apellido = 0x145 'p_apellido apunta a apellido
Lcdinit 'Incializa el LCD
main:
Call strclr(p_clave) 'Inicializa/Borra la variable
Call strcdn(p_clave, 0) 'Asigna la cadena 0 a la variable
Call strcdn(p_nombre, 1) 'Asigna la cadena 1 a la variable
Call strcdn(p_apellido, 2) 'Asigna la cadena 2 a la variable
Call strchr(p_nombre, 0) 'Devuelve el caracter indicado en strchr
Call strlen(p_apellido) 'Devuelve en strlen la longitud de la cadena
Call strcpy(p_nombre, p_clave) 'Convierte la primera en la segunda
Call strcmp(p_nombre, p_clave) 'Compara dos cadenas, strcmp = 0 (diferentes), = 1 (iguales)
Lcdout "Clave:" 'Imprime en el LCD
Call strlen(p_nombre) 'Extrae la longitud de la cadena
Call strlcd(p_nombre, 0, strlen) 'Imprime en el LCD la cadena
'Goto main
End
'Asigna la cadena a la variable elegida
Proc strcdn(direccion As Word, valor As Byte)
Dim indice As Byte 'Indica el elemento de la lista
Dim paso As Byte 'Contendrá el elemento de la lista segun el indice
Dim x As Bit 'Variable auxiliar
x = 1
indice = 0
While x = 1 'Bucle de asignación
If valor = 0 Then paso = LookUp("123456", 0), indice
If valor = 1 Then paso = LookUp("Todopic", 0), indice
If valor = 2 Then paso = LookUp("Basic", 0), indice
Pointer(direccion) = paso 'Asigna el valor de paso a la dirección que hace referencia variable
If paso = 0 Then Exit 'Fin del Proc
indice = indice + 1 'Incrementa indice
direccion = direccion + 1 'Apunta a la siguiente dirección del vector seleccionado
Wend
End Proc
'Devuelve el caracter especificado, de izquierda a derecha
'El numero de orden para el primer caracter es el cero
Function strchr(direccion As Word, valor As Byte) As Byte
strchr = 0
direccion = direccion + valor 'Calcula la posición del caracter
strchr = Pointer(direccion) 'Extra el caracter de la posición
End Function
'Devuelve en strlen la longitud de la cadena,
'no incluye el caracter fin de cadena
Function strlen(direccion As Word) As Byte
Dim paso As Byte
Dim x As Bit
x = 1
strlen = 0
While x = 1
paso = Pointer(direccion) 'Lee valor
If paso = 0 Then Exit 'Sale de la Function
strlen = strlen + 1 'Incrementa longuitud
direccion = direccion + 1 'Incrementa posición
Wend
End Function
'Copia la segunda variable en la primera
Proc strcpy(direccion As Word, direccion1 As Word)
Dim paso As Byte
Dim x As Bit
x = 1
While x = 1
paso = Pointer(direccion1)
Pointer(direccion) = paso
If paso = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Proc
'Compara las dos variables, devuelve strcmp = 0 si no son iguales
'devuelve strcmp = 1 si son iguales.
Function strcmp(direccion As Word, direccion1 As Word) As Byte
Dim paso As Byte
Dim paso1 As Byte
Dim x As Bit
strcmp = 0
x = 1
While x = 1
paso = Pointer(direccion)
paso1 = Pointer(direccion1)
If paso = paso1 Then strcmp = 1
If paso <> paso1 Then
strcmp = 0
Exit
Endif
If paso = 0 Or paso1 = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Function
'Borra o inicializa la variable
Proc strclr(direccion As Word)
Pointer(direccion) = 0 'Asigna a la primera posición fin de cadena
End Proc
'Envia la cadena al LCD, apartir de inicio y tantos caracteres como marque numero
'Si numero = 0 es lo mismo = 1.
Proc strlcd(direccion As Word, inicio As Byte, numero As Word)
Dim paso As Byte
Dim x As Bit
x = 1
direccion = direccion + inicio 'Dirección del primer elemento de la variable
While x = 1
paso = Pointer(direccion) 'Lee valor
Lcdout paso
If paso = 0 Then Exit 'Sale de la Function
If numero > 0 Then numero = numero - 1 'Decrementa caracteres pendientes
If numero = 0 Then Exit 'Sale de la Función
direccion = direccion + 1 'Incrementa posición
Wend
End Proc

PD. También se pueden declarar los vectores de la forma tradicional, ejemplo: Dim clave(10) as byte, y con una rutina al inicio los rastrea hasta que les encuentra su ubicación en la memoria y, les extrae sus direcciones de memoria de inicio asignandolas posteriormente de forma automatica. Pero el problema que tiene esta rutina es que es muy larga y consume mucha memoria de código, es muy simple pero usa mucho código redundante para cada variable, eso si, solo habría que ejecutarla una solo vez al principio.
Nota: (10/12/2011) De aquí se puede descargar la última versión:
http://www.todopic.com.ar/foros/index.php?topic=14917.msg307598#msg307598