Aula Teórica 18
Sumário:Dispositivos de entrada: O teclado. Leitura Recomendada:
Capítulo 34 - Hans-Peter Messmer, The Indispensable PC Hardware Book, Addison-Wesley.
Capítulos 3, 6 e 12 - Peter Norton, Peter Aitken e Richard Wilton, PC Programmer´s Bible, Microsoft Press.
Teclado
Apesar dos grandes avanços tecnológicos das interfaces com o utilizador, o teclado continua a ser o mais importante dispositivo de entrada. Existem vários tipos de teclados: Os mais antigos de 83/84 teclas, os de 101/102 teclas e os teclados Windows de 104 teclas.
• Tipos de teclas
1. Caracteres standard: Letras de A a Z, algarismos de 0 a 9, e caracteres que têm código ASCII (como %, $, #, etc.). O facto de ter código ASCII significa que é visualizado no écran o caracter correspondente.
2. Teclas de controlo: <Alt>, <Ctrl> e o <Shift>. Trabalham em associação com outras teclas. A BIOS não lhes atribuí um código ASCII e trata-as de forma diferente, actualizando o seu estado na área de dados da BIOS.
3. Teclas que alternam (toggle keys): <Num Lock>, <Caps Lock>, <Insert> e <Scroll Lock>. Alternam de estado. A BIOS não lhes atribuí um caracter ASCII e também actualiza o seu estado na área de dados.
4. Teclas de função estendida: As teclas <F?> e todas as teclas do keypad, com o <Num Lock> desligado (<del>, <home>, etc.).
O teclado pode ser visto como um pequeno computador dedicado a converter toques nas teclas numa sequência de bits. A parte principal do teclado é o microprocessador (8048). O microprocessador supervisiona a matriz do teclado, que é feita de linhas que se intersectam, cada uma delas ligada ao processador do teclado. Nos pontos de intersecção encontram-se pequenos switches. Em cada um destes switches existe uma tecla. Quando se pressiona uma tecla, o switch respectivo fecha o contacto entre as linhas de intersecção da matriz. Desta forma o microprocessador consegue determinar as coordenadas do switch fechado, e portanto, determina a tecla que foi pressionada. O microprocessador também detecta quando a tecla é largada.
Figura nº 2 – Como é um teclado por dentro.
Existe um scan code que é transmitido através de um buffer à interface do teclado. Cada tecla ou combinação de teclas possui um scan code único associado, que é independente da sua localização no teclado. Desta forma o processador consegue saber que tecla foi activada. Um programa chamado driver do teclado (keyb.com no DOS) converte o scan code no caracter correspondente. Usando este método pode-se representar várias linguagens diferentes utilizando o mesmo teclado (o mesmo hardware). Basta simplesmente utilizar o driver do teclado apropriado. O driver do teclado utiliza uma tabela de conversão interna para atribuir a cada scan code um código ASCII, e assim um caracter. Usando outro driver, e consequentemente outra tabela de conversão, a estrutura técnica e os scan codes passados são exactamente os mesmos, mas o driver do teclado vai convertê-los num código ASCII diferente, resultando em caracteres diferentes.
Quando a tecla é libertada é gerado um break code que é igual ao scan code somado de 128. • Comunicação com a BIOS
O CPU do teclado realiza várias tarefas, sendo a principal monitorizar as teclas e avisar o processador do PC sempre que uma tecla é premida.
O CPU do teclado, após associar um scan code à tecla, guarda esse valor no porto 60H. De seguida, chama automaticamente a interrupção 09H da BIOS (na linha IRQ1). A interrupção lê o byte do porto 60H, compara o scan code com os valores de uma tabela, para associá-lo a um caracter ASCII, se for o caso, nem todas as teclas ou combinações de teclas têm código ASCII.
Depois, a rotina da interrupção 09H guarda o scan code e o código ASCII respectivo num buffer que está associado ao teclado. Este buffer está na área de dados da BIOS, ocupa 32 bytes, tem início na zona 0040:001EH e tem capacidade para guardar até 16 caracteres (2 bytes por caracter).
O caracter e o scan code poderão ser lidos do buffer usando a interrupção 16H da BIOS, a interrupção 21H do DOS, ou ainda acedendo directamente ao buffer.
Figura nº 3 - Comunicação entre o teclado e o sistema.
• Status do teclado
Como as teclas de controlo e as teclas que alternam, afectam o significado das outras teclas, a BIOS guarda informação sobre o seu estado na zona de memória 0040:0017H. Antes de interpretar uma tecla, a BIOS verifica o estado destes bits.
Bit = 1 Significado Bit = 1 Significado
7 Ins activo 6 CapsLock activo 5 NumLock activo 4 ScrollLock activo 3 <Alt> premida 2 <Ctrl> premida 1 <Left Shift> premida 0 <Right Shift> premida
Figura nº 4 - Bits na zona de memória 0040:0017H.
Nos teclados de 101/102 teclas há nove teclas que se encontram em duplicado no teclado (<Alt>, <Ctrl>, etc.) e por isso houve necessidade de guardar informação adicional. Assim, as BIOS recentes guardam um segundo byte na zona de memória 0040:0018H.
Bit = 1 Significado Bit = 1 Significado
7 <Ins> premida 6 <CapsLock> premida 5 <NumLock> premida 4 <ScrollLock> premida 3 <Pause> activa 2 <SysReq> premida 1 <Left Alt> premida 0 <Left Ctrl> premida
O byte com o endereço 0040:0096H também é importante. Se o bit 4 está igual a 1, significa que está instalado um teclado de 101/102 teclas ou 104 teclas e que o byte 0040:0018H contém a informação que foi descrita.
• Variáveis da BIOS associadas ao teclado
Figura nº 6 - As variáveis da BIOS para o teclado.
Buffer do teclado (0040:001EH a 0040:003DH) - 32 bytes, capacidade para 16 caracteres, pois cada caracter são dois bytes (scan code e ASCII code).
Posição do próximo caracter a ser lido do buffer (0040:001AH) - 2 bytes, guarda o offset da posição dentro do buffer do próximo caracter a ser lido, representa a cabeça do buffer.
Posição do próximo caracter a ser inserido no buffer (0040:001CH) - 2 bytes, guarda o offset da cauda do buffer.
0040:0080H e 0040:0082H - 2 words, podem ser usadas para mudar a área do buffer do teclado, por forma a alterar o seu tamanho ou localização. NOTA: O buffer do teclado está limitado ao segmento 0040H, os valores indicados nestes dois endereços referem-se aos offsets em relação ao início do segmento.
• Organização do buffer do teclado
Figura nº 7 – O buffer do teclado.
O buffer do teclado é organizado como um anel gerido por dois ponteiros. Os valores dos ponteiros são guardados na área de dados da BIOS nos endereços 0040:001AH e 0040:001CH. O ponteiro de escrita indica a próxima posição livre no buffer do teclado, onde será guardado o próximo caracter de input. O ponteiro de leitura indica qual será o próximo caracter a sair do buffer. Como funciona em anel é possível que o valor do ponteiro de leitura seja maior do que o valor do ponteiro de escrita.
Embora o teclado tenha espaço para 16 caracteres (32 bytes), na realidade ele acomoda apenas 15 caracteres no máximo, devido ao funcionamento da cabeça e da cauda do buffer.
Se os valores que se encontram em 0040:001AH (cabeça) e 0040:001CH (cauda) estão iguais, o buffer está vazio.
Se a cauda está logo atrás da cabeça, o buffer está cheio.
Para os caracteres normais, nos dois bytes são guardados o scan code e o ASCII code. Para caracteres estendidos, um byte guarda o keybrd code e o outro fica com o valor 0 (se a tecla não possui código ASCII associado) ou E0 (se é uma tecla do teclado estendido).
Os scan codes podem variar de teclado para teclado, mas o ASCII code é um standard. Por isso deve-se usar o código ASCII.
• Os serviços BIOS para teclado (via interrupção 16H)
Figura nº 8 – Serviços BIOS para teclado.
Serviço 00H e 10H - Lê o próximo caracter do teclado (serviço 00h para teclado de 83/84 teclas, serviço 10h para teclado de 101/102 teclas).
Se existir algum caracter no buffer do teclado, este é lido, senão espera que algum seja lá colocado. Entrada Saída
ah = 00 ou ah = 10h al = código ascii ah = scan code
Serviço 01H e 11H - Vê se existe algum caracter no buffer do teclado (serviço 01h para teclado de 83/84 teclas, serviço 11h para teclado de 101/102 teclas).
Entrada Saída
ah = 01 ou ah = 11h zero flag = 1, se não existir caracter zero flag = 0, se existir caracter al = ascii code
ah = scan code
Serviço 02H - Obtém o status do teclado, lendo a zona de memória 0040:0017H. Entrada Saída
Serviço 12H - Obtém o status do teclado para teclado estendido (101/012 teclas), lê a zona de memória 0040:0017H e a 0040:0018H.
Entrada Saída
ah = 12h al = status do teclado, byte 0040:0017H
ah = status do teclado estendido, byte 0040:0018H
Serviço 03H - Altera a taxa de repetição (velocidade a que uma tecla é repetida) e o typematic delay (tempo que a tecla leva em baixo antes de se começar a repetir).
Entrada Saída ah = 03 Não tem al = 05 (subfunção)
bl = taxa de repetição (*) bh = typematic delay (*)