Molte applicazioni che richiedono all'utilizzatore l'immissione di dati dalla tastiera necessitano che il buffer della tastiera venga vuotato prima della richiesta di input: si evita in tal modo che tasti battuti, ad esempio, durante durante una fase elaborativa e interpretati al momento sbagliato producano risultati errati o un comportamento imprevedibile del programma. Lo svuotamento del buffer di tastiera può essere effettuato in diversi modi: uno di questi è implementare un ciclo utilizzante il servizio01h dell'int16h per controllare se nel buffer c'è un tasto "in attesa"; in caso affermativo questo viene rimosso mediante il servizio 00h. L'uscita dal ciclo avviene quando il servizio 01h segnala che il buffer è vuoto.
Un altro metodo consiste nell'utilizzare la funzione 0Ch dell'int 21h, appositamente prevista per pulire il buffer della tastiera e invocare una delle funzioni 01h, 06h, 07h, 08h, 0Ah: se si desidera esclusivamente vuotare il buffer è sufficiente indicare 06h quale valore di AL (funzione) e FFh quale valore di DL (input per la funzione[1]). Le caratteristiche della funzione 0Ch dell'in 21h sono le seguenti:
INT 21H, SERV. 0CH: PULISCE IL BUFFER DI TASTIERA E INVOCA UN SERVIZIO
Input | AH | 0Ch |
AL | servizio da invocare (può essere 01h, 06h, 07h, 08, 0Ah) | |
Altri | Altri registri: valori eventualmente richiesti dalla funzione indicata in AL. | |
Output | AL | il carattere in input (eccetto funzione 0Ah) |
Il terzo metodo utilizza i puntatori alla testa e alla coda del buffer:
/********************
BARNINGA_Z! - 1990
CLEARKBD.C - clearkbd()
void cdecl clearkbd(void);
COMPILABILE CON TURBO C++ 1.0
tcc -O -d -c -mx clearkbd.c
dove -mx puo' essere -mt -ms -mc -mm -ml -mh
********************/
void cdecl clearkbd(void)
{
*((int far *)0x41A) = *((int far *)0x41C);
}
Il meccanismo è banale: il puntatore alla testa e quello
alla coda del buffer si trovano agli indirizzi 0:041A
e 0:041C, rispettivamente. Tali indirizzi possono
pertanto essere considerati i puntatori a detti puntatori: la
loro indirezione ne restituisce i valori. La funzione clearkbd(),
quindi, non fa altro che rendere uguali il puntatore alla testa
e quello alla coda, forzando così la condizione di buffer
vuoto.
Non ci ho capito niente! Ricominciamo...