
Originariamente inviata da
M.A.W. 1968
Dopo aver chiarito i dubbi fondamentali, possiamo provare a schematizzare il percorso con un esempio di base, relativo all'originale PC AT IBM. Al giorno d'oggi alcuni dettagli sono profondamente mutati, ma i concetti di retrocompatibilità rimangono del tutto invariati.
Tutti i valori esemplificativi sono esadecimali.
L'operazione avviene sostanzialmente in due tempi.
Premendo un tasto (ad esempio "P") sulla tastiera, il microcontroller ivi contenuto (in origine un Intel 8031) invia sulla connessione seriale il valore Kscan 4Dh. All'altro capo della connessione, nel design AT originale, c'era un controller dedicato 8042 che effettuava una prima "traduzione" del valore, mappando 4Dh su 19h. Tale controller genera quindi un interrupt hardware, che a sua volta invoca l'handler INT 9h del BIOS, il quale legge il valore 19h dal buffer (hardware) interno al controller 8042 e lo trasforma ulteriormente, in questo caso nel codice ASCII 70h ovvero "p" (se nessuno SHIFT è stato premuto e CAPS LOCK non è attivo). Tale valore viene, sempre a carico di INT 9h, inserito nel buffer a coda circolare a 16 entries nell'area dati del BIOS, accompagnato dal relativo scan code 19h. Qui termina la prima fase dell'operazione.
In un secondo momento, il sistema operativo (o software applicativo con idonei diritti) usa tipicamente INT 16h, altra funzione BIOS, per determinare se vi sono tasti nel buffer di tastiera. Un'apposita sottofunzione verifica se il buffer è non-vuoto (i due puntatori di inizio e fine, in tale caso, non sono coincidenti) e preleva il più vecchio codice ivi inserito: nel nostro caso, il valore a 16 bit 1970h. Tale funzione inoltre aggiorna i puntatori, il che rende nuovamente disponibili le locazioni usate dal tasto appena "prelevato".
Da qui in poi, il codice tasto sottoposto alle varie trasformazioni (bisognerebbe parlare ad esempio di nazionalizzazione ed ASCII esteso, eccetera) viene generalmente reso disponibile dal DOS su stdio, se non stiamo parlando di applicazioni verticali o altri casi particolari. E qui entra finalmente in gioco la funzione getchar() col suo bravo buffer.
A rigore, occorrerebbe inoltre parlare del secondo scancode inviato dal controller di tastiera al momento del rilascio del tasto. Tale scancode è caratterizzato dal bit 7 alto, ma nella generalità dei casi viene scartato a livello del controller di tastiera (da molti anni integrato nel chipset) e/o di INT 9h BIOS.
Questo, con numerose omissioni e qualche approssimazione, è in termini generali il percorso dei codici, dal controller di tastiera fino al flusso di input del terminale gestito a livello di SO.