Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ ÍNDICE • Introducción ................................................pág. 1 • Implementación de la práctica ....................pág. 2 • Interrupciones ..............................................pág. 2 ¾ Función 0 INT 14h...............................pág. 4 ¾ Función 2 INT 14h...............................pág. 5 ¾ Función 5 INT 14h...............................pág. 6 ¾ Función 9 INT 21h ..............................pág. 6 • Protocolo del ratón ......................................pág. 7 • Diagrama de flujo ........................................pág. 8 • Explicación del código ................................pág. 9 • Conclusiones .............................................pág. 11 • Anexo: código fuente ................................pág. 12 0 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ INTRODUCCIÓN En esta segunda práctica de la asignatura, el objetivo era doble: por un lado el alumno debía aprender los conocimientos básicos del lenguaje ensamblador 80x86. De todas formas, en otras asignaturas ya se había estudiado el lenguaje ensamblador, por lo que a pesar de que en esta ocasión se trataba de un lenguaje en concreto (el del 80x86) con sus características particulares, ésta no debía suponer la parte más complicada de la práctica. Por otro lado, el alumno debía aprender los mecanismos, por llamarlo de alguna manera, de un periférico en concreto, el ratón. A pesar de que éste podía ser distinto a petición del alumno (2 botones, 3 botones, distinto modelo, etc) todos partían de una base en común, la interfaz del mismo tenía que ser RS2/32. Así pues, la realización de esta práctica consistía en que el alumno realizase un programa ensamblador que utilizara la interrupción de BIOS INT 14h para así poder acceder al puerto serie. Mediante este puerto se leería la información transmitida por el ratón, para luego decodificar dicha información e informar al usuario por pantalla cuando se había pulsado un botón y, por supuesto, de que botón se trataba. Además, se podían realizar tareas opcionales por parte del alumno, como por ejemplo descifrar la información relativa al movimiento del ratón y mostrar por pantalla los valores de x e y que mostraría el cursor de dicho ratón, etc. 1 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ IMPLEMENTACIÓN DE LA PRÁCTICA A continuación pasaremos a explicar la implementación de la práctica, así como determinados aspectos importantes que consideramos relevantes. Empezaremos por explicar las interrupciones utilizadas, junto con las funciones más importantes de las mismas. Posteriormente, presentaremos un diagrama de flujo en el que se apreciará de forma sencilla el camino que hemos seguido para la realización de esta práctica. Finalmente, nos centraremos en explicar diversas secciones de nuestro código, que aclararán en mayor o menor medida nuestras soluciones adoptadas. INTERRUPCIONES Las interrupciones son señales enviadas a la CPU para que termine la ejecución de la instrucción en curso y atienda una petición determinada, continuando más tarde con lo que estaba haciendo. Cada interrupción lleva asociado un número que identifica el tipo de servicio a realizar. A partir de dicho número se calcula la dirección de la rutina que lo atiende y cuando se retorna se continúa con la instrucción siguiente a la que se estaba ejecutando cuando se produjo la interrupción. Hay tres tipos básicos de interrupciones: • Interrupciones internas o excepciones: Las genera la propia CPU cuando se produce una situación anormal o cuando llega el caso. • Interrupciones hardware: Son las generadas por la circuitería del ordenador en respuesta a algún evento. • Interrupciones software: Producidas por el propio programa (instrucción INT) para invocar ciertas subrutinas. La BIOS y el DOS utilizan algunas interrupciones a las que se puede llamar con determinados valores en los registros para que realicen ciertos servicios. También existe alguna que otra interrupción que se limita simplemente a apuntar a modo de puntero a una tabla de datos. 2 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ En nuestro caso, la instrucción que utilizamos para poder tener acceso a los datos del controlador RS232 fue la instrucción 20. Hay que destacar que cualquier interacción con dicho controlador se hace desde la INT 14h. Pero para especificar el tipo de interacción que se quiere realizar hay que indicar una función en concreto. Para ello, el registro AH se debe inicializar al número de la función a utilizar, pudiendo ser este número 00h, 01h, 02h, 03h, 04h y 05h, respectivamente. Evidentemente, según se trate de un número u otro, se realizarán distintas acciones. Antes hemos comentado la utilización del registro AH para indicar que tipo de función se desea realizar. Pero, además de este registro, también deberemos tener en cuenta el registro AL si queremos mandar datos al controlador o recibir datos del mismo. Y es que, previa a la llamada a la interrupción INT14h, cuando queremos enviar un dato al controlador, dicho dato se ha de encontrar ubicado en el registro AL. Así mismo, un dato que se quiera recibir desde el controlador se almacenará en el mencionado registro AL, al haberse ejecutado la llamada a la interrupción INT14h. También hay que mencionar que antes de realizar la llamada a la interrupción INT14h, en el registro DX debemos almacenar el número del puerto RS232 en el que está conectado el ratón. Obviamente, esto se ha de realizar porque un ordenador tiene mas de un puerto RS232, si solo dispusiera de uno no sería necesario realizar la indicación anterior. Básicamente, estos son los conceptos que se han de tener claros a la hora de utilizar la interrupción INT14h, pues sin ellos la realización de la práctica no sería posible. A continuación pasaremos a explicar las funciones que utilizamos para el desarrollo de la práctica, ya que son igualmente importantes y su utilización es vital para lograr el objetivo de la misma. 3 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ FUNCIÓN 0 La función 0 (AH=00h) de la interrupción 14 (INT 14h) nos servirá para configurar el puerto. La configuración cambiará en función del ratón que vayamos a emplear. Para realizar dicha configuración, el registro AL estará formado por pequeños grupos de bits, cada uno de los cuales indicará una característica configurable del ratón. Vamos a mostrarlo a continuación, para que se entienda mejor lo que acabamos de explicar: • Bits nº 0 y 1: Estos bits son los encargados de indicar el tamaño de la palabra, pudiendo elegir entre 8 bits (bit 0, bit 1 = 11) y 7 bits (bit 0, bit 1 = 10). • Bit nº 2: Este bit indica el número de stop bits que utiliza la interfaz RS232. Puede tratarse de 1 stop bit (bit 2= 0) o de 2 stop bits (bit 2= 1). • Bits nº 3 y 4: Son los encargados de indicar la paridad. Éstas son las posibles opciones: o Paridad nula Æ (bit 4 bit 3 = 00, bit 4 bit 3 = 10) o Paridad par Æ (bit 4 bit 3 = 11) o Paridad impar Æ (bit 4 bit 3 = 01). • Bits nº 5, 6 y 7: Por último, estos bits son los encargados de indicar la velocidad de transferencia del ratón conectado a la interfaz RS232. Las distintas opciones son: o o o o o o o o 110 baudios Æ (bit 5 bit 6 bit 7 = 000) 150 baudios Æ (bit 5 bit 6 bit 7 = 001) 300 baudios Æ (bit 5 bit 6 bit 7 = 010) 600 baudios Æ (bit 5 bit 6 bit 7 = 011) 1200 baudios Æ (bit 5 bit 6 bit 7 = 100) 2400 baudios Æ (bit 5 bit 6 bit 7 = 101) 4800 baudios Æ (bit 5 bit 6 bit 7 = 110) 9600 baudios Æ (bit 5 bit 6 bit 7 = 111) Esta función (la función 0) devuelve en el registro AH el estado del puerto, y en el registro AL el estado del módem (esto último no nos incumbe). 4 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ FUNCIÓN 2 La función 2 (AH= 02h) de la interrupción 14 (INT 14h) sirve para leer del puerto serie los datos recibidos. Estos datos deberemos tratarlos para saber en todo momento que acción realiza el usuario y así poder empezar a tratar los bytes de información correspondientes al ratón. Como ya ocurriera con otras funciones, previa a la llamada de la interrupción 14 (INT 14h) en el registro DX se ha de especificar el puerto al que está conectado el periférico (el ratón). Tras la llamada, la función 2 devuelve en el registro AX datos muy importantes de cara al desarrollo de la práctica. Por un lado, en el registro AH devuelve el estado del puerto, distinguiendo si se produjo algún envío de datos (en cuyo caso el bit más significativo estará a 0) o si por el contrario no se produjo envío ninguno, por lo que dicho bit contendrá un 1. Esto nos será de gran utilidad para saber en que momento el usuario está operando con el ratón. Por su parte, en caso de que se produjese algún envío de datos (un 0 en el bit más significativo del registro AH), en el regisro AL se almacenará el byte de información recibido. Una cosa importante a resaltar es el hecho de que el periférico en realidad no manda toda su información en un byte, sino que lo hace en paquetes de 3 bytes (incluso de hasta 4 bytes), y la función 2 (AH= 02h) de la interrupción 14 (INT 14h) sólo nos permite leer un byte. Es por eso por lo que se deberá llamar a esta función tantas veces como haga falta para poder descifrar los bytes enviados por el periférico y saber si se está realizando una acción u otra. 5 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ FUNCIÓN 5 La función 5 (AH= 05h) de la interrupción 14 (INT 14h) sirve para activar el “lazo de prueba”, el cual nos permitirá conectar el ratón al puerto serie sin necesidad de modificar el cable. La modificación de dicho cable no es necesaria porque el lazo de prueba conecta el controlador con el periférico. Por otro lado, antes de llamar a la interrupción 14 (INT 14h), debemos especificar si deseamos escribir o leer en el registro de control del puerto. En nuestro caso, deseamos realizar una escritura, por lo que deberemos establecer AL con el valor 01h (por lo que el valor 00h se refiere lógicamente a una operación de lectura). A su vez, el registro DX deberá contener el puerto al que está conectado el ratón. Para poner en marcha el lazo de prueba, deberemos activar en el registro BL el cuarto bit, que es el encargado de activar dicho lazo de prueba. Los demás bits no tienen importancia para el desarrollo de la práctica, por lo que no haremos ningún comentario al respecto. La función 5 (AH= 05h) de la interrupción 14 (INT 14h) devuelve en el registro AH el estado del puerto y en el registro BL el la información del registro de control del controlador RS232. Además devuelve en el registro AL el estado del módem (pero esto no nos atañe). FUNCIÓN 9 Otra de las funciones utilizadas en la práctica fue la función 9 (AH= 09h), pero esta vez correspondiente a la interrupción 21 (INT 21h). Dicha función lo que hace es desplegar una cadena de caracteres por pantalla. Antes de realizar la llamada a la interrupción correspondiente, el registro AH ha de contener el valor 09h, para indicar que acción queremos llevar a cabo. Además, el registro DX debe contener la dirección de inicio de la mencionada cadena de caracteres. Esta función no devuelve ningún valor contenido en algún registro, simplemente muestra los caracteres, uno a uno, desde la dirección indicada en el registro DX hasta encontrar un carácter $, que es interpretado como el final de la cadena. 6 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ PROTOCOLO DEL RATÓN A continuación mostraremos brevemente el protocolo de nuestro ratón. Dicho ratón consta de tres botones (izquierdo, central y derecho) y es modelo Genius. El protocolo utilizado es el de Logitech. Así pues, el protocolo Logitech se ajusta a la siguiente tabla: Byte bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 X 1 LB RB dy7 dy6 dx7 dx6 1 X 0 dx5 dx4 dx3 dx2 dx1 dx0 2 X 0 dy5 dy4 dy3 dy2 dy1 dy0 3 Hay que destacar que el periférico, como ya se comentó anteriormente, envía paquetes de 3 bytes al controlador RS232. Tan solo mandará paquetes de 4 bytes cuando se pulse el botón central. Otra cosa importante a destacar es la información del bit 7, que como se puede apreciar no es relevante. Por otro lado, mencionar que los ratones de 3 botones de Logitech usan una extensión diferente al protocolo Microsoft. Cuando el botón central está levantado, se envía el paquete anterior de 3 bytes. Cuando el botón central está pulsado, se envía un paquete de 4 bytes donde el 4º byte tiene el valor 0x20 (o, al menos, tiene activo el bit 0x20). En particular, la pulsación del botón central se indica como 0, 0, 0, 0x20 cuando ningún otro botón está pulsado. 7 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ DIAGRAMA DE FLUJO Antes de pasar a explicar determinadas partes de nuestro código, se mostrará el diagrama de flujo de la solución adoptada, para así tener un conocimiento previo de cómo hemos solventado las diversas dificultades que proponía la resolución de la práctica. Lectura del puerto NO AH ? SÍ NO AL(6) SÍ Tratar (1er byte) Leer Tratar (2º byte) Leer Tratar (3er byte) Leer SÍ AH ? NO AL(6) SÍ NO Tratar (4º byte) Cuando preguntamos por AH nos referimos a si el usuario ha realizado alguna acción o no, y cuando preguntamos por AL(6) nos referimos al sexto bit (bit 6) del registro AL (saber si está activo o no). 8 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ EXPLICACIÓN DEL CÓDIGO A continuación pasaremos a explicar los procedimientos utilizados en nuestro código, para que se entienda fácilmente lo que se hace en cada momento y no tener ningún problema en el apartado “Anexo”, en el que se pondrá todo el código fuente. Configuración del puerto: Por un lado usamos la función cero de la interrupción 14, que nos servirá para configurar el puerto. Para ello, en el registro AL metemos el valor 86h. Este valor se corresponde con las características de nuestro ratón (ver “Función 0”). Más concretamente nuestro ratón lo hemos configurado de la siguiente manera: Velocidad de transferencia Æ 1200 baudios, sin bits de paridad, 2 stop bits y 7 bits como tamaño de palabra. Además, especificamos el puerto al que está conectado el ratón (etiquetado como comX). ConfigPUERTO Proc MOV MOV MOV INT AH, 00h AL, 86h DX, comX 14h Por otra parte, debemos de activar el lazo de prueba. Como ya se comentó anteriormente, esto se consigue mediante la función 5 de la interrupción 14. Tan solo debemos configurar los parámetros antes de realizar la llamada a dicha interrupción. En el registro AL insertamos el valor 01h mientras que en el registro BL activamos el cuarto bit. Además, en el registro DX, indicamos el puerto al que está conectado el ratón. MOV AH, 05h MOV AL, 01h OR BL, 10h MOV DX, comX INT 14h RET nde 9 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ Leer byte: Para saber que datos están siendo enviados por el ratón utilizamos la función 2 de la interrupción 14. Para ello, antes de realizar la llamada debemos de dejar indicado en el registro DX el puerto al que está conectado el ratón. Una vez realizada la llamada a la interrupción, el resultado se almacena en el registro AX, mediante el cual sabremos que acción ha realizado el usuario. LeerBYTE Proc MOV AH, 2h MOV DX, comX INT 14h RET nde Mostrar en formato binario los bytes enviados por el ratón: Para llevar a cabo este proceso, utilizamos una máscara que nos servirá para ir “descodificando” cada bit. Dicha máscara empieza valiendo 80h (10000000b) y su valor se irá reduciendo para ir tratando los respectivos bits hasta llegar al valor cero, momento en el que habremos terminado de mostrar los bits por pantalla. Si detectamos que se trata del bit cero, metemos en el registro DL el código ASCII del carácter cero (30h), en caso contrario metemos en ese mismo registro el código ASCII del carácter uno (31h). pbyte Proc push_a MOV DH, DL MOV CL, 80h mostrar: AND DL, CL JZ bitcero MOV DL, 31h JMP impcarac bitcero: MOV DL,30h 10 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ Por otro lado, para mostrar la información por pantalla utilizamos la función 2 de la interrupción 21, que imprimirá el contenido del registro DL. Además, desplazamos la máscara hacia la derecha, para que esté preparada para tratar el siguiente bit. Impcarac: MOV AH,2 INT 21h MOV DL, DH SHR CX, 1 JNZ mostrar Por último, imprimimos un salto de línea y restauramos los valores que habíamos guardado en la pila. MOV AH,9h MOV DX, offset sl INT 21h pop_a RET nde CONCLUSIONES Como conclusiones podríamos destacar el hecho de que el alumno haya adquirido conocimientos acerca de cómo determinados periféricos transmiten sus datos hacia el ordenador (en este caso un ratón). Así mismo, también ha supuesto un pequeño estudio del lenguaje ensamblador 80x86, sus ventajas, sus desventajas y sus principales comandos utilizados en la sintaxis. La práctica en sí no era muy complicada, la mayor dificultad residía en saber las pautas que debía seguir el ratón a la hora de comunicarse con el ordenador, así como la utilización de las distintas funciones de la interrupción 14. De todas formas, la práctica se podía complicar bastante dependiendo de las diversas posibilidades que el alumno podía realizar como parte optativa de la práctica (lo mínimo era que se indicase por pantalla cuando se habían pulsado cada uno de los botones). Aun así, tuvimos algunas dudas que fueron solventadas por el profesor de la asignatura (en cuanto a las prácticas se refiere). 11 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ ANEXO: CÓDIGO FUENTE ;--------------------------------------------------------------------; A continuación se muestran dos macros. Una se encarga de introducir ; cuatro registros en la pila (push_a) mientras que la otra se encarga ; de sacarlos (pop_a). Esto sirve para salvar determinados valores y ; posteriormente recuperarlos sin haber perido su valor ;--------------------------------------------------------------------push_a Macro PUSH AX PUSH BX ; ; ; ; Registros de 16 bits de propósito general, a pesar de que tienen asiganados tareas más específicas Mas concretamente, acumulador (AX), Base (BX), Contador (CX) y Dato (DX), respectivamente PUSH CX PUSH DX EndM ;--------------------------------------------------------------------;--------------------------------------------------------------------pop_a Macro POP DX ; De la pila se deben sacar los registros en el orden ; inverso al que fueron introducidos POP CX POP BX POP AX EndM ;--------------------------------------------------------------------; Utilizaremos una macro para mostrar texto por pantalla. Se le pasará ; la dirección que indicará el texto a mostar. ; Para ello utilizaremos la funcion 9h de la interrupción 21, que ; sirve para imprimir una string ;--------------------------------------------------------------------mostrar_texto Macro msg push_a MOV DX, offset msg MOV AH, 09h INT 21h pop_a ; ; ; ; ; ; ; Se guardan los registros en la pila DX contendrá la dirección del texto a mostrar En AH se ha de especificar la función a utilizar (en este caso 09h) Se llama a la interrupción 21 Se recuperan los registros de la pila Ende 12 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ ;--------------------------------------------------------------------;------------------------- MENÚ PRINCIPAL -------------------------;--------------------------------------------------------------------comX Equ 0 DATOS SEGMENT MSG1: '$' db "Practica 2 de Perifericos e Interfaces", 13, 13, 10, eje_x eje_y SOLTAR db 00 db 00 db 00 IZQ: CENT: DER: db "BOTON IZQUIERDO", 13, 10, '$' db "BOTON CENTRAL", 13, 10, '$' db "BOTON DERECHO", 13, 10, '$' xxx: yyy: db "movimiento en X:",'$' db "movimiento en Y:", '$' sl: db 10,13,'$' DATOS ENDS ; Para imprimir un salto de línea (sl) ;--------------------------------------------------------------------;--------------------------------------------------------------------PILA SEGMENT dw 512 DUP (?) PPILA dw 0 PILA ENDS ; Se asignan 512 palabras de ; contenido indefinido ;--------------------------------------------------------------------;--------------------------------------------------------------------CODIGO SEGMENT ASSUME CS: CODIGO, SS: Pila, DS: DATOS, ES: DATOS ;--------------------------------------------------------------------; Procedimiento encargado de configurar el puerto de donde se van a ; leer los datos y almacenarlos en memoria ;--------------------------------------------------------------------configPUERTO Proc MOV AH, 00h MOV AL, 86h MOV DX, comX INT 14h ; ; ; ; ; ; ; ; La función 0 de la interrupción 14 nos servirá para configurar el puerto Configuración del puerto según las características de nuestro ratón (explicado con más detalle en la memoria) Se especifica el puerto que hay que configurar Se llama a la interrupción 14, encargada de 13 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ ; gestionar el puerto serie MOV AH, 05h ; Usaremos la función 5 para activar el "lazo ; de prueba" MOV AL, 01h ; Dicha función lleva dos parámetros, AL con el ; valor 01h OR BL,10h ; y BL, con el bit 4 activado MOV DX, comX ; Antes de llamar a INT14h metemos en el ; registro DX la dirección del puerto a ; utilizar INT 14h ; Llamada a la interrupción 14 RET EndP ;--------------------------------------------------------------------; Procedimiento encargado de leer del controlador del registro de ; datos, para saber qué datos fueron enviados desde ; el periférico a dicho controlador. El resultado se almacena en el ; registro AX, mediante el cual sabremos la acción ; que realizó el usuario (se explica con más detalle en la memoria) ;--------------------------------------------------------------------leerBYTE Proc MOV AH, 2h MOV DX, comX INT 14h RET ; ; ; ; ; Para leer del controlador se utiliza la función 2 de la interrupción 14 Especificamos en el registro DX el puerto donde se encuentra el periférico Llamada a la interrupción 14 EndP ;--------------------------------------------------------------------; Proceso para mostrar por pantalla en formato binario los bytes ; enviados por el ratón ;--------------------------------------------------------------------pbyte Proc push_a ; Lo primeros que hacemos es guardar los ; registros en la pila MOV DH, DL ; ; ; ; ; DL contendrá el byte que queremos pasar a bits. Hacemos una copia en DH para no perder su valor En CL estará la máscara (80h --> 10000000b) ; ; ; ; ; ; ; ; Hacemos un AND entre el byte a analizar y la máscara Si el resultado es cero, es que el bit7 está a cero, por lo que saltamos a bitcero En caso contrario, el bit7 está a uno, por lo que metemos en DL el código ASCII del carácter uno MOV CL, 80h mostrar: AND DL, CL JZ bitcero MOV DL, 31h JMP impcarac bitcero: MOV DL,30h ; El registro DL contendrá el código ; ASCII del carácter cero 14 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ impcarac: MOV AH,2 INT 21h MOV DL, DH SHR CX,1 JNZ mostrar ; ; ; ; ; Usaremos la función 2 de la interrupción 21 Dicha función imprime el carácter que tendrá su código ASCII en el registro DL ; ; ; ; Restauramos el valor que contenía el registro DL Vamos desplazando hacia la derecha la máscara ; Mientra dicha máscara no valga cero, ; saltaremos a mostrar para volver a ; empezar MOV AH,9h ; ; ; MOV DX, offset sl ; ; INT 21h pop_a Imprimimos un salto de línea. Para ello utilizamos la función 9 (imprimir string) de la interrupción 21 DX contiene la dirección del texto a mostrar ; Antes de retornar, recuperamos los ; registros que habíamos guardado en la ; pila RET EndP ;--------------------------------------------------------------------; Inicio del programa principal ;--------------------------------------------------------------------raton: MOV MOV MOV MOV MOV MOV AX, DS, ES, AX, SS, SP, DATOS AX AX PILA AX OFFSET PPILA mostrar_texto MSG1 CALL configPUERTO ; Inicialización de los segmentos ; Se muestra el texto contenido en MSG1 ; Se configura el puerto adecuadamente ;--------------------------------------------------------------------; Procesamiento de los bits que forman el protocolo de Microsoft ;--------------------------------------------------------------------bucle: CALL leerBYTE TEST AH,80h JNE bucle ; ; ; ; ; ; ; ; ; ; Llamamos a leerBYTE para leer del controlador de registro de datos Comprobamos que el bit más significativo del registro AH está a 1, y por lo tanto saber si el usuario ha hecho algo Si no lo está, el usuario no ha realizado ninguna acción, por lo que se sigue esperando a que se produzca alguna acción 15 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ TEST AL, 40h JZ bucle ; ; ; ; ; Ahora se comprueba si se ha empezado con el envío de los bytes de información Si no es así, se vuelve a bucle, en caso contrario comenzaremos a tratarlos ;--------------------------------------------------------------------;------------------- tratamiendo del primer byte ------------------;--------------------------------------------------------------------tratar: TEST AL, 20h JZ no_izq mostrar_texto IZQ no_izq: TEST AL, 10h JZ no_der mostrar_texto DER no_der: MOV eje_y, AL SHL eje_y, 3 AND eje_y, 60h SHL eje_x, 5 MOV eje_x, AL AND eje_x, 60h ; ; ; ; ; ; ; ; Se comprueba si está activado el bit correspondiente a LB (Left Button) Si no lo está, se salta a la etiqueta no_izq (no izquierdo) En caso contrario se mostrará por pantalla que se ha pulsado el botón izquierdo ; ; ; ; ; ; ; ; ; De no haberse pulsado el botón izquierdo, se hará la misma comprobación con el botón derecho Si el bit correspondiente a RB (Right Button) es cero, se saltará a no_der (no derecho) En caso contrario se mostrará por pantalla que se ha pulsado el botón derecho ; ; ; ; ; ; ; ; Metemos en eje_y el primer byte de información Desplazamos tres bits a la izquierda para quedarnos con la información de x e y Ahora hacemos un AND con 60h(1100000) para quedarnos solo con la información de y ; ; ; ; ; ; ; ; Desplazar cinco bits a la izquierda para quedarnos solo con la información de x Metemeos en eje_x el primer byte de información Hacemos de nuevo un AND con 60h para quedarnos solo con la información de x 16 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ ;--------------------------------------------------------------------;-------------------- tratamiendo del segundo byte ----------------;--------------------------------------------------------------------CALL leerBYTE AND AL, 3fh OR eje_x,AL ; ; ; ; ; ; ; ; ; ; Llamamos a leerBYTE para leer el segundo byte de información Hacemos un AND con 3fh(0111111) para quedarnos con la información de x Ahora le sumamos la información de x que ya teníamos para tener en eje_x la información del movimiento del eje x producido en el ratón ;--------------------------------------------------------------------;--------------------- tratamiendo del tercer byte ----------------;--------------------------------------------------------------------CALL leerBYTE AND AL, 3fh ; ; ; ; ; ; El procedimiento es análogo al anterior, por lo que no merece más comentarios En eje_y tendremos la información del moviemiento del eje y producido en el ratón OR eje_y, AL mostrar_texto xxx MOV DL,eje_x CALL pbyte mostrar_texto yyy ; Se muestra el movimiento que se ; ha realizado sobre el eje x ; Pbyte se encargará de mostrar la ; información en formato binario ; Se actúa de la misma manera con ; el movimiento realizado sobre el ; eje y MOV DL,eje_y CALL pbyte ;--------------------------------------------------------------------;-------------------- tratamiendo del cuarto byte -----------------;--------------------------------------------------------------------CALL leerBYTE TEST AH, 80h JE sig JMP bucle sig: TEST AL, 40h JZ sig2 JMP tratar ; ; ; ; ; ; ; ; Se llama a leerBYTE para tratar un nuevo byte Se comprueba si el usuario ha realizado alguna acción Cuando no se hace ninguna acción saltamos a la etiqueta sig En caso contrario volvemos al principio, a la etiqueata bucle ; ; ; ; ; ; Se hace a parte esta comprobación para evitar desincronizarnos a la hora de saber qué byte estamos tratando Si el primer byte está activado, se vuelve a empezar 17 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ sig2: TEST AL, 20h JE sig3 ; ; ; ; ; Comprobamos que lo que se ha hecho ha sido pulsar el botón central Si ES 20h(Protocolo Logitech) se habrá pulsado el botón central ; ; ; ; ; Se muestra por pantalla que se ha pulsado el botón central Saltamos al bucle principal, para empezar de nuevo el mismo procedimiento JMP bucle sig3: mostrar_texto CENT JMP bucle ;--------------------------------------------------------------------MOV AH,4CH ; Se llama a la interrupción que ; finaliza el programa INT 21h ENDS End raton 18 Universidad de Las Palmas de Gran Canaria Ingeniería en Informática Periféricos e Interfaces Práctica nº 2 _____________________________________________________________________________________ 19