#include #include /* p.g.a. printf */ #define UTPORT_ADR 0x0f1c /* Port adresser: lamper */ #define INTR_NR 15 /* Avbrudds-vektor nr. */ #define EOI 0x20 /* EOI til 8259 */ #define HEAP_LENGDE 0x0400 /* HEAP i resident prog. */ #undef inportb() /* Bruk funksjoner */ #undef outportb() static unsigned tsr_psp; /* Lager for PSP-adresse */ static unsigned tsr_ss,tsr_sp; /* Egen SS- og SP-reg */ static unsigned avbrutt_ss,avbrutt_sp; /* Lager for g. SS og SP */ static int tsri; /* tsri og tsrj brukes som*/ static long tsrj; /* parametre i avb. rut. */ /* Funksjons prototype */ void interrupt servirq7(void); main() { int j; unsigned lengde; /* Program-lengden */ char far *mcbadr; /* Peker på MCB */ tsr_psp = (unsigned)getpsp(); /* Hent PSP-adressen */ /* mcbadr skal peke på MCB, som ligger 16 byte foran PSP */ mcbadr = ((char far *)((long int)(tsr_psp-1) << 16)); /* Eventuelt: mcbadr = (char *)MK_FP((tsr_psp-1),0); */ printf("PSP-segment: %x MCB-adresse: %Fp\n",tsr_psp,mcbadr); tsr_ss = _SS; /* Sett TSP stakk-adresser */ tsr_sp = _SP; disable(); /* Slå av avbrudd */ outportb(0x20,0x67); /* Fjern ev. hengende ISR */ j = inportb(0x21); /* Muliggjør avbrudd på IRQ 7 */ outportb(0x21,(j & 0x7f)); setvect(INTR_NR,servirq7); /* Avbr.vektor på plass */ enable(); /* Slå på avbrudd */ /* Hent program lengden, målt i antall paragrafer, fra PSP */ lengde = *(unsigned int far *)(mcbadr+3); lengde = lengde + HEAP_LENGDE; /* Legg til en HEAP */ printf("Programlengden i antall paragrafer: %u \n",lengde); /* Skriv ut MCB, 16 byter av PSP og programmets lengde */ printf("\nMCB-blokken: \n"); for(j=0; j<=15; j++) printf("%2x ",*(mcbadr+j)); printf("\n\n16 byter av PSP-blokken: \n"); for(j=16; j<=31; j++) printf("%2x ",*(mcbadr+j)); printf("\n"); keep(0,lengde); /* Installer som resident */ } /*********************************************************************** * * Betjeningsrutine for IRQ7 * ***********************************************************************/ void interrupt servirq7() { avbrutt_ss = _SS; /* Bevar SS og SP */ avbrutt_sp = _SP; _SS = tsr_ss; /* Over til egen stakk */ _SP = tsr_sp; enable(); /* Slå på avbrudd */ /* Selve betjeningsrutinen. Teller binært til 10 på lampene */ for (tsri=1; tsri<= 10; tsri++) { outportb(UTPORT_ADR,tsri); for(tsrj=1; tsrj<= 800000l; tsrj++); /* Venteløkke */ } disable(); _SS=avbrutt_ss; /* Tilbake til prog. stakk */ _SP=avbrutt_sp; outportb(0x20,EOI); /* Send EOI til 8259A */ }