El compilador C30 espera que una subrutina conserve W8-W15, pero puede eliminar W0-W7. Por lo tanto, solo necesita guardar / restaurar W8-W14 si va a utilizarlos. De lo contrario, si puede arreglárselas con W0-W7 para cero, entonces no hay necesidad de guardar / restaurar nada.
Tenga en cuenta que nunca ha empujado / pop explícitamente W15 ya que ese es el puntero de pila. La forma de guardarlo / restaurarlo es sacar la misma cantidad de cosas de la pila que empuja sobre ella, incluida la dirección de retorno de subrutina que generalmente se extrae al ejecutar RETURN.
Configuré el modo C30 para que no use marcos de pila. Los marcos de apilamiento pueden ocasionalmente ser una ayuda para la depuración, pero de lo contrario son solo un desperdicio de espacio y ciclos. Hay una opción de línea de comando para el compilador C30 que le impide usar marcos de pila, y por lo tanto no emite las secuencias de enlace / desvinculación tontas. Hasta ahora siempre he usado eso y no he tenido problemas.
Otro problema con su código anterior es que olvidó declarar _FunctionName
global.