Int 33h
Función 00h por ejemplo).
Entrada: AX = 0000h Reseteo del
driver del ratón
void ShowMouse(void)
Salida: AX = FFFFh Driver del {
asm mov ax, 01h
ratón instalado asm int 33h
0000h Driver no }
instalado
BX = Número de botones
que tiene el ratón Función 02h
Mediante una llamada a esta función Entrada: AX = 0002h Oculta el
podremos comprobar si está cursor del ratón
instalado el driver del ratón. Un
ejemplo podría ser el siguiente: Salida: No devuelve nada
Cuando el cursor está oculto, se
sigue actualizando, así que nosotros
char HayMouse(void) podremos seguir leyendo su posición
{
asm xor ax, ax si lo deseamos. Una cosa a tener en
asm int 33h cuenta es que si por ejemplo
llamamos a esta función, pues no
return _AX; 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
Función 01h mostrará el cursor.
Entrada: AX = 0001h Muestra el
cursor del ratón
void HideMouse(void)
Salida: No devuelve nada {
asm mov ax, 02h
asm int 33h
Cuando estamos en modo texto }
vemos el típico cuadrado, en modo
gráfico la famosa flecha, pero hay
una función que nos da la opción de Función 03h
cambiarlo si lo deseamos, tal y
como veremos más adelante. Para Entrada: AX = 0003h Leer posición
los modos SVGA no nos queda más (x, y) y estado de los botones
remedio que ir dibujando
nosotros el ratón mediante un Salida: CX = Posición horizontal
controlador, ya que en estos DX = Posición vertical
modos no nos muestra el cursor (al BX = Estado de los
igual que pasaría con los modos x, botones
Int 33h
CX = Posición horizontal
Bit 0 1 = Pulsado el botón DX = Posición vertical
izquierdo
Bit 1 1 = Pulsado el botón Salida: No devuelve nada
derecho
Bit 2 1 = Pulsado el botón Debemos tener en cuenta lo
central dicho anteriormente, y transformar
las coordenadas para el modo en el
Cuando estamos en el modo gráfico que estemos trabajando.
13h (320x200) las coordenadas no
corresponden con las que nos
devuelve la función y tendremos que
dividir entre dos el eje horizontal (x). void SetMouseXY(int x, int y)
{
asm mov ax, 04h
Eje X: de 0 a 639 (dividimos asm shl x, 1 // x*2
entre 2) asm mov cx, x
Eje Y: de 0 a 199 asm mov dx, y
asm int 33h
En modo texto tendremos }
que multiplicar las coordenadas por
ocho, tanto en eje horizontal (x) como
en vertical (y). La función siguiente Funciones 07h y 08h
solos nos sirve en modo 13h.
Entrada: AX = 0007h Limita
movimiento horizontal del ratón.
CX = Mínima posición eje
void ReadMouse(int *MouseX, int horizontal (x)
*MouseY, int *MouseB) DX = Máxima posición
{ eje horizontal (x)
int x, y, b;
Salida: No devuelve nada
asm mov ax, 03h
asm int 33h
asm shr cx, 1 // cx/2
asm mov x, cx Entrada: AX =
asm mov y, dx 0008h Limita movimiento vertical del
asm mov b, bx ratón
CX = Mínima posición eje
*MouseX=x;
*MouseY=y; vertical (y)
*MouseB=b; DX = Máxima posición eje
} vertical (y)
Salida: No devuelve nada
Función 04h
Entrada: AX = 0004h Posiciona el Estas funciones hacen que se limite
cursor del ratón el ratón a un área. Esto nos puede
servir por ejemplo, para cuando sale
Int 33h
un mensaje en nuestro programa, el
usuario centre la atención en esa {
zona restringiendo las coordenadas a asm mov ax, 09h
asm xor bx, bx
las de donde está el mensaje. asm xor cx, cx
Acuérdense de que también debemos asm les dx, [form]
convertir las coordenadas a las del asm int 33h
modo que estemos usando. }
Función 0Ch
void SetMouseLimit(int x1, int y1, int x2,
int y2) Entrada: AX = 000Ch Instalar el
{ controlador de eventos
asm shl x1, 1 // x1*2
asm shl x2, 1 // x2*2
CX = Máscara de eventos
asm mov ax, 07h que hará que el controlador sea
asm mov cx, x1 llamado.
asm mov dx, x2
asm int 33h Bit 0 Movimiento del ratón
Bit 1 Pulsado el botón
asm mov ax, 08h
asm mov cx, y1
izquierdo
asm mov dx, y2 Bit 2 Soltado el botón
asm int 33h izquierdo
} Bit 3 Pulsado el botón
derecho
Bit 4 Soltado el botón
Función 09h derecho
Bit 5 Pulsado el botón
Entrada: AX = 0009h Cambia central
apariencia del cursor. Bit 6 Soltado el botón
DX = Offset bitmap donde central
esta el cursor del ratón
ES = Segmento bitmap ES:DX = Dirección del
donde esta el cursor del ratón. controlador que queremos instalar
Salida: No devuelve nada Salida: No devuelve nada
Esta función es la que hace que un
Esta funcion cambia la apariencia del controlador nos vaya actualizando
cursor de nuestro mouse. En la una serie de variables que cada una
librería mouse.h podrás encontrar nos indicará una cosa. Aquí por
varios cursores. La función que se controlador entendemos una función
encarga de esto es la siguiente: 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
void SetNewForm(unsigned int *form) podamos leer, un ejemplo de un
Int 33h
controlador podría ser el siguiente:
void far MyEventHand()
{
asm shr cx, 3
asm inc dx
asm mov [Mx], cx // Mx: Posición x
asm shr dx, 3
asm inc dx
asm mov [My], dx // My: Posición y
asm mov [Mbot], bl // Mbot: Botón
pulsado
asm ret
}
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:
BX = Estado actual de los botones
Bit 0 Pulsado botón izquierdo
Bit 1 Pulsado botón derecho
Bit 2 Pulsado botón central
CX = Coordenada eje
horizontal.
DX = Coordenada eje vertical.
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.
SI = Longitud del último movimiento
en eje horizontal.
DI = Longitud del último movimiento
en eje vertical.
En fin, esto es todo lo que hay que
saber para poder programar
mínimamente bien el mouse