7.1.2 El teclado y el SO
§1 Generalidades
En el capítulo anterior hemos visto que en realidad, las rutinas de bajo nivel del teclado no informan sobre caracteres, sino de la acción de determinados interruptores hardware (las teclas) y que esta información es doble: identifica al interruptor de entre un conjunto de ellos, y el tipo de operación realizada (cerrar o abrir el circuito). A partir de este momento, la tarea de decidir que significado se da a esta información corresponde a diferentes capas de software. La primera corresponde al BIOS, que proporciona determinados servicios básicos. A partir de ahí, interviene el Sistema Operativo; finalmente los programas de aplicación reciben información del Sistema y dan su tratamiento específico a la información recibida.
Resulta evidente que en la familia de ordenadores IBM PC y compatibles, a igualdad de condiciones de entrada, el comportamiento de la primera capa, que depende del BIOS, es idéntico en todos los casos en cuanto al resultado producido. Sin embargo, a partir de la segunda, el tratamiento será distinto (aunque parecido) dependiendo del Sistema Operativo y del programa de aplicación.
§2 Servicios BIOS
La BIOS del PC atiende dos interrupciones para servicio del teclado que pueden considerarse estándar; existiendo una tercera que puede considerarse complementaria. Está prevista para que el usuario le de un significado específico:
Nm. | Descripción del servicio |
9h | Este servicio ya ha sido comentado al tratar del funcionamiento del teclado ( 7.1.1). Su función básica consiste en analizar los códigos de exploración recibidos y transformarlos en byte-codes que son almacenados en el búfer de teclado, pero además de esto, el análisis realizado por la rutina permite varias acciones que son características de PC: La combinación Ctrl + Alt + Del [1] produce un reinicio del sistema conocido como reseteo en caliente ("Hot boot" o "Warm boot"), en el que se suprime la fase de comprobaciones POST del BIOS ( 4.2). La combinación Ctrl + Alt + Shift + Del genera el denominado reinicio frío ("Cold boot"), que incluye las comprobaciones POST. Impresión de pantalla mediante las combinaciones Shift izq. + PtrSc o Shift izq. + *. La impresión de pantalla es un servicio BIOS servido por la interrupción 5h, y como tal puede ser invocado por cualquier programa que la necesite. En este caso, la interrupción 9h se limita a invocar dicho servicio si detecta la combinación de teclas anterior. Pausa del sistema con Pause o la combinación Ctrl + NumLk. El estado de bloqueo o pausa del sistema, es una característica de la rutina BIOS de servicio de teclado. Cuando detecta esta combinación de teclas, la rutina activa el bit de estado correspondiente (bit 4 a 1 7.1.1), y entra en un bucle en el que no hace nada, solo esperar que se pulse alguna tecla estándar (imprimible). Mientras que esto no ocurre, no devuelve el control al programa, aunque el resto de interrupciones son atendidas normalmente, por lo que el sistema continúa funcionando, pero el programa que espera entradas por teclado queda detenido. Cuando finalmente se pulsa una tecla imprimible, desactiva el bit de bloqueo y sale del bucle, permitiendo que el programa continúe. Introducción directa de códigos ASCII. Esta característica del servicio es conocida como "Truco de Alt-Numérico", y permite introducir cualquier código ASCII (1 a 255) manteniendo pulsada la tecla Alt y los números del teclado numérico para introducir directamente el código decimal ASCII deseado [2] Cuando finalmente se libera la tecla Alt, la rutina BIOS calcula el valor ASCII correspondiente al número pulsado y lo deposita en el búfer de teclado como si se hubiese pulsado mediante una tecla a la que correspondiera ese símbolo. Por ejemplo, Alt + 1 - 2 - 6 es una forma rápida de introducir la tilde " ~" para los que utilizamos un teclado español (en el que no suele aparecer este carácter). |
16h | Servicios BIOS estándar de teclado. Generalmente el SO y las aplicaciones no leen los caracteres pulsados utilizando la interrupción 9h antes aludida, sino directamente del búfer de teclado ( 7.1a), una vez que ha pasado por las transformaciones pertinentes del servicio 9. Para esto la BIOS proporciona un servicio en la dirección 22 de la tabla IDT ( 2.4), que se ocupa de proporcionar la información buscada a las aplicaciones que lo solicitan. La interrupción 22 (16h) dispone de tres funciones o "servicios" para este propósito. Función 0h: Lee el siguiente carácter del búffer de teclado (dos octetos) y hace avanzar el índice correspondiente, lo que equivale a sacar el carácter del búfer. Función 1h: Lee el siguiente carácter del búfer (también dos octetos), pero no hace avanzar el índice, lo que equivale a que el carácter permanece en el búfer hasta que sea leído por la función 0. Función 2h: Lee los dos bytes de estado del teclado ( 7.1.1) para que, en caso necesario, la aplicación (o el Sistema) sepan a qué atenerse. Los servicios anteriores son los que pueden considerarse estándar (existen en el PC-XT y en todos los miembros de la saga), pero generalmente las BIOSes actuales proporcionan otras funciones adicionales en esta interrupción: Función 3h: Puede establecer las características "Typematic" del teclado. Es decir, la velocidad de repetición y el retardo inicial ( 7.1.1). Función 5h: Permite escribir directamente en el búfer de teclado como si se hubiese pulsado una tecla. Funciones 10h, 11h y 12h: Realizan respectivamente las mismas operaciones que 0h, 1h y 2h, pero ofrecen soporte para los teclados de 101/102 teclas (las funciones primitivas no disponían de esta posibilidad porque estos teclados no existían). |
1Bh | Cuando el servicio de la interrupción 9h detecta alguna de las combinaciones Ctrl + Break o Ctrl + C, genera una interrupción 27 (1Bh) y ejecuta el servicio correspondiente, si ha sido creado. |
§3 El Teclado y el SO
Los detalles de funcionamiento varían, pero en general, el tratamiento de las señales del teclado es realizado por el SO mediante un mapa que asocia cada código (key-code) encontrado en el búfer de teclado, con una acción o característica determinada. De esta forma, la tarea de cambiar el "idioma" del teclado se reduce a cambiar el mapa (o parte de él).
El mapa ("Keymap") adopta la forma de una tabla que es cargada por el kernel. Posteriormente puede ser cambiada por otra, o modificada, incluso en runtime. En MS-DOS es el conocido KEYBOARD.SYS; en Linux son ficheros de nombres diversos. Posiblemente en /usr/share/kbd/keymaps/.
§4 El idioma del teclado.
La diferencia entre los teclados de distintos lenguajes es que a una misma tecla le corresponde un símbolo distinto en cada uno de ellos. Por ejemplo, el teclado inglés USA tiene los símbolos " ;"/":" en la tecla 40, situada a la derecha de la "L", mientras que el teclado español tiene una " ñ"/"Ñ " en dicha posición.
Generalmente se dice que un teclado es "Español", "Francés", "Alemán", "USA", Etc. dependiendo de los símbolos dibujados sobre las teclas, sin embargo no existen diferencias eléctricas. Cuando se pulsa una tecla, el teclado genera siempre el mismo código de exploración ( 7.1a) con independencia de su "Lenguaje". Por ejemplo, cuando se pulsa la tecla 40 se genera el código 27, con independencia del símbolo "; " o "ñ" dibujado sobre la tecla. El hecho de aparecer un símbolo u otro en el documento que estamos escribiendo se debe a la interpretación que hace de dicho código el Sistema Operativo.
[1] Cuando se describen pulsaciones de teclas, el símbolo + significa pulsación simultánea de las teclas indicadas.
[2] No sirven todas las teclas numéricas, deben ser precisamente las del teclado numérico independiente, por lo que la operación resulta más engorrosa en los portátiles que no disponen de este grupo de teclas. En este caso una zona del teclado normal puede ser convertida en numérica mediante la combinación Fn+NumLk. Las teclas, que suelen estar señaladas con este doble uso, son las siguientes: 7/7; 8/8; 9/9; 0//; U/4; I/5; O/6; P/*; J/1; K/2; L/3 y ;/-