/* Handhaben des sio-Interrupts */ /* Datei: sioint2.c */ #include #include #include static int sioadr[4] = { 0x3f8,0x2f8,0x3e8,0x2e8 }; static int sioint[4] = { 4, 3, 4, 3 }; static int comindex; enum sioregs{ DATA, IER, IIR, LCR, MCR, LSR, MSR, SRC}; enum picregs{ IMR=0x21,OCW1=0x21,OCW2=0x20,OCW3=0x20}; typedef void interrupt (*isra)(); isra oldint; volatile int got_int = 0; volatile unsigned long count = 0; void interrupt shandler () { count++; got_int = 1; inportb(sioadr[comindex] + DATA); outportb (OCW2,0x20); /* Allgemeiner EOI */ } void installint (int comno) { int x = sioint[comno] +8; oldint = getvect(x); setvect(x, shandler); } void restoreint(int comno) { setvect (sioint[comno]+8, oldint); } int main () { comindex = 0; installint (comindex); while (!kbhit()) { if (got_int) { got_int = 0; printf ("\r%06ld",count); } } printf ("\nZõhler ist %ld",count); restoreint(comindex); return 0; }