logotipo

img_google

El teclado.

El teclado no hace falta que os lo presente, lo tenéis justo debajo de vuestras narices. ;-) Bueno, este periférico lo vamos a utilizar como cobaya para poner un ejemplo real de cómo se comportan y comunican esos tres niveles de los que os escribí anteriormente, también nos servirá para aclarar el funcionamiento de un PC y para manejar las herramientas que vimos en la cacharrería, y por si acaso no os enterarais de nada, ;) os proporcionaré distintas rutinas para que podáis utilizar el teclado en vuestros propios videojuegos, a pesar de todo. :) De los tres tipos de teclado que existen XT-83, AT-83 y MF-II (101 y 102), todas mis explicaciones se referirán a éste  último, que es el que seguramente 'machacaréis' todos los días.

Empecemos viendo qué sucede desde que pulsamos una tecla hasta que tenemos disponible su valor ASCII. Al pulsar una tecla, un chip de nuestro teclado el 8048, detectará un cambio de nivel eléctrico y con él, calculará la posición de la tecla. Dependiendo de la colocación de ésta, el circuito depositará un código en un búffer interno de teclado de tamaño 10, (por muy rápidos que seáis no lo conseguiréis bloquear) de donde es transmitido (en serie a través de ese cable de dos hilos enrollado que veis) al ordenador.

Me gustaría hacer notar que ese código del que os hablo no es un código ASCII, se trata de un Scan-code que depende de la posición de la tecla, y que a pesar de lo que intentan algunos fabricantes de Taiwan, |) más o menos también está estandarizado.

En el ordenador el código es recibido por otro chip, que suele ser el 8042, el cual genera una interrupción hardware IRQ1, (de las que hablamos en la  cacharrería). La dirección de la rutina que atiende a esta interrupción está en la posición 9 de la tabla de interrupciones (también os sonará). Esa rutina leerá el código de la tecla, que se sitúa en el puerto 60h. Hasta aquí se puede decir que estamos en el nivel máquina y será donde más trabajaremos, ya que si interceptamos el valor de ese código scan, nos ahorraremos todo lo que viene detrás.

Una vez leído el código-scan del puerto, la rutina de la BIOS se encarga de calcular el código ASCII y depositarlo en un búffer de teclado que se encuentra en el primer segmento de memoria de la RAM, donde también se guarda la tabla de interrupciones y otras variables importantes de la BIOS, luego moraleja, no juguéis con este segmento. ;)

Me gustaría también destacar dos asuntos: muchos pensaréis, cómo debe ser, ;)  ¿cómo la BIOS sabe que utilizamos un teclado con mi querida ñ ?, pues bien, no lo sabe, el ordenador se 'entera' debido a que el sistema  operativo a través de su programa KEYB sustituye la rutina de la BIOS (made in HUSA) por otra que nosotros le indiquemos, SP en nuestro caso. El otro asunto que quería mencionaros es que, el búffer BIOS del que os he hablado, a pesar de tener una longitud de 16 caracteres, sí podéis llegar a bloquearlo y si no hacer una prueba, lo primero de todo ¡Saliros de mi programa VCPV! y una vez en el DOS poner las dos manos bien extendidas sobre todas las teclas que podáis, :)) Como habréis visto sonará un pitidito que indica que el búffer está lleno, esto que puede parecer una tontería es muy importante, ya que imaginaros que estáis haciendo una presentación que no se puede interrumpir y el típico usuario impaciente empieza a 'aporrear' el teclado para pasar de vuestra presentación, cuando acabe ésta una avalancha de pulsaciones caerán sobre vuestro programa y si por alguna casualidad se activa alguna opción no deseada, puede que os haga poca gracia. =8O

Bueno volvamos a lo nuestro, dónde estabamos, :-? a sí, en el búffer de teclado... una vez el código ASCII esta disponible en el búffer, se podrá leer utilizando las funciones de la BIOS correspondientes, a través de la interrupción software 16h, con lo cual nos situaríamos en el segundo nivel de nuestra organización particular. :) También podemos acceder por medio de  las DOS-API, otra serie de funciones que el sistema operativo pone en mano de los usuarios, con lo cual nos situaríamos entonces en el tercer nivel, muy lejos de lo bueno. Algunos de vosotros pensaréis (¡ Otra vez! no os vayáis a  calentar la cabeza, ;)), es broma ), y ¿cómo accedo siempre con el readkey de PASCAL, el getch() de C, el get de ADA, el input de BASIC, el get de DBase, el read de MODULA-2, el +i(1) de RPG o el accept de COBOL?, (bueno yo 'sólo' practico en estos lenguajes, vosotros aplicaros los vuestros ;) pues bien todas esta instrucciones son de LAN, (sí de lenguajes de alto nivel, no de Local Area Network), pero estas ordenes se apoyan, algunas mejor que otras, en el uso de las funciones que ya hemos citado, por lo que podéis añadir otro caparazón más a nuestra Tortuga particular :)

Me imagino que os habréis dado cuenta de que cuantas más capas quitemos al ordenador más rápido irán las cosas.... ¡NO! No quitéis la carcasa al ordenador, me refiero a las capas lógicas de las que estamos hablando. ;) Bueno, para empezar a ponernos manos a la obra os explicaré cómo utilizar las funciones de la BIOS, por si alguno las queréis utilizar, para después pasar a lo bueno, los Códigos-SCAN.

La BIOS ofrece distintas funciones, accesibles a través de interrupciones software que permiten el manejo de todos los dispositivos de que consta el ordenador. Para acceder a las funciones del teclado utilizamos la interrupción 16h (hexadecimal), pero ¿cómo se llama a una interrupción?, pues bien, en emsamblador se utiliza la instrucción 'int' seguida del número de la interrupción que queremos 'originar', en nuestro caso int 16h. En los distintos lenguajes de alto nivel, también existen instrucciones que nos permiten causar interrupciones:

    Intr(NumeroInterrupción:Byte ; Registros:Registers);   <---PASCAL

    int int86(int, union REGS *regsent,  union REGS *regssal); <---C

Pero antes de llamar a cualquier interrupción, es necesario colocar algunos valores en determinados registros; estos valores identificarán la función a la que queremos acceder y serán los parámetros que la función necesita para ejecutarse. Una vez finalizada la ejecución de la rutina llamada, ésta también nos podrá devolver valores en los mismos o en otros registros.

Veamos ahora un ejemplo completo:

                mov ah,1         ;ponemos el parámetro necesario en su lugar
                int 16h          ;causamos la interrupción

Como veis el trabajar con interrupciones es bastante sencillo, lo complicado en este caso es saber cuál es la función que necesitamos y cuáles son sus parámetros, pero para eso están los libros. Existen cantidad de libros y archivos de texto donde se detalla exhaustivamente todas las funciones de la BIOS, de todos modos si os falta información sobre las interrupciones BIOS poneros en contacto con nosotros y os facilitaremos la información que necesitéis... :) En los tutoriales, 'sólo' explicaremos las interrupciones y funciones que utilicemos, que no serán pocas.... ;)

Para empezar os explicaré las seis funciones básicas del teclado, si tenéis un 8086 o un DOS por debajo de la versión 3.3 sólo os funcionarán tres, sin embargo, el hecho de tener solo tres funciones debe ser lo que menos os preocupe (por cierto en mis ratos libres, que son pocos, ensamblo ordenadores, podéis consultarme ;)

Para acceder a cada función expuesta es necesario poner el número de función en el registro AH (ya sabéis, parte alta del registro AX), hecho que se puede considerar común para el resto de funciones e interrupciones.
 

La mejor forma de utilizar estas funciones es, primero consultar con la función 1, si hay tecla en el búffer y después retirarla con la función 0.
 
BIT 0:Tecla derecha de mayúsculas       BIT 4:Bloqueo de desplazamiento
BIT 1:Tecla izquierda de mayúsculas     BIT 5:Bloqueo numérico
BIT 2:Tecla control                     BIT 6:Bloqueo de mayúsculas
BIT 3:Tecla alt                         BIT 7:Inserción

En todos los casos 1=activado, 0=desactivado.

Antes de explicaros el resto de las funciones, me detendré para destacar un asunto. Cómo os podéis dar cuenta, al consultar una tabla de códigos ASCII, no figuran ni las teclas de función, ni los cursores, ni distintas combinaciones de teclas. Esto se debe a que con un byte, (tamaño de un código ASCII) sólo se pueden codificar 256 valores diferentes, y como existen tantos caracteres raros que codificar, _++iÊ, se optó por crear los códigos ASCII extendidos, éstos se forman con 2 bytes, el primero con valor 0 y el segundo el valor ASCII en sí. Así que ya sabéis, si leéis un carácter de valor 0 volver a leer ya que se trata de un código extendido, para conocer los valores tanto ASCII como SCAN de vuestras teclas, en el segundo artículo sobre  el teclado, os proporcionaré un programa para que los conozcáis.
Aún con estos códigos extendidos, no se logró cubrir con códigos ASCII todas las teclas del teclado, F11, F12, cursores grises... así que se  añadieron nuevas funciones, la 10h y 11h, que funcionan igual que las 0 y 1 respectivamente, y la 12h que devuelve en AL el byte de estado ya descrito además de este nuevo byte en el registro AH
BIT 0:Tecla control                  BIT 4:Tecla Inter
BIT 1:Tecla alt                      BIT 5:Bloqueo numérico
BIT 2:Tecla Petición de sistema      BIT 6:Bloqueo mayúsculas
BIT 3:Modo pausa                     BIT 7:Inserción
Pulse F2 para ejecutar el programa TESTMFII - Posibilidad no disponible en la versión HTML-.


Para despedir este primer artículo sobre el teclado ejecutad el programa TESTMFII, donde os muestro ejemplos de cómo utilizar las funciones antes mencionadas y donde además, en el programa fuente, os explico como podéis  activar/desactivar el bloqueo numérico, bloqueo mayúsculas, bloqueo  desplazamiento e inserción, en vuestro teclado y con ello encender/apagar los leds asociados a cada unos de estos modos. :)
 
 


[ Anterior | Índice | Siguiente ]

La última versión de este texto se podrá encontrar en Internet, en la dirección:
www.pobox.com/users/ncabanes/