#include #include /* P.g.a. getch() */ #include /* P.g.a. kbhit */ #define UTPORT_ADR 0x0f1c /* Utport-adresse */ #define INNPORT_ADR 0x0f1e /* Innport-adresse */ #define EOI 0x20 /* EOI til 8259 */ #define NUM_IRQ11 115 /* Nr. på avbr.vektorene */ #define NUM_IRQ7 15 #define NUM_IRQ3 11 #undef inportb() /* Bruk funksjoner */ #undef outportb() int teller; /* Global teller */ /* Funksjons prototyper */ void interrupt servirq11(); void interrupt servirq7(); void interrupt servirq3(); void main() { int i,gammel_imr_m,gammel_imr_s; /* _m = MASTER, _s = SLAVE */ long j; /* Lager for 8259A-registre */ int irr_m, irr_s; /* Interrupt Request Register */ int isr_m, isr_s; /* In-Service Register */ int imr_m, imr_s; /* Interrupt Mask Register */ /* Lager for originale avbrudds-vektorer */ void interrupt (*gammel_irq3)(); void interrupt (*gammel_irq7)(); void interrupt (*gammel_irq11)(); clrscr(); disable(); /* Slå av avbrudd */ gammel_imr_m = inportb(0x21); /* Aktiviser 8259A for avbr.*/ outportb(0x21,(gammel_imr_m & 0x77)); /* på IRQ11,7,3 */ gammel_imr_s = inportb(0xa1); outportb(0xa1,(gammel_imr_s & 0xf7)); /* Bevar gamle avbruddsvektorer og sett nye på plass */ gammel_irq11 = getvect(NUM_IRQ11); setvect(NUM_IRQ11,servirq11); gammel_irq7 = getvect(NUM_IRQ7); setvect(NUM_IRQ7,servirq7); gammel_irq3 = getvect(NUM_IRQ3); setvect(NUM_IRQ3,servirq3); enable(); /* Slå på avbrudd */ outportb(0x20,0x0a); /* Les IRR-registret */ irr_m = inportb(0x20); outportb(0x20,0x0b); /* Les ISR-registret */ isr_m = inportb(0x20); imr_m = inportb(0x21); /* Les IMR-registret */ /* Gå i løkke og tell på de minst signifikante lampene */ teller = 0; do { teller++; outportb(UTPORT_ADR,(unsigned char)teller); for(j=1; j <= 800000l; j++); }while((kbhit()==0)); /* Fortsett til tast-trykk */ (void)getch(); /* Tøm tastatur buffer */ /* Rydd opp ved retur */ disable(); outportb(0x21,gammel_imr_m); /* Orginal IMR tilbake */ outportb(0xa1,gammel_imr_s); /* Gamle avbr. vektor tilbake på plass */ setvect(NUM_IRQ11,gammel_irq11); setvect(NUM_IRQ7,gammel_irq7); setvect(NUM_IRQ3,gammel_irq3); enable(); } void interrupt servirq11() { int i; int irr,isr,imr; /* IRR-, ISR- og IMR-registrene for MASTER */ long j; outportb(0x20,0x0a); /* Les IRR-registret */ irr = inportb(0x20); outportb(0x20,0x0b); /* Les ISR-registret */ isr = inportb(0x20); imr = inportb(0x21); /* Les "Interrupt Mask Reg." */ for (i=0; i<= 10; i++) { /* Tell på de mest sign. lampene */ teller++; outportb(UTPORT_ADR+1,i); for(j=1; j<= 800000l; j++); } outportb(0x20,EOI); /* Send EOI til 8259A */ outportb(0xa0,EOI); } void interrupt servirq7() { int i; int irr,isr,imr; /* IRR-, ISR- og IMR-registrene */ long int j; enable(); outportb(0x20,0x0a); /* Les IRR-registret */ irr = inportb(0x20); outportb(0x20,0x0b); /* Les ISR-registret */ isr = inportb(0x20); imr = inportb(0x21); /* Les "Interrupt Mask Reg." */ for (i=0; i<= 10; i++) { /* Marker med de åtte mest signifikante lampene */ teller++; outportb(UTPORT_ADR+1,0x0f); for(j=1; j<= 800000; j++); outportb(UTPORT_ADR+1,0xf0); for(j=1; j<= 800000; j++); } disable(); outportb(0x20,EOI); /* Send EOI til 8259A */ } void interrupt servirq3() { int i; int irr,isr,imr; /* IRR-,ISR- og IMR-registrene */ long int j; enable(); outportb(0x20,0x0a); /* Les IRR-registret */ irr = inportb(0x20); outportb(0x20,0x0b); /* Les ISR-registret */ isr = inportb(0x20); imr = inportb(0x21); /* Les "Interrupt Mask Reg." */ for (i=0; i<= 10; i++) { /* Marker med de åtte minst signifikante lampene */ teller++; outportb(UTPORT_ADR,0x0f); for(j=1; j<= 800000l; j++); outportb(UTPORT_ADR,0xf0); for(j=1; j<= 800000l; j++); } disable(); outportb(0x20,EOI); /* Send EOI til 8259A */ }