Interrupción 33h
Interrupción 33h
Ahora veremos la forma de programar este periférico tan usado hoy en día, y que
soporta todo tipo de aplicaciones, empezando por sistemas operativos con entornos
gráficos (como el Windows) y acabando por videojuegos, y esto no es extraño, ya
que la comodidad que ofrece es muy alta, y es por eso que vamos a explicar como
programarlo, y después podremos aplicarlo a cualquier campo, ya que un programa
que tiene opción de utilizar el mouse es mucho más fácil de usar y atractivo que otro
que no disponga de este.
Al igual que con otros periféricos, hay en la BIOS una interrupción que se encarga
de manejar este dispositivo. Son una serie de funciones que normalmente
acompaña en un disco al ratón, y que lo cargamos mediante un archivo que queda
residente en memoria (mouse.com, mouse.sys, etc.). Está interrupción es la 33h,
la cual nos ofrece todo un surtido de funciones para que podamos manejar el
mouse, desde comprobar tipo de mouse, botones, hasta poder cambiar la velocidad
a la cual queremos que vaya el mouse (sensibilidad) y limitar las coordenadas por
donde queremos que se mueva en pantalla. Para manejar el
mouse tenemos dos posibilidades, y como casi siempre, la más eficaz es la más
difícil.
Ahora vamos a ver algunos de los servicios de la interrupción 33h y que son los más
utilizados a la hora de programar el mouse.
Ahora veremos como funciona cada función una por una.
Función 00h
char HayMouse(void)
{
asm xor ax, ax
asm int 33h
return _AX;
}
Función 01h
void ShowMouse(void)
{
asm mov ax, 01h
asm int 33h
}
Función 02h
Cuando el cursor está oculto, se sigue actualizando, así que nosotros podremos
seguir leyendo su posición si lo deseamos. Una cosa a tener en cuenta es que si
por ejemplo llamamos a esta función, pues no llamarla más ya que si lo hacemos
así, al llamar a la función de poner ratón (01h) lo habremos de hacer dos veces
también, si no, no se nos mostrará el cursor.
void HideMouse(void)
{
asm mov ax, 02h
asm int 33h
}
Función 03h
En modo texto tendremos que multiplicar las coordenadas por ocho, tanto en eje
horizontal (x) como en vertical (y). La función siguiente solos nos sirve en modo
13h.
void ReadMouse(int *MouseX, int *MouseY, int *MouseB)
{
int x, y, b;
*MouseX=x;
*MouseY=y;
*MouseB=b;
}
Función 04h
Estas funciones hacen que se limite el ratón a un área. Esto nos puede servir por
ejemplo, para cuando sale un mensaje en nuestro programa, el usuario centre la
atención en esa zona restringiendo las coordenadas a las de donde está el
mensaje. Acuérdense de que también debemos convertir las coordenadas a las
del modo que estemos usando.
Función 09h
Función 0Ch
Esta función es la que hace que un controlador nos vaya actualizando una serie
de variables que cada una nos indicará una cosa. Aquí por controlador
entendemos una función que vaya pasando los valores de CX, DX, etc. que serán
los que actualizará el driver a nuestras variables para que después nosotros
podamos leer, un ejemplo de un controlador podría ser el siguiente:
No hace falta decir que las variables tiene que ser de tipo global.
La información que el driver del ratón pasa a nuestro controlador de eventos es la
siguiente:
Los siguiente registros (SI y DI) vienen en unas unidades de medida del ratón (los
famosos mickeys), y que corresponden a 1/200, 1/400 pulgadas.
En fin, esto es todo lo que hay que saber para poder programar mínimamente bien
el mouse.