Hola!
y en vez de usar la instruccion SWAPF, no se podria usar la instruccion MOVELW? Tampoco afecta al registro Z.
Supongo que te referirás a la instrucción MOVLW. No es posible. La instrucción MOVLW sirve para cargar un LITERAL, es decir un valor pre-establecido. No permite cargar un valor no estático y el contenido de STATUS siempre varía. El movlw carga siempre un valor que tú eliges a la hora de programación. No se puede modificar el valor a cargar en W utilizando la movlw durante la ejecución en el pic(deberías sobrescribir la flash).
Ok, no me habia dado cuenta que al guardar NO hace SWAP, pero lo hace unas instrucciones mas adelante sobre el valor guardado, por eso al recuperar el contexto le vuelve a hacer el SWAP.
Aun asi sigo sin entender que importancia tiene modificar el registro Z, en realidad al guardar los registros del 0x20 al 0x24 lo hace con MOVF y MOVWF, con lo que estan modificando Z.
Lo importante no es NO modificarlo. Lo importante es no modificarlo mientras lo guardás o lo restaurás. Es decir, los registros clave deben valer al retornar de la interr. exáctamente lo mísmo que valían antes de ingresar a la ISR.
Si mi programa no usa esas posiciones de memoria, puedo omitir salvar el contexto de dichas posiciones, y tambien omitir restaurarlas? Me ahorro 10 instrucciones en la entrada y otras 10 en la salida de la interrupcion!
Podés. Siempre y cuando el programa no las use, volalas tranquilo.
Como le dije a pali, estoy usando MPLAB para hacer todo esto, escribo el codigo en C, y al compilarlo debuggeo el ASM que genera. Entonces tendre que modificar ese ASM generado, no? No puedo hacer los cambios directamente desde C supongo... 
Y..no veo otra manera, al menos desde lo que conozco. El problema es que no exíste una función en C referida a la ISR como para que puedas al menos inyectar los NOP desde código C. Tal vez usando el #asm y el org 0xXXX puedas hacer algo desde C pero no se si no te pisarás con el compilador...
Sigo mirando el codigo y hay otras cosas que no entiendo....
*Por que en la linea 20 da la instruccion de pasar al Register Bank 0, si ya comprueba que esta en el banco 0 en la linea 4, y desde entonces no hay ninguna instruccion que cambie de banco. ¿?
Está de mas. Podés sacarla tranquilo. Es mas: hay varias que se podrían unir y hacer el código más corto por lo que veo...
*En la linea 12 pone a 0 el bit IRP de Status. Pero en el datasheet dice que no toquemos ese bit. Para que sirve?
El bit IRP sirve sólo en uC que poseen más de 256 registros RAM. Sirve para acceder a los registros superiores de la RAM mediante direccionamiento indirecto(registros FSR e INDF). Como este uC que estás usando no posee más de 256 registros, no deberías tocarlo. Conclusión. Podés eliminar esa línea también.
*No entiendo muy bien que funcion cumplen las lineas 23 y 29? Segun el datasheet leer indirectamente el registro INDF devolvera 00h... ¿leer indirectamente?
Para comprenderlas, debés aprender sobre el direccionamiento indirecto y las lineas previas a las que desconocés su función.
...
021 308C MOVLW 0x8c
022 0084 MOVWF 0x4
023 1C00 BTFSS 0, 0
024 2827 GOTO 0x27
025 180C BTFSC 0xc, 0
026 2850 GOTO 0x50
027 308C MOVLW 0x8c
028 0084 MOVWF 0x4
029 1C80 BTFSS 0, 0x1
...
Se transforma directamente(con palabras un poco más legibles) en:
...
021 308C MOVLW PIE1
022 0084 MOVWF FSR
023 1C00 BTFSS INDF, 0
024 2827 GOTO 0x27
025 180C BTFSC PIR1, TMR1IF
026 2850 GOTO 0x50
027 308C MOVLW PIE1
028 0084 MOVWF FSR
029 1C80 BTFSS INDF,1
...
Y ahora yo la paso de assembler a español

021 308C MOVLW PIE1 ;(Cargo en W la dirección a la cual quiero acceder de manera indirecta...es decir, 0x8C)
022 0084 MOVWF FSR ;(la copio al registro FSR. Entonces, ahora al leer INDF, hacé de cuenta que estoy leyendo en realidad el registro 0x8C. Esto es básicamente el direccionamiento indirecto)
023 1C00 BTFSS INDF, 0 ;(esto sería como hacer entonces... btfss PIE1,TMR1IE) = Interrupción de timer1 habilitada?
024 2827 GOTO 0x27 ;no, ir a 0x27
025 180C BTFSC PIR1, TMR1IF ;Si. Ahora, btfsc PIR1,TMR1IF) = La bandera de interrupción del timer1 NO se ha producido?
026 2850 GOTO 0x50 ;Se ha producido, ir a 0x50
027 308C MOVLW PIE1 ;No. El timer1 no ha interrumpido. Mover nuevamente el valor 0x8C a W
028 0084 MOVWF FSR ;y nuevamente apunta rindirectamente a él(estas dos podrías sacarse creo)
029 1C80 BTFSS INDF,1 ;(esto sería como hacer entonces... btfss PIE1,TMR2IE) = Interrupción de timer2 habilitada?
...
Y sigue..
Saludos.