0% encontró este documento útil (0 votos)
89 vistas4 páginas

Interrupción 33h

Este documento describe las funciones del controlador de ratón de MS-DOS. Explica cómo instalar y configurar el controlador de ratón, leer la posición y los estados de los botones del ratón, establecer la posición del cursor y los límites de movimiento, e instalar un controlador de eventos de ratón.

Cargado por

jose peres
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
89 vistas4 páginas

Interrupción 33h

Este documento describe las funciones del controlador de ratón de MS-DOS. Explica cómo instalar y configurar el controlador de ratón, leer la posición y los estados de los botones del ratón, establecer la posición del cursor y los límites de movimiento, e instalar un controlador de eventos de ratón.

Cargado por

jose peres
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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

También podría gustarte