logotipo

img_google

El teclado II: Bios y Scan.

Más BIOS

Bueno para terminar con las funciones BIOS del teclado, os mostraré ahora una nueva función proporcionada por la interrupción 16h, ésta es la 03h, su objetivo es ajustar el factor de repetición del teclado.

El factor de repetición del teclado determina cuántas veces se provocará una pulsación mientras una tecla permanece apretada. La función 03h os puede ser de utilidad si finalmente os decidís por utilizar las funciones BIOS en vez de los códigos Scan para realizar vuestros videojuegos. Si éste es vuestro caso, convendría que cambiaseis el factor de repetición para leer más veces una tecla mientras está pulsada.

Los parámetros que hay que pasarle a la función son:

      AH=03h                   ;número de función.
      AL=05h
      BH=Retardo               ;Retardo que transcurre hasta que se empieza
                                a repetir la pulsación de la tecla.
      BL=Factor de repetición  ;Número de veces que se produce la pulsación
                                por seg.

En BH y BL no podéis poner cualquier valor, os tendréis que adaptar a una serie de valores determinados que son los siguientes:

        Para el retardo:      %C:      BH     Retardo  (segundos)
                                   ----  -------------
                                     0     0.25
                                     1      0.5
                                     2     0.75
                                     3        1 %C0

        Para el factor de rep:

    BL       Rep. por seg.     BL     Rep. por seg.     BL     Rep. por seg.
   ----    ---------------    ----   --------------    ----   ---------------
    0           30             11         10,9          22         4,3
    1           26,7           12         10,0          23         4,0
    2           24,0           13          9,2          24         3,7
    3           21,8           14          8,6          25         3,3
    4           20,0           15          8,0          26         3,0
    5           18,5           16          7,5          27         2,7
    6           17,1           17          6,7          28         2,5
    7           16,0           18          6,0          29         2,3
    8           15,0           19          5,5          30         2,1
    9           13,3           20          5,0          31         2,0
   10           12,0           21          4,6

Para terminar con este apartadillo os he proporcionado un programa como demostración para comprobar el funcionamiento de la función 03h. :)

Pulsa F2 para ejecutar el programa TESTFACT  - Posibilidad no disponible en la versión HTML-.

Scan-code

Por así decirlo, ahora viene lo bueno, los scan-codes o códigos scan. Cuando os expliqué el funcionamiento del teclado, ya hablamos de estos códigos, pero de todos modos os refrescaré la memoria. ;) Cuando se producía una pulsación en el teclado, se generaba una interrupción hardware IRQ1 (9 en la tabla de vectores de interrupción), y el código scan de la tecla se situaba en el puerto 60h. Sabiendo esto podemos crearnos nuestra propia rutina que atienda a esa interrupción y así, leyendo del puerto 60h, detectaremos la tecla pulsada mucho antes que si utilizásemos las funciones BIOS y los códigos ASCII. Además de este ahorro de tiempo, el trabajar con códigos scan tiene otra ventaja importantííííísima....

Como os habréis dado cuenta, con los programas de demostración, al trabajar con la BIOS, no podemos detectar la pulsación de dos teclas a la vez. Con los códigos scan sí es posible; esto se debe a que el teclado genera un código cada vez que se pulsa una tecla (código make) y también cada vez que se libera la tecla (código release), con ello al pulsar una tecla recibiríamos el código make de la misma y hasta que no recibamos el código release, sabemos que esa tecla permanece pulsada, durante este tiempo, pueden haberse pulsado  otras teclas y así recibiríamos los códigos make de éstas, pero si no hemos recibido los códigos release sabemos que todas estas teclas ¡¡¡están pulsadas a la vez!!!. :)

Esta característica también permite detectar cuánto tiempo permanece pulsada una tecla (detectamos el código make, ponemos en marcha un contador y lo paramos cuando recibamos el código release).

Ya dijimos que el código scan se representa con un byte, los 7 bits de menor peso, 0..6, indican que tecla se pulsó, con estos bits se podrían codificar 128 teclas diferentes, que sería el máximo número de teclas que puede tener el teclado, pero utilizando una técnica que explicaremos a continuación, se puede aumentar este número. El bit de mayor peso 7, indica si se trata de un código make (Bit 7=0) o release (Bit 7=1), luego si el código es mayor de 128 es un código release y si es menor será un código make. Pongamos un ejemplo:

        Tecla Espaciadora:

                  Código scan     57 <-  binario con 7 bits   0111001

                  Código make     57 <- binario con 8 bits   00111001

                  Código release 185 <- binario con 8 bits   10111001

Para conocer los códigos scan y Ascii de cualquier tecla, ejecuta alguna de las demos TESTMFII y PLANTECL que incluimos con esta lección. Nosotros os mostramos los códigos make, para conocer los códigos release sólo tenéis que sumar 128 como es lógico ;)

Pulse F2 para ejecutar el programa PLANTECL.  - Posibilidad no disponible en la versión HTML-.

Me imagino que os habrá interesado este programa, en este capítulo no os proporcionamos los fuentes porque todavía no hemos visto la presentación de sprites en pantalla, pero en el próximo número os entregaremos los fuentes de PLANTECL. :)

Volvamos con los códigos scan. Como todo no iba a ser tan sencillo, en los códigos scan también existen unos códigos extendidos, en ellos antes de enviar el código de la tecla, tanto make como release, se envía el byte E0h o 224. Los códigos scan extendidos se corresponden a las teclas grises del bloque de los cursores, y salvo excepciones lo mejor es ignorarlos ya que la función de estas teclas se puede conseguir con las teclas del teclado numérico.

Ahora os vamos a explicar cómo sustituir el controlador de teclado original y qué puede hacer el nuestro. Para sustituir la rutina por defecto, por la nuestra, únicamente tenemos que sustituir en la tabla de vectores de interrupciones, la dirección de la rutina original por la nueva, para realizar esto en el DOS-API (servicios proporcionados por el S.O. DOS a través de la interrupción 21h) existen dos funciones la 25h y la 35h que fijan y leen respectivamente un valor en la tabla de vectores. Os proporciono los parámetros para ambas funciones:

 int 21h     Función 25h

         Entrada: ah   = 25h
                  al   = número de interrupción
                  ds:dx= puntero FAR (segmento:desplazamiento) de la nueva
                         rutina de interrupciones.
         Salida:  Ninguno

 int 21h     Función 35h

         Entrada: ah   = 35h
                  al   = número de interrupción.
         Salida:  es:bx= puntero FAR de la rutina actual.
 

En diferentes LAN existen también una serie de instrucciones que realizan la misma función y como es lógico son más fáciles de utilizar:

        En Pascal:

         GetIntVec(número de interrupción,dirección de la rutina actual);
         SetIntVec(número de interrupción,dirección de la nueva rutina);

        En C:

         dirección de la rutina actual=GetVect(número de interrupción);
         SetIntVec(número de interrupción, dirección de la nueva rutina);

Lo primero que tenemos que hacer al sustituir el controlador es, guardar la dirección de la rutina actual para posteriormente poder recuperarla y dejar la tabla de vectores con sus valores iniciales, ya que de otra forma el sistema podría colgarse Hupsss! :O  Lo siguiente es situar en esa posición de la tabla la dirección de nuestra rutina.

La rutina que nosotros empleamos se basa en la utilización de un array de 128 posiciones booleanas. Cuando leemos un código make del puerto 60h, ponemos a 'true' la variable de la posición de la tabla correspondiente al código scan de la tecla y cuando leemos el código release ponemos a 'false' la variable, restando antes 128 al código recibido. Tenéis que recordar que la rutina, al llamarse por cada IRQ1, (pulsación o liberación de una tecla), actualiza automáticamente la tabla y así nosotros en nuestro programa para ver el estado de una tecla únicamente tendremos que preguntar por su valor scan.
        Por ejemplo:
%C:
   if Letras[57] then                       (*¿Barra espaciadora pulsada?*)
    *******;%C0

Para detectar la pulsación de varias teclas a la vez, solamente tendríamos que preguntar por los valores de esas teclas en nuestra tabla de variables booleanas:

   if letras[59] and letras[60] and letras[61] then  (* ¿A, B y C pulsadas ?*)
 


Pulse F2 para ejecutar el programa TESTSCAN  - Posibilidad no disponible en la versión HTML-.

Para terminar con el teclado y creo que poco más hay que contar.. ;)  podéis ejecutar y examinar los fuentes del programa TESTSCAN para entender mejor el funcionamiento de los códigos scan. Este mismo programa sirve para demostrar las ventajas de utilizar los códigos scan frente a los métodos tradicionales de utilizar las instrucciones LAN. :)
 
 


[ Anterior | Índice | Siguiente ]

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