Trabajo - DavidHorat.com

Anuncio
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
Descargar