Amigo Zascandil:
Si puede hacerse en C puede hacerse en ASM y seguramente mejor, mas rápido, o mas eficiente o con mayor economía de medios.
El problema es saber cómo hacerlo. Yo se hacerlo en C ...
En el Libro Gordo del C (el Manual del CCS C) aparece el siguiente significativo ejemplo (Página 89):
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC)
#use rs232(baud=1200,xmit=pin_b1,rcv=pin_b0,stream=GPS)
#use rs232(baud=9600,xmit=pin_b3,stream=DEBUG)
...
while(TRUE) {
c=fgetc(GPS);
fputc(c,HOSTPC);
if(c==13)
fprintf(DEBUG,"Got a CR\r\n");
}
Como puedes ver define tres "canales" RS232 que usa de forma indistinta. El compilador genera el ASM/HEX correspondiente de forma que: Si la definición del "canal" es USART compatible solo coloca el código correspondiente para manejarla, si no lo és colocará el código necesario y suficiente para simularla por software.
Las tres deben funcionar correctamente pero las simuladas ocuparán mas, o mucho mas, espacio y recursos del micro que la real de la USART. Esto tambien conlleva el hecho de que el programa va a resultar mucho mas grande, con lo que puede ser posible que no quepa realmente en la disponible en el micro.
Además sospecho (no lo tengo por absolutamente cierto) que las interrupciones de recepción y transmisión solo funcionarán con el "canal" USART compatible.
"En principio" es posible, lo que habría que ver es si en realidad tambien lo es.
Un saludo.