Corríjanme si me equivoco, pero creo que el ejercicio dice que se llama a una interrupción cada vez que se presiona una tecla.
En ese caso se tendría que guardar una flag "apretoEsc" cuando se aprieta ESC y la próxima vez que se llame a la interrupción chequear si ese flag está prendido y si se apretó 1,2,3.
Mi solución es así:
bool ejecutandoRutina;
bool apretoEsc;
void interrupcion_tecla() {
char t = in(TECLA);
if (ejecutandoRutina) {
if (t == TECLA_ESC) {
ejecutandoRutina = false;
jmp(padr());
}
} else {
if (apretoEsc) {
if (t == TECLA_1)
gotoRutina(RUTINA1);
else if (t == TECLA_2)
gotoRutina(RUTINA2);
else if (t == TECLA_3)
gotoRutina(RUTINA3);
}
apretoEsc = (t == TECLA_ESC);
}
}
void gotoRutina(string nombreRutina) {
ejecutandoRutina = true;
jmp(radr(nombreRutina));
}