Hola amigos!
Este es mi primer post en este foro, y estoy convencido de que no será el último.
Les comentos lo que ando haciendo, cómo y porqué:
Antes de nada, he de decir que estoy trabajando bajo el sistema operativo Free-Dos y empleo el compilador tcc (versión 2.0). Estoy haciendo un programa muy sencillo en C que sustituye la RTI del teclado por una mía propia. Ya tengo realizada la RTI, que ahora mismo permite únicamente la salida de un bucle pero en un futuro incorporará el código necesario para ir realizando tareas con las telcas pulsadas.
Mi problema viene ahora: cuando hecho a andar mi aplicación ya compilada y la pruebo (únicamente con la funcionalidad de salir del bucle) funciona bien, es decir, el programa espera a que se produzca una interrupción de telcado para continuar. Pero cuando se produce dichar interrupción, vuelve al dos pero el teclado está como "deshabilitado". Ya le he dado mil vueltas a mi problema, llevo casi 4 días probando soluciones posibles y no doy con el por qué del problema. Les adjunto el código para que lo puedan examinar y me puedan decir alguna solución o alguna pista que me diga por donde pueden ir los tiros. No sé si estoy en lo cierto pero, puede que sea algún problema de mala configuración del PIC. La verdad, estoy muy desesperado ya.
Muchas Gracias y Saludos a tod@s.
/*Declaraci¢n de Funciones*/
void interrupt (*vieja)();
void interrupt RTI();
void guardaRutina();
void restableceRutina();
/*Variables Globales*/
int salir = 0;
void main(void){
/*Variables Locales*/
int x,y;
/*Bucle de Retardo*/
x = 9999;
while (x!=0){
y = 9999;
while (y!=0){
y = y - 1;
}
x = x - 1;
}
x = 9999;
while (x!=0){
y = 9999;
while (y!=0){
y = y - 1;
}
x = x - 1;
}
/*Guardamos el vector de interrupci¢n*/
guardaRutina();
while (!salir){ /*Bucle infinito*/
}
/*Recuperamos la RTI del teclado*/
restableceRutina();
}
void guardaRutina(){
disable(); /*Deshabilitamos las interrupciones*/
vieja = getvect(0x09); /*Tomamos la RTI correspondiente al teclado*/
setvect(0x09, RTI); /*Establecemos nuestra RTI para el teclado*/
enable(); /*Volvemos a habilitar las interrupciones*/
}
void restableceRutina(){
disable();
setvect(0x09, vieja);
enable();
}
void interrupt RTI(){
salir = 1; /*Para salir del bucle infinito*/
outportb(0x20,0x20); /*Para indicar el EOI*/
}