Vuotare il buffer della tastiera

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

InputAH0Ch
ALservizio da invocare (può essere 01h, 06h, 07h, 08, 0Ah)
AltriAltri registri: valori eventualmente richiesti dalla funzione indicata in AL.
OutputALil 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:041A0: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.


OK, andiamo avanti a leggere il libro...

Non ci ho capito niente! Ricominciamo...