Rato
Pacotes PS/2, deltas de nove bits, comandos e deteção de gestos.
Pacote PS/2 e deltas
IRQ12 permite recolher bytes pelo i8042. Um pacote normal tem três bytes, recebidos separadamente.
| Primeiro byte | Campo |
|---|---|
| Bits 7 e 6 | Overflow Y e X |
| Bits 5 e 4 | Sinal Y e X |
| Bit 3 | Sempre 1 no cabeçalho |
| Bits 2, 1 e 0 | Botões meio, direito e esquerdo |
Os bytes 1 e 2 guardam os oito bits inferiores dos deltas. Sem overflow, os deltas têm nove bits em complemento para dois:
são bytes sem sinal e valem 0 ou 1. O intervalo é -256 a 255. Um cast para int8_t perde o nono bit: 08 C8 00 significa +200 em X, não -56.
Y físico positivo aponta para cima. Num ecrã com Y crescente para baixo, usa screen_y -= delta_y. Soma num tipo com sinal, aplica limites e só depois converte.
#include <stdint.h>
#include <stdio.h>
int main(void) {
uint8_t bytes[] = {0x28, 0x05, 0xFB};
int dx = (int)bytes[1] - ((bytes[0] & 0x10u) ? 256 : 0);
int dy = (int)bytes[2] - ((bytes[0] & 0x20u) ? 256 : 0);
int x = 100 + dx;
int y = 100 - dy;
printf("dx=%d dy=%d x=%d y=%d\n", dx, dy, x, y);
return 0;
}Executa o código para ver a saída e os gráficos.
A saída é dx=5 dy=-5 x=105 y=105, sem overflow ou clipping.
Montagem e comandos
- Com índice 0, aceita só um byte com bit 3 ligado. Nos índices 1 e 2, guarda qualquer byte. Depois do terceiro, entrega o pacote e volta a 0.
- Não reinicies ao encontrar bit 3 nos dados. É uma ajuda de sincronização, não uma garantia absoluta.
- Erro de comunicação invalida o pacote parcial. Overflow torna a magnitude desse eixo não fiável; define se ignoras o eixo ou todo o movimento.
- Stream envia pacotes espontâneos com reporting ativo. Remote entrega um pacote após
0xEB.0xEAseleciona stream,0xF0remote,0xF4ativa reporting e0xF5desativa-o.
Para cada byte de comando ou argumento: espera IBF=0, escreve 0xD4 em 0x64, espera IBF=0 e escreve o byte em 0x60. Lê a resposta com limite de espera.
0xFA é ACK, 0xFE pede reenvio e 0xFC indica erro. O comando de reenvio enviado pelo anfitrião não recebe ACK. 0xD4 também não recebe ACK do rato. Para 0xF3 e argumento, ambos recebem confirmação; se o argumento pedir reenvio, a regra dos slides repete o comando completo. Limita tentativas e separa respostas de pacotes, desativando reporting quando necessário.
Gestos
O parser produz pacotes; outra máquina interpreta o gesto. No arrasto do exemplo, a pressão inicia com acumulados zero e não soma movimento desse pacote. Só movimentos seguintes com botão premido contam.
Aceita uma vez ao atingir e . Movimento à esquerda ou desvio acumulado excessivo invalida o candidato até largar. (40,3), (40,3), (30,-2) falha no segundo movimento, pois ; o valor final 4 não recupera o gesto.