el problema es que las funciones de alto nivel del CCS ya te consumen mas que hacerlo manualmente, has puesto el ejemplo de codigo, en C30 seria tan facil como
AD1CON1bits.ADON=0;
ANSELA = ANSELB = ANSELC = ANSELD = ANSELE = ANSELG = 0;
T1CON=TMR_INTERNAL|TMR_DIV_BY_256;
T2CON=TMR_INTERNAL|TMR_DIV_BY_8;
T4CON=TMR_INTERNAL;
TRISC=0b11000101;
TRISE=0b11000011;
TRISF=0;
como ves, tampoco es nada del otro mundo, y te ahorras unos buenos tcy ya que las funciones de alto nivel de CCS se usan por CALL y RETURN
Y tambien veo el problema en que el CCS te controla todo lo que son las interrupciones, creo que de esto no se puede cambiar nada ya que es propio del compilador, muchas veces he visto que el mismo CCS te borra las flags y todo eso automaticamente, el problema nose si en caso de que si no deseas hacerlo asi se pueda cambiar, en los pics de 8bits se que el vector lo creaba el propio compilador de CCS y luego cuando tu creabas alguna funcion con #INT_RTCC por ejemplo, el compilador hacia un goto hacia la funcion que hayas creado, como puedes crear muchas funciones la funcion que crea el compilador debe examinar de que flag viene y luego enviarte hacia esa direccion.
Yo lo veo claro, CCS para aprender, o proyectos pequeños de poca precision lo veo bien. Sin embargo para proyectos grandes, donde la optimizacion es una prioridad, y donde se requiera mucha precision C30, para algo superior ASM30