The C30 compiler expects a subroutine to preserve W8-W15 but it may trash W0-W7. You therefore only need to save/restore W8-W14 if you are going to use them. Otherwise if you can make do with W0-W7 for scratch, then there is no need to save/restore anything.
Note that you never explicitly push/pop W15 since that's the stack pointer. The way to save/restore it is to pop the same amount of stuff off the stack that you push onto it, including the subroutine return address which is generally popped by executing RETURN.
I set the C30 mode to not use stack frames. Stack frames can occasionally be a aid in debugging, but otherwise they are just a waste of space and cycles. There is a command line option to the C30 compiler which prevents it from using stack frames, and therefore doesn't emit the silly link/unlink sequences. I have so far always used that and not had problems.
One other issue with your code above is that you forgot to declare