#include #include /* P.g.a. getch() */ #include /* P.g.a. kbhit */ #define UTPORT_ADR 0x0f1c /* Utport adresse */ #define INNPORT_ADR 0x0f1e /* Innport adresse */ #define INTR_NUM 0x73 /* IRQ11 = avbr.nr. 115 */ #define EOI 0x20 /* EOI til 8259 */ #undef inportb() #undef outportb() void interrupt servirq11(void); /* Funksjons prototype */ void main() { int i,gammel_imr; long int k; void interrupt (*gammel_irq11)(void); /* Lager for avbr. vektor */ disable(); /* Slå avbrudd av */ gammel_imr = inportb(0xa1); /* Bevar IMR-registret */ outportb(0xa1,(gammel_imr & 0xf7)); /* IMR bit 3 til 0 */ gammel_irq11 = getvect(INTR_NUM); /* Bevar gammel og */ setvect(INTR_NUM,servirq11); /* sett ny avbr. vektor */ enable(); /* Slå avbrudd på */ /* Start hovedprogram. Teller binært på de åtte minst signifikante lampene. */ clrscr(); /* Ren skjerm */ i = 0; do { /* Teller til skjermen */ gotoxy(10,6); cprintf("I main Teller: %3d",i); outportb(UTPORT_ADR,i++); /* Teller til lampene */ for(k=1; k<=800000l; k++); }while((kbhit()==0)); /* Trykk på tast vil avslutte */ (void)getch(); /* Tøm tastatur buffer */ /* Rydd opp ved retur */ disable(); setvect(INTR_NUM,gammel_irq11); /* Gammel avbr.vektor på plass */ outportb(0xa1,gammel_imr); /* Tilbake til org. IMR i 8259 */ enable(); clrscr(); /* Ren skjerm */ } /* Betjeningsrutine for IRQ11 avbrudd. */ void interrupt servirq11() { int i; long int k; for (i=1; i<= 10; i++) { /* Teller til skjermen */ gotoxy(10,8); cprintf("I irq11 Teller: %3d",i); outportb(UTPORT_ADR+1,0x0f); /* Blink med lampene */ for(k=1; k<= 800000l; k++); outportb(UTPORT_ADR+1,0xf0); for(k=1; k<= 800000l; k++); } disable(); outportb(0x20,EOI); /* Send EOI til MASTER */ outportb(0xa0,EOI); /* EOI til slaven */ }