Hola, buen día!
1) Cuando la interrupción se da ¿es porque tocaron el carácter ESC?, Pregunto porque entonces para leer <2> ¿Se hace en dos interrupciones separadas o como me llega la información por un único byte TECLA?. Ademas, si es asi por dos etapas, ¿como me doy cuenta hasta que ingresan la 2º tecla si era un ESC solo o iba acompañado de algo mas?
La interrupción del teclado se da cuando se presiona cualquier tecla. En el byte de TECLA puede venir ESC, 1, 2, 3, o cualquier otro carácter válido. O sea que, sí, para poder cambiar desde el programa principal a una rutina tienen que ocurrir 2 interrupciones, la primera tiene que ser porque se presionó ESC, y la siguiente tiene que ser porque se presionó 1, 2 o 3. En este sentido, hay que usar variables para recordar qué pasó en la última interrupción, como mínimo tenés que tener una variable que recuerde si la última tecla presionada fue ESC, porque si en la rutina recibís un 1, pero la última tecla presionada no fue ESC, entonces ese 1 se debe ignorar. Por el contrario, si la última tecla presionada fue ESC, entonces hay que saltar a la rutina 1.
2) En el ejemplo que da en el mensaje de arriba parece que la rutina 2 termina por si sola, ¿Esta termina en realidad porque se ejecuto ESC?
Capaz no me quedó claro el diagrama, pero no, lo que intenté mostrar es que de la rutina 2 se salta a la interrupción, y la única manera de cambiar el flujo hacia una interrupción (en esta asignatura, al menos), es mediante la ocurrencia de una interrupción. O sea que no, la rutina 2 no termina por sí sola, la asumimos infinita.
3) Se podrían ejecutar rutinas tras rutinas? Algo así como Rutina 1, Rutina 2, y luego de hacer ESC a la rutina 2, volver en donde se quedo la 1?, o solo se puede ir a un nivel de profundidad.
Pregunto esto ultimo porque yo estaba pensando en implementar una pila para mantener las direcciones y luego iras retomando. Pero no me queda claro del todo si eso es lo que se busca.
No, si estás en la rutina 1, 2 o 3 solo se puede volver al programa principal. Esto lo podés deducir porque para saltar hacia una rutina tenés que presionar ESC y luego un número, pero para volver al principal se realiza solo con ESC. De este modo, si estás en una rutina, no podés saltar hacia otra porque al presionar ESC ya volvés hacia el programa principal.
4) una vez que llamo a jmp para llamar a la otra rutina, ¿deberia ejecutar enabled()? Porque si no lo hago en realidad no se debería ejecutar de nuevo la interrupción para cancelar la rutina recién llamada. Pero si hago esto, ¿no corro el riesgo que justo apenas hago enabled() antes de llamar a jmp, aparezca alguna interrupción y no me permita llegar al jmp?
Bien pensado! Muestra un buen nivel de entendimiento que te hayas dado cuenta de esto :). No es necesario, suponé que la función
jmp() también habilita las interrupciones para evitar este problema. Lo normal es que al regresar de una interrupción, se use una instrucción especial de la arquitectura que incluya la habilitación de las interrupciones (en x86 se llama IRET).
Saludos,
Federico