Story Transcript
Pr´actica 3: El teclado del PC Gustavo Romero L´ opez Arquitectura y Tecnolog´ıa de Computadores
7 de junio de 2016
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
1 / 11
Objetivos Objetivos: Recordar el funcionamiento de las interrupciones. Describir el funcionamiento del teclado. Crear una controlador de teclado mediante manejo de interrupciones en varias fases: 1 2 3
M´ınimo: que imprima cualquier cosa al pulsar una tecla. Otro que imprima los c´ odigos de las teclas pulsadas. Uno u ´ltimo capaz de escribir c´ odigos ASCII.
Fuentes: Hardware: http://www.seasip.info/VintagePC/ibm_1391406.html Software: http://wiki.osdev.org/Babystep5 Recursos x86: Arquitectura Lenguaje ensamblador Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
2 / 11
El teclado del PC
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
3 / 11
Puertos utilizados por el teclado
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
4 / 11
Funcionamiento del teclado El teclado de los PCs no est´a hecho para generar directamente ASCII sino un c´odigo de b´ usqueda, en realidad dos: uno que se emite al pulsar una tecla y otro al soltarla. Si el c´ odigo de la pulsaci´on de una tecla es n, al soltarla se emite el c´odigo n+128 o´ n+0x80. El controlador del teclado debe traducir el c´ odigo de cada pulsaci´on a su correspondiente valor en ASCII. Las teclas de control deben ser tenidas en cuenta porque modifican el car´acter final obtenido. Ejemplo de como obtener la letra ’A’ may´ uscula: 1
Pulse la tecla May´us , con lo que se emite el c´odigo 0x2a.
2
Pulse la tecla A con lo que se emite el c´ odigo 0x1e.
3
Suelte la tecla A y se emite 0x9e = 0x1e + 0x80.
4
Suelte la tecla May´us y se emite el c´ odigo 0xae = 0x2a + 0x80.
5
El controlador calcula el c´ odigo ASCII de la ’A’, 0x41. Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
5 / 11
Cambio de manejador de interrupci´on y fin de interrupci´on Para cambiar el manejador de interrupci´ on hemos de cambiar la direcci´on de salto almacenada en el vector de interrupci´on. Recuerde que la tabla se almacena al principio de la memoria. Primero el desplazamiento y luego el segmento del manejador. La interrupci´on de teclado es la 0x09. 16 17 18 19 20 21
cli mov $0x09 , %bx shl $2 , %bx movw $controlador , ( %bx ) movw %ds , 2( % bx ) sti
# # # # # #
deshabilitar interrupciones interrupci o ´ n hardware del teclado bx = bx * 4 , direcci ´ o n del vector int . cambiar el desplazamiento la int . teclado cambiar el segmento de la int . teclado habilitar interrupciones
Cada vez que ejecuta el manejador de una interrupci´on hemos de emitir la orden de fin de interrupci´ on (EOI) para que el controlador de interrupciones 8259 sepa que ya ha sido atendida. Para ello es necesario escribir el valor 0x20 en el puerto 0x20. 35 36
mov $0x20 , %al out %al , $0x20
# c´ o digo EOI # enviar EOI
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
6 / 11
Makefile 1
SHELL = / bin / bash
2 3 4 5 6
ASM OBJ BIN ATT
= = = =
$ ( wildcard *. s ) $ ( ASM :. s =. o ) $ ( OBJ :. o =. bin ) $ ( BIN :. bin =. att )
7 8
all :
$ ( ATT ) qemu
9 10 11
clean : kill $ ( RM ) - rfv $ ( ATT ) $ ( BIN ) $ ( OBJ ) core .* *~
12 13 14
kill : killall -q qemu - system - i386 || echo " nothing to kill "
15 16 17
qemu : kill $ ( BIN ) qemu - system - i386 - fda $ ( BIN ) -s & > / dev / null &
18 19 20
%.bin : %.o $ ( LD ) -- oformat binary - Ttext 0 x7c00 $ < -o $@
21 22 23 24
%.att : %.bin objdump -D -b binary - mi386 - Maddr16 , data16 $ < > $@ Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
7 / 11
El m´as sencillo: basico.s I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
. code16 . text . globl _start
# co ´ digo de 16 bits # secci ´ o n de c ´ o digo # punto de entrada
_start : xor %ax , %ax mov %ax , %ds mov %ax , %ss mov $0x9c00 , %sp mov $0xb800 , %ax mov %ax , %es xor %di , %di
# # # #
ax ds ss sp
= = = =
# 0 xb800 --> ax | # ax --> es | video --> es : di = 0 xb8000 # 0 --> di |
cli mov $0x09 , %bx shl $2 , %bx movw $controlador , ( %bx ) movw %ds , 2( % bx ) sti stop : hlt jmp stop
0 0 0 | pila en 0 x09c00 = 0 x7c00 + 0 x2000 | ss : sp
# # # # # #
deshabilitar interrupciones interrupci o ´ n hardware del teclado bx = bx * 4 , direcci ´ o n del vector int . cambiar el desplazamiento la int . teclado cambiar el segmento de la int . teclado habilitar interrupciones
# ¿ hace falta ? # bucle vac ´ ıo
# ############################################################################## controlador :
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
8 / 11
El m´as sencillo: basico.s II
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
in $0x60 , %al
# leer c o ´ digo de tecla pulsada
mov $0x0f , %ah stosw
# color : blanco sobre negro # imprimir caracter : %ax --> %es :( % di ++)
mov $0x20 , %al out %al , $0x20
# c´ o digo EOI # enviar EOI
iret
# volver de la interrupci o ´n
# ############################################################################## . org 510 . word 0 xAA55
# posici ´ o n de memoria 510 # marca del sector de arranque
# ##############################################################################
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
9 / 11
2a versi´on: impresi´on de c´odigos num´ericos
1
2
Cree un nuevo directorio con una copia de basico.s y Makefile. Modifique basico.s de forma que se imprima el c´ odigo num´ erico que se obtiene al pulsar cada tecla. Recuerde que al liberarla tambi´en se emite otro c´odigo diferente.
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
10 / 11
3a versi´on: impresi´on de caracteres ASCII
1
2
Cree un nuevo directorio con una copia de basico.s y Makefile. Modifique basico.s de forma que obtenga el c´odigo de cada pulsaci´on, lo traduzca al car´ acter ASCII equivalente e imprima dicho car´acter.
Gustavo Romero L´ opez
Pr´ actica 3: El teclado del PC
11 / 11