Haber...
estas interrupciones son algo especiales de tratar, en especial cuando usas pulsadores para este cato, porque el ruido por rebote es inevitable y difícil de tratar. Lo mejor que puedes hacer es seguir este
hilo, ya se que no es tu caso seguramente, porque no utilizas un teclado matricial, pero lo que sirve es la idea del antirrebote y la exploración de las teclas, sean estas en teclado o pulsadores independientes
Respondiendo a tus preguntas:
1. No, el CCS no guarda ningún registro, así que cualquiera qeu sea de tu utilidad lo debes hacer manualmente tu, como la interrupción es por el nibble alto del puerto B, te recomiendo que guardes el valor del puerto para que despes de ver que se pulso hagas lo que corresponda
2. No hace falta.
3. Eso si hace falta, no es solo leerlo, es sobreescribir el valor leído en el puerto, yo lo hago de esta manera, puede ir al final de tu rutina de interrupción, o el mejor lugar que tu veas:
output_b(input_b());
clear_interrupt(int_rb); // RBIF = 0 limpia la bandera, quizá ya no haga falta, prueba quitándolo si funciona o no
El RBIF es la bandera de interrupción por variación de RB4-7, que se pone en uno cuando ocurre la interrupción, las otras interrupciones tienen sus banderas respectivas, que son por ejemplo T0IF que es del Timer0.
espero pueda servirte, un saludo