Using C51 (v6.xx/7.xx) with user defined bank switching (mode 4), which registers must be preserved on the call and return?
R1-R7 must be preserved on the call & return, since these pass parameters & return values.
The carry flag must be preserved on return, since it may return a bit value.
Examining Keil code & examples, it seems that it's ok to trash ACC and DPTR.
What about R0, B and other flags?
I couldn't find anything explicit in the documentation, so have currently taken a conservative position with my (rather complicated) bank switching routine.