X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=libs%2Foldmik%2Fsrc%2Fmirq.c;fp=libs%2Foldmik%2Fsrc%2Fmirq.c;h=96cbcf71b10377b45ebf1e310036725ebe417e31;hp=0000000000000000000000000000000000000000;hb=77db1ca18d5446dcda9e524261399b63c2cd1813;hpb=a714b8c4811627d874934b0a0387b8cb27fc5921 diff --git a/libs/oldmik/src/mirq.c b/libs/oldmik/src/mirq.c new file mode 100644 index 0000000..96cbcf7 --- /dev/null +++ b/libs/oldmik/src/mirq.c @@ -0,0 +1,99 @@ +/* + +Name: +MDMA.C + +Description: +Some general purpose IRQ routines + +Portability: + +MSDOS: BC(y) Watcom(y) DJGPP(y) +Win95: n +Os2: n +Linux: n + +(y) - yes +(n) - no (not possible or not useful) +(?) - may be possible, but not tested + +*/ +#include +#include +#include "mirq.h" + +#define OCR1 0x20 /* 8259-1 Operation control register */ +#define IMR1 0x21 /* 8259-1 Mask register */ + +#define OCR2 0xA0 /* 8259-2 Operation control register */ +#define IMR2 0xA1 /* 8259-2 Mask register */ + + +BOOL MIrq_IsEnabled(UBYTE irqno) +/* + Returns true if the specified hardware irq is enabled. +*/ +{ + UBYTE imr=(irqno>7) ? IMR2 : IMR1; /* interrupt mask register */ + UBYTE msk=1<<(irqno&7); /* interrupt mask */ + return((inportb(imr) & msk) == 0); +} + + +BOOL MIrq_OnOff(UBYTE irqno,UBYTE onoff) +/* + Use to enable or disable the specified irq. +*/ +{ + UBYTE imr=(irqno>7) ? IMR2 : IMR1; /* interrupt mask register */ + UBYTE ocr=(irqno>7) ? OCR2 : OCR1; /* ocr */ + UBYTE msk=1<<(irqno&7); /* interrupt mask */ + UBYTE eoi=0x60|(irqno&7); /* specific end-of-interrupt */ + BOOL oldstate; + + /* save current setting of this irq */ + oldstate=((inportb(imr) & msk) == 0); + + if(onoff){ + outportb(imr,inportb(imr) & ~msk); + outportb(ocr,eoi); + if(irqno>7) MIrq_OnOff(2,1); + } + else{ + outportb(imr,inportb(imr) | msk); + } + + return oldstate; +} + + +void MIrq_EOI(UBYTE irqno) +/* + Clears the specified interrupt request at the interrupt controller. +*/ +{ + outportb(0x20,0x20); + if(irqno>7) outportb(0xa0,0x20); +} + + +PVI MIrq_SetHandler(UBYTE irqno,PVI handler) +{ +#ifdef __DJGPP__ + _go32_dpmi_seginfo seginfo; +#endif + PVI oldvect; + int vecno=(irqno>7) ? irqno+0x68 : irqno+0x8; +#ifdef __DJGPP__ + _go32_dpmi_get_protected_mode_interrupt_vector(vecno, &seginfo); + oldvect = seginfo.pm_offset; + seginfo.pm_offset = handler; + seginfo.pm_selector = _go32_my_cs(); + _go32_dpmi_allocate_iret_wrapper(&seginfo); + _go32_dpmi_set_protected_mode_interrupt_vector(vecno, &seginfo); +#else + oldvect=_dos_getvect(vecno); + _dos_setvect(vecno,handler); +#endif + return oldvect; +}