Teclado

Estado do i8042, scancodes set 1, command byte e leitura por polling ou interrupções.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Estado e scancodes

A chegada segue esta ordem: o teclado envia o byte, o KBC guarda-o no output buffer com OBF a 1, levanta IRQ1 se ativa, e o programa lê estado em 0x64 e dados em 0x60. Teclado e rato partilham a porta de dados, pelo que as rotinas precisam de coordenar o consumo.

Bit de estadoSignificado a 1
7, PARITY; 6, TIMEOUTByte com erro
5, AUXByte do rato
1, IBFNão escrever, input buffer cheio
0, OBFHá byte no output buffer

Se OBF estiver ativo, consome o byte mesmo com erro e descarta-o. Em polling, distingue a origem por AUX. No laboratório, subscreve IRQ1 com a política exclusiva e reativação previstas.

No set 1, muitas teclas têm make ao premir e break com bit 7 ligado ao largar. Esc usa 01 e 81. Scancode não é ASCII; texto exige interpretação do layout e modificadores.

Prefixos e eventos completos

E0 4D E0 CD 81 produz três eventos: make da seta direita, break da seta direita e break de Esc. E0 não emite evento, apesar de ter o bit 7 a 1.

  • Conserva o prefixo entre atendimentos. O handler recolhe um byte e regressa; não espera pelo seguinte.
  • O descodificador monta o código; a aplicação age apenas sobre o evento completo.
  • Se um byte se perder por erro, invalida o prefixo parcial segundo a política de recuperação.
  • O modelo de um byte ou prefixo E0 não cobre sequências especiais como Pause.
  • Make repetido pode significar tecla mantida. Uma ação única por pressão exige detetar a transição de solta para premida.

Command byte

O command byte configura o KBC e é diferente do estado. Bits 0 e 1 ativam interrupções de teclado e rato; bits 4 e 5 desativam as respetivas interfaces.

OperaçãoSequência
LerEsperar IBF=0, escrever 0x20 em 0x64, esperar OBF, ler 0x60
EscreverEsperar IBF=0, escrever comando 0x60 em 0x64, esperar IBF=0, escrever o novo byte em 0x60

Para ativar apenas IRQ do teclado, usa old | 0x01. Com old = 0x22, o novo valor é 0x23; escrevê-lo diretamente em 0x64 não fornece o argumento correto.

Scancodes e respostas usam o mesmo buffer. A fase de comandos controla quem o lê. Desativar apenas IRQ não impede novos scancodes; uma estratégia pode desativar temporariamente a interface, tratar pendentes e repor o estado anterior. Limita esperas e trata erros.

Inatividade

Um limite de 3 s a 60 Hz corresponde a 180 ticks desde a última atividade válida. Define se um byte válido ou apenas uma tecla completa reinicia o contador. Fixa também a ordem quando tecla e timer chegam juntos, pois pode decidir o resultado no limite.

Descodificador C completo.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.