Supongo que tu programa lo estás realizando en modo Ms-Dos. Bien. El problema de utilizar las rutinas nativas del Dos en cuanto al manejo del teclado se refiere es que no están preparadas para el manejo de algo tan rápido y dinámico como pueda ser un videojuego. Desde el mismo día en que se crearon los PC's, están orientadas, al menos por defecto, únicamente a la introducción de datos en programas tales como bases de datos, editores/procesadores de texto, hojas de cálculo etc. El sistema empleado es el de buffer, es decir, una pequeña zona de memoria que guarda las últimas pulsaciones de teclas, con lo cuál cuando se satura (por ejemplo dejando pulsada una tecla o tecleando varias a la vez, cosas inevitables por otra parte en cualquier juego) se bloquea el teclado temporalmente hasta que se vacía y el altavoz interno emite un desagradable pitido. Por otra parte, el pequeño retardo es un factor programable a través de una función Dos (llamada a la interrupción 21h), pero la solución real al problema no es reducir el retardo a 0, ya que seguirá existiendo la limitación de los 16 bytes almacenados en el buffer y la imposibilidad de pulsar varias teclas a la vez, así como no poder pulsar en solitario teclas como Shift, Control o Alt, muy utilizadas por algunos juegos como botón de disparo. La verdadera solución es la sustitución de la rutina Dos por defecto por la nuestra propia. Así evitamos el retardo y el sistema de buffers, leyéndose el código de cada tecla (código scan) directamente y en el momento en que se solicita. Esto se puede conseguir con algo parecido a lo siguiente: /* Teclado.c */ #include char scan_key[128]; // Booleanos que almacenan las teclas del // teclado static unsigned int far *fp_kbd_tail, far *fp_kbd_head; void start_kbd_driver (void); // Inicia el nuevo gestor de eventos de teclado void end_kbd_driver (void); // Restaura el gestor por defecto void interrupt (*old_int9)(void); // Vector de la interrupción // Esta rutina sustituye a la rutina por defecto void interrupt new_int9(void) { unsigned char a; a = inp(0x60); // lee el código de la tecla desde el puerto if (a & 0x80) scan_key[a & 0x7F] = 0; else scan_key[a] = 1; fp_kbd_tail = MK_FP(0x40,0x1A); fp_kbd_head = MK_FP(0x40,0x1C); *fp_kbd_tail = *fp_kbd_head; // Limpia el búffer de teclado old_int9(); // Aprovecha parte del código antiguo } void start_kbd_driver(void) { old_int9 = getvect(9); memset(scan_key, 0, sizeof(scan_key)); setvect(9, new_int9); } void end_kbd_driver(void) { setvect(9, old_int9); } Para iniciar el gestor no tienes más que poner en tu programa al principio (en la función main () o en otra): start_kbd_driver (); y no olvidarte de restaurar la rutina por defecto del Dos antes de terminar el programa: end_kbd_driver (); Para utilizarla, nada más fácil. Por ejemplo. Al estar las teclas almacenadas en una variable tipo char que nos hace de booleano, miramos las que nos interesan una por una. Si su contenido = true significa que está pulsada. En caso contrario, lógicamente no. ... while (!scan_key[1]) // Loop mientras no se pulse ESC { memcpy (pantalla2, pantalla1, 64000); if (scan_key[72]) //Si se pulsa la flecha izda... j--; if (scan_key[80]) // Dcha j++; if (scan_key[75]) { i--; if (k < 1) k = 1; else k--; delay (100); } if (scan_key[77]) { i++; k++; if (k >= 4) k = 4; } ... Ah, casi se me olvida. Aquí tienes los códigos Scan. Los puedes meter como hago aquí, en un archivo include (.h) para que te resulte más cómodo utilizarlos. #define KEY_ESC 1 #define KEY_1 2 #define KEY_2 3 #define KEY_3 4 #define KEY_4 5 #define KEY_5 6 #define KEY_6 7 #define KEY_7 8 #define KEY_8 9 #define KEY_9 10 #define KEY_0 11 #define KEY_TAB 15 #define KEY_Q 16 #define KEY_W 17 #define KEY_E 18 #define KEY_R 19 #define KEY_T 20 #define KEY_Y 21 #define KEY_U 22 #define KEY_I 23 #define KEY_O 24 #define KEY_P 25 #define KEY_A 30 #define KEY_S 31 #define KEY_D 32 #define KEY_F 33 #define KEY_G 34 #define KEY_H 35 #define KEY_J 36 #define KEY_K 37 #define KEY_L 38 #define KEY_Z 44 #define KEY_X 45 #define KEY_C 46 #define KEY_V 47 #define KEY_B 48 #define KEY_N 49 #define KEY_M 50 #define KEY_COMA 51 #define KEY_PUNTO 52 #define KEY_SPACIO 57 #define KEY_ARRIBA 72 #define KEY_ABAJO 80 #define KEY_IZQUIERDA 75 #define KEY_DERECHA 77