Si quiere detectar múltiples presiones de teclas a la vez, las rutinas de teclado de la BIOS son inútiles. Allegro puede reemplazarlas con su propio controlador de teclado, que incluye un sistema de entrada con buffer y un conjunto de biestables que almacenan el estado de cada tecla. Tenga en cuenta que no es posible detectar correctamente cualquier combinación de teclas debido al diseño del teclado del PC. Hasta dos o tres teclas a la vez funcionarán bien, pero si pulsa más de esas, las extras probablemente serán ignoradas (la combinación exacta de teclas pulsadas varía de un teclado a otro).
int install_keyboard();
   Instala el controlador de interrupciones del teclado de Allegro. Debe
   llamar esto antes de cualquier otra función de teclado. Una vez instalado
   el controlador de Allegro, no podrá usar las llamadas del DOS/BIOS o de
   la biblioteca C para acceder al teclado.
void remove_keyboard();
   Desinstala el controlador de teclado devolviendo el control a la BIOS.
   Normalmente no necesita llamar esta función, porque allegro_exit() lo
   hará por usted.
void install_keyboard_hooks(int (*keypressed)(), int (*readkey)());
   Sólo debería usar esta función si *no* va a usar el resto del controlador
   de teclado. Debe ser llamada en vez de install_keyboard(), y le deja usar
   rutinas callback para detectar y leer pulsaciones de teclado, que pueden
   ser usadas por las funciones principales keypressed() y readkey(). Esto
   puede ser útil si quiere usar el código GUI de Allegro junto con un
   controlador de teclado propio, ya que permite al GUI acceder a la entrada
   de teclado desde su código. Si quiere usar las rutinas de teclado de la
   BIOS, la función _bios_keybrd(_KEYBRD_READ) devuelve pulsaciones de
   teclado en el formato correcto.
extern volatile char key[128];
   Array de biestables indicando el estado de cada tecla, ordenadas por
   scancodes. Los scancodes están definidos en allegro.h como una serie de
   constantes KEY_*. Por ejemplo podrías escribir:
      if (key[KEY_SPACE])
         printf("La barra espaciadora está siendo pulsada\n");
   Cada uno de estos valores es realmente un campo de bits conteniendo uno o
   ambos biestables KB_NORMAL y KB_EXTENDED, permitiéndole determinar qué
   tecla está siento pulsada incluso cuando hay dos con el mismo scancode.
   Por ejemplo podría escribir:
      if (key[KEY_ENTER] & KB_NORMAL)
         printf("Enter (al lado del shift) está siendo pulsado\n");
      if (key[KEY_ENTER] & KB_EXTENDED)
         printf("Enter (del teclado numérico) está siendo pulsado\n");
extern volatile int key_shifts;
      KB_SHIFT_FLAG
      KB_CTRL_FLAG
      KB_ALT_FLAG
      KB_LWIN_FLAG
      KB_RWIN_FLAG
      KB_MENU_FLAG
      KB_SCROLOCK_FLAG
      KB_NUMLOCK_FLAG
      KB_CAPSLOCK_FLAG
      KB_INALTSEQ_FLAG
      KB_ACCENT1_FLAG
      KB_ACCENT1_S_FLAG
      KB_ACCENT2_FLAG
      KB_ACCENT2_S_FLAG
int keypressed();
   Devuelve TRUE si hay teclas esperando en el buffer de entrada. Esto es
   equivalente a la función kbhit() de la biblioteca libc.
int readkey();
   Devuelve el siguiente caracter del buffer del teclado. Si el buffer está
   vacío, espera hasta que una tecla sea pulsada. El byte bajo del valor
   devuelto contiene el código ASCII de la tecla, y el byte alto el
   scancode. El scancode sigue siendo el mismo a pesar del estado de las
   teclas shift, ctrl y alt. El código ASCII es afectado por shift y ctrl de
   la forma usual (shift hace mayúsculas, ctrl+letra da la posición de la
   letra en el alfabeto, ej: ctrl+A = 1, ctrl+B = 2, etc). Pulsando
   alt+tecla devuelve sólo el scancode, con el código ASCII cero en el byte
   bajo. Ejemplo:
      if ((readkey() & 0xff) == 'd')         // por código ASCII
         printf("Has pulsado 'd'\n");
      if ((readkey() >> 8) == KEY_SPACE)     // por código scancode
         printf("Has pulsado Espacio\n");
      if ((readkey() & 0xff) == 3)           // ctrl+letter
         printf("Has pulsado Control+C\n");
      if (readkey() == (KEY_X << 8))         // alt+letter
         printf("Has pulsado Alt+X\n");
void simulate_keypress(int key);
extern int (*keyboard_callback)(int key);
   Si se activa, esta función es será llamada por el controlador del teclado
   en respuesta a cualquier tecla. Se le pasará una copia del valor que se
   va a añadir al buffer de entrada, y la función puede devolver este valor
   sin modificar, devolver cero, lo que hace que la tecla sea ignorada, o
   devolver un valor modificado que cambiará lo que readkey() va a devolver
   después. Esta rutina se ejecuta en contexto de interrupción, por lo que
   debe ser fijada (locked) en memoria.
extern void (*keyboard_lowlevel_callback)(int key);
   Si se activa, esta función es será llamada por el controlador del teclado
   en respuesta a cualquier evento del teclado, tanto al pulsar como al
   soltar una tecla. Se le pasará un byte de scancode puro, con el bit alto
   activado si la tecla ha sido pulsada o desactivado si ha sido soltada.
   Esta rutina se ejecuta en contexto de interrupción, por lo que debe ser
   fijada (locked) en memoria.
void set_leds(int leds);
   Modifica el estado de los indicadores LED del teclado. El parámetro es
   una máscara de bits conteniendo cualquiera de los valores
   KB_SCROLOCK_FLAG, KB_NUMLOCK_FLAG, y KB_CAPSLOCK_FLAG, o -1 para
   recuperar el comportamiento normal.
void clear_keybuf();
   Vacía el buffer del teclado.
extern int three_finger_flag;
   El controlador de teclado de Allegro tiene una secuencia de 'salida de
   emergencia' que puede usar para salir de su programa. Si está corriendo
   bajo DOS, será la combinación de tres dedos ctr+alt+del. La mayoría de
   sistemas operativos multitarea capturarán esta combinación antes de que
   llegue al controlador de teclado, en cuyo caso puede usar la combinación
   alternativa ctrl+alt+fin. Si quiere desactivar este comportamiento en su
   programa, ajuste este biestable a FALSE.
extern int key_led_flag;
   Por defecto las teclas BloqMayús, BloqNum, BloqDesp activan los LEDS del
   teclado cuando son presionadas. Si las quiere usar con su juego (ej.
   BloqMayús para disparar) este comportamiento no es deseable, por lo que
   puede limpiar este biestable para evitar que los LEDS sean actualizados.
extern int switch_standard_kb_key;
extern int switch_standard_kb_flags;
extern int switch_custom_kb_key;
extern int switch_custom_kb_flags;
   Combinación de scancode y biestable shift usado para cambiar el mapa de
   teclado personalizado por el estándar. Por defecto, pulsando ctrl+alt+F1
   seleccionará el mapa de teclado americano, mientras que ctrl+alt+F2
   selecciona el mapa de teclado personalizado. Estos valores permiten
   alterar la combinación de teclas para realizar el cambio, o puede
   ajustarlos a cero para evitarlo.
void set_standard_keyboard();
   Fuerza a Allegro a usar el mapa de teclado estándar americano, ignorando
   el mapa de teclado personalizado que está actualmente en uso.
void set_custom_keyboard();
   Fuerza a Allegro a usar el mapa de teclado personalizado, invirtiéndo el
   efecto de las llamadas previas a set_standard_keyboard().