Sie sind auf Seite 1von 7

Perifricos Funciones del ratn

Objetivo: Aprender a gestionar el ratn del PC mediante la interrupcin 33h. Bibliografa: Tisher, PC Interno, Captulo 9, Apndice H, Marcombo 1993. Fundamento terico El ratn fue inventado por Douglas Engelbart en el Centro de Investigacin de Stanford en 1963 y empezado a utilizar con fines comerciales por Xerox en los aos 70. Esta invencin represent un gran avance en el campo de las aplicaciones software ya que facilit enormemente la comunicacin con el usuario, permitiendo el desarrollo de programas basados en entornos grficos. Existen numerosos tipos de ratones (mecnicos, opto-mecnicos, pticos) que se conectan con el PC tambin de numerosas formas (puerto serie, puerto PS/2, bus, etc.). En cualquier caso, en 1983 Microsoft defini un interfaz de funciones para su ratn (MS-MOUSE) con el MS-DOS que posteriormente se ha establecido como un estndar de hecho para todos los drivers de ratn bajo dicho sistema operativo. Esta interfaz de funciones habitualmente se instala por un controlador de dispositivos (mediante el comando DEVICE en el CONFIG.SYS) o por un programa residente (TSR) a travs de la ejecucin de un fichero .COM. Gracias a esta interfaz, un programa de aplicacin que funcione bajo MS-DOS no tiene por qu conocer el protocolo de comunicacin con el hardware del ratn y ni siquiera se debe preocupar por la forma en el que el ratn se conecta con el PC (COM1, COM2 PS/2 generalmente). La tcnica con la que se puede gestionar el ratn de un PC se tom prestada de la interfaz de programacin del DOS y de la BIOS, es decir, mediante una interrupcin especial. En este caso, la interrupcin 33h. De esta forma, el driver propio de cada ratn se instala en el sistema operativo, redireccionando el puntero de la interrupcin 33h a una rutina propia que implementa una serie de funciones para que cualquier programa gestione el ratn sin necesidad de acceder al nivel hardware. Cada una de estas funciones se caracterizan por el valor que se asigne al registro AX cuando se llame a la INT 33h. Estas funciones son las siguientes: a) Funciones que interaccionan con el driver del ratn
INT 33h - Reset del driver del ratn Entrada: AX = 0000h Salida: AX = estado 0000h hardware/driver no instalado FFFFh hardware/driver instalado BX = nmero de botones Comentarios: El cursor del ratn se mueve hacia el centro de la pantalla y despus se oculta. En el modo grfico aparece como una flecha mientras que en el modo texto aparece como un rectngulo.Los controladores de eventos se desactivan.

Prcticas de Perifricos

1 de 7

Ratn

INT 33h - Reset del hardware del ratn Entrada: AX = 002Fh INT 33h - Averiguar el tipo de ratn instalado Entrada: AX = 0024h Salida: AX = FFFFh: error en caso contrario, BH = nmero de versin mayor BL = nmero de versin menor CH = tipo (1=bus, 2=serial, 3=InPort, 4=PS/2) CL = interrupcin (0=PS/2, 2=IRQ2, 3=IRQ3,...) Comentarios: Si el nmero de versin del driver del ratn es, por ejemplo 8.48, en registro BH se devuelve el valor 8 y en el registro BL el valor 48. INT 33h - Obtener informacin general sobre el driver del ratn Entrada: AX = 0025h Salida: AX = informacin general del driver bit 15: tipo de driver 0: el driver se carg de un archivo .COM 1: el driver existe como un controlador de dispositivos y se incluy en el archivo CONFIG.SYS bits 13,12: tipo de cursor del ratn 00: cursor de texto tipo software (ver AX=000Ah) 01: cursor de texto tipo hardware (ver AX=000Ah) 1x: cursor grfico (ver AX=000Bh) INT 33h - Obtener tamao del buffer de estado del driver del ratn Entrada: AX = 0015h Salida: BX = tamao del buffer de estado del driver del ratn Comentarios: Toda la informacin concerniente al estado del driver del ratn se almacena en un buffer cuyo tamao es el que devuelve esta funcin. Mediante las subfunciones AX=0016h y AX=0017h se puede acceder a dicho buffer. INT 33h - Copiar buffer de estado del driver del ratn Entradas: AX = 0016h BX = tamao del buffer (ver subfuncin AX=0015h) ES:DX --> buffer donde se va a copiar el buffer de estado

Salida: BX = tamao del buffer de estado del driver del ratn INT 33h - Restaurar buffer de estado del driver del ratn Entradas: AX = 0017h BX = tamao del buffer (ver subfuncin AX=0015h) ES:DX --> buffer de donde se va a copiar el buffer de estado

Prcticas de Perifricos

2 de 7

Ratn

b) Funciones de control del cursor del ratn


INT 33h - Mostrar cursor del ratn Entrada: AX = 0001h Comentarios: Esta funcin incrementa un contador interno que decide si el cursor del ratn aparece o no en la pantalla. Si este contador contiene el valor 0, el cursor aparecer. Al realizar un reset del driver del ratn (funcin 0000h) dicho contador empezar por el valor -1. INT 33h - Ocultar cursor del ratn Entrada: AX = 0002h Comentarios: Esta funcin decrementa un contador interno que decide si el cursor del ratn aparece o no en la pantalla. Si este contador contiene el valor 0, el cursor aparecer. Mediante llamadas sucesivas a esta funcin, el contador se decrementar de forma continua de modo que sera necesario llamar a la funcin 0001h ese mismo nmero de veces sucesivas para que el contador vuelva a alcanzar el valor 0 y se pueda visualizar el cursor del ratn. INT 33h - Determinar el rango de movimiento horizontal del ratn Entrada: AX = 0007h CX = mnima posicin horizontal del ratn DX = mxima posicin horizontal del ratn INT 33h - Determinar el rango de movimiento vertical del ratn Entrada: AX = 0008h CX = mnima posicin vertical del ratn DX = mxima posicin vertical del ratn INT 33h - Definir el aspecto del cursor del ratn en modo grfico Entrada: AX = 0009h BX = distancia del punto de referencia (hot spot) del borde izquierdo del campo de bits CX = distancia del punto de referencia (hot spot) del borde superior del campo de bits ES:DX bitmap (16x16 bits) 16 words mscara de pantalla (16x16 bits) 16 words mscara del cursor (16x16 bits) Comentarios: El campo de bits comprende 32 words (=64 bytes) de los cuales los primeros 16 words se combinan mediante la funcin lgica AND con los bits existentes en la pantalla y los siguientes 16 lo hacen mediante la funcin lgica OR.

INT 33h - Definir el aspecto del cursor del ratn en modo texto Entrada: AX = 000Ah BX = 0000h CX = mscara de pantalla DX = mscara del cursor Comentarios: Podemos usar un carcter ASCII como cursor. En este caso, el cdigo del carcter que se encuentre en ese momento bajo el cursor del ratn y el byte de atributos asociado al mismo se operan con la mscara de pantalla mediante una funcin lgica AND. Posteriormente se operan con la mscara del cursor mediante una funcin lgica XOR. El formato de un carcter en pantalla es el siguiente (ver ayuda del Borland C sobre textattr): Bit 15: parpadeo (blink) 14-12: color de fondo (background) 11-8: color del carcter (foreground) 7-0: cdigo ASCII del carcter Prcticas de Perifricos 3 de 7 Ratn

INT 33h - Ajustar la sensibilidad del ratn Entrada: AX = 001Ah BX = velocidad horizontal CX = velocidad vertical DX = umbral para velocidad doble (en mickeys / segundo) Comentarios: Cuando la velocidad del ratn supera el umbral especificado en DX, la velocidad del ratn en pantalla se multiplica por 2. Un mickey es el menor incremento en la distancia recorrida fsicamente por el ratn que puede medir el hardware del mismo. En los ratones convencionales un mickey equivale a 1/200 pulgadas ( 1/400 pulgadas en los ms modernos) INT 33h - Obtener la sensibilidad del ratn Entrada: AX = 001Bh Salida: BX = velocidad horizontal CX = velocidad vertical DX = umbral para velocidad doble

c) Funciones para el uso del ratn mediante sondeo (polling)


INT 33h - Obtener posicin del ratn y estado de los botones Entrada: AX = 0003h Salida: BX = estado de los botones bit 0 =1: botn izquierdo pulsado bit 1 =1: botn derecho pulsado bit 2 =1: botn central pulsado (Mouse Systems/Logitech mouse) CX = columna DX = fila

d) Funciones para el uso del ratn mediante eventos


INT 33h - Instalar un controlador de eventos Entrada: AX = 000Ch CX = mscara de los eventos que queremos que gestione el controlador bit 0: si el ratn se mueve bit 1: si se pulsa el botn izquierdo bit 2: si se libera el botn izquierdo bit 3: si se pulsa el botn derecho bit 4: si se libera el botn derecho bit 5: si se pulsa el botn central (Mouse Systems/Logitech mouse) bit 6: si se libera el botn central (Mouse Sys/Logitech mouse) ES:DX Direccin donde comienza la funcin del controlador que deseamos instalar

Comentarios: El controlador de eventos es una funcin que queda residente en memoria y que es llamada por el driver del ratn cuando ocurre algn evento para el que ha sido programada. La funcin llamada recibe los siguientes valores en los registros internos de la CPU: AX = mscara del evento que ha ocurrido (misma asignacin de bits que en el registro CX en la instalacin) BX = estado de los botones bit 0 =1: botn izquierdo pulsado bit 1 =1: botn derecho pulsado bit 2 =1: botn central pulsado (Mouse Systems/Logitech mouse) CX = columna donde se encuentra el cursor del ratn DX = fila donde se encuentra el cursor del ratn SI = distancia en mickeys del ltimo movimiento horizontal del ratn DI = distancia en mickeys del ltimo movimiento vertical del ratn Prcticas de Perifricos 4 de 7 Ratn

INT 33h - Instalar un controlador de eventos alternativo para combinacin con Alt/Shift/Ctrl Entrada: AX = 0018h CX = mscara de los eventos que queremos que gestione el controlador alternativo bit 0: si el ratn se mueve bit 1: si se pulsa el botn izquierdo bit 2: si se libera el botn izquierdo bit 3: si se pulsa el botn derecho bit 4: si se libera el botn derecho bit 5: si la tecla Shift est pulsada durante el evento bit 6: si la tecla Control est pulsada durante el evento bit 7: si la tecla Alt est pulsada durante el evento ES:DX Direccin donde comienza la rutina del controlador alternativo que queremos instalar Salida: AX = 0018h: Ok = FFFFh: error Comentarios: El controlador de eventos alternativo es similar al controlador de eventos anteriormente descrito. La diferencia es que se activa cuando ocurre un evento y se est pulsando simultneamente una determinada tecla (Alt, Shift o Ctrl.) por lo que al menos uno de los bits 5-7 debe estar a uno en la mscara de eventos. Se deben tener en cuenta todas las consideraciones que se establecieron para la funcin 000Ch. Al controlador de eventos se le pasan los mismos valores que para el caso del controlador instalado mediante la funcin 000Ch (teniendo en cuenta que la asignacin de bits en AX coincide con la de CX) Esta funcin le permite a un programa instalar un mximo de tres controladores de eventos alternativos diferentes.

Realizacin prctica: Realizar un programa en C que compruebe el funcionamiento del ratn de un PC mediante un men de opciones gestionado mediante el ratn. Requisitos mnimos: El programa debe ser capaz de: Mostrar informacin sobre las caractersticas del ratn y del driver Mostrar/Ocultar el ratn Guardar el estado del ratn al principio del programa y restaurarlo al finalizar Definir una zona limitada en la pantalla donde el ratn se debe encontrar en todo momento Definir un cursor en modo texto Mostrar la posicin y el estado de los botones del ratn en todo momento (mediante sondeo o polling) Modificar la velocidad del cursor del ratn Requisitos ampliados (mediante un programa nuevo): Gestionar el men mediante un controlador de eventos de tal modo que el programa no tenga que estar sondeando en todo momento el estado del ratn sino que cualquier cambio en el estado del mismo se gestione mediante dicho controlador de eventos Definir un controlador de eventos alternativo que responda al evento (Alt+Botn izquierdo pulsado) para salir del programa Gestionar el men en modo grfico 640x480 y disear un puntero grfico

Prcticas de Perifricos

5 de 7

Ratn

Sugerencias (para los requisitos ampliados): Para las llamadas a las funciones 0009h, 000Ch y 00018h se debe pasar a la interrupcin 33h un puntero en los registros ES:DX. Para ello, debemos utilizar la funcin int86x que viene definida en el fichero de cabecera dos.h del lenguaje C1. La definicin de dicha funcin es la siguiente:
#include <dos.h> int int86x(int intno, union REGS *inregs, union REGS *outregs, struct SREGS segregs);

donde intno es el nmero de interrupcin que queremos llamar (aqu la 0x33). En inregs se especifican los valores de los registros antes de la llamada y en outregs se obtienen los valores de los mismos tras ser ejecutada la rutina correspondiente (ver prctica anterior). En segregs se pueden especificar los valores de los registros de segmento ES y DS (los dems segmentos son ignorados por int86x, que adems restablece DS al valor previo tras la llamada). La estructura SREGS est definida de la siguiente forma:
struct SREGS { unsigned int unsigned int unsigned int unsigned int }; es; cs; ss; ds;

Para poder obtener la direccin de segmento y de offset de una rutina o una variable se pueden utilizar las macros definidas en dos.h: FP_SEG y FP_OFF (ver la ayuda del Borland C sobre estas funciones). Para definir la funcin que vaya a controlar los eventos del ratn mediante las funciones 000Ch y 0018h, recordemos que stas deben cumplir los siguientes requisitos: Deben estar definidas como FAR, ya que el driver del ratn las llama de esa forma (hay que recordar que las rutinas del driver del ratn se encuentran en otro segmento de cdigo). Han de guardar los diferentes registros del procesador y volverlos a restaurar (ver _saveregs en la ayuda de Borland C). No se debe comprobar el desbordamiento de la pila ya que es posible que la rutina se encuentre con otro segmento de pila o con otro segmento de datos (ver la directiva #pragma option N- en la ayuda de Borland C). Si quieren acceder a rutinas o variables NEAR del propio programa deben cargar la direccin del segmento de datos (DS) donde se encuentren dichas rutinas o variables NEAR (ver _loadds en la ayuda de Borland C).

Nota: Cuando se usa un controlador de eventos se debe tener en cuenta que el ratn puede interrumpir al programa en cualquier instante. Existe un problema de re-entrada en la int 21h, que adems es una interrupcin que modifica el segmento de pila, por lo que NO conviene utilizar rutinas de la int 21h durante el bucle de espera. En particular, si en el bucle del programa estamos esperando a que se pulse una tecla por el usuario,
1

Si se usa Borland C, con otros compiladores consulte la Ayuda del compilador. 6 de 7 Ratn

Prcticas de Perifricos

NO se deben utilizar las funciones kbhit(), getch(), etc... del C sino que debemos utilizar las rutinas del teclado implementadas en la sesin de prcticas anterior utilizando la int 16h (esto slo es necesario para programas que utilicen controladores de eventos del ratn). En definitiva, la definicin del controlador en lenguaje C debe tener la siguiente forma:
#pragma option N// para deshabilitar el chequeo de la pila

void far _saveregs _loadds ControladorEventosRaton(void) { // comandos de la rutina ... } #pragma option N // para habilitar el chequeo de la pila // (opcional y slo para rutinas que no son // llamadas por el controlador de eventos)

Por ltimo, simplemente recordar que para acceder directamente a los registros internos de la CPU, en C estn predefinidas las pseudovariables _AX, _BX, etc.

Prcticas de Perifricos

7 de 7

Ratn

Das könnte Ihnen auch gefallen