#pragma inline #pragma option -3 #include #include #include #include "biosl.h" #define VENDORID 0x494F #define DEVICEID 0x0200 int flag[16]; unsigned long val=0L; void interrupt far (*oldisr[16])(__CPPARGS); //global to store old handler pointer void sendEOI(void) { outportb(0x20, 0x20); outportb(0xA0, 0x20); } unsigned char initirq(char IRQnumber,void interrupt (*ISR)()) { unsigned char intmask, oldmask; if (IRQnumber <=7) { oldmask = inportb(0x21); oldisr[IRQnumber] = getvect(IRQnumber + 8); setvect(IRQnumber + 8,ISR); intmask = oldmask & (~(1 << IRQnumber)); outportb(0x21,intmask); } else { oldmask = inportb(0xA1); oldisr[IRQnumber] = getvect(IRQnumber + 0x70 - 8); setvect(IRQnumber - 8 + 0x70, ISR); intmask = oldmask & (~(1 << (IRQnumber - 8))); outportb(0xA1, intmask); } return(oldmask); } void restoreirq(char IRQnumber) { unsigned char intmask; if (IRQnumber <=7 ){ intmask = inportb(0x21); intmask |= (1 << IRQnumber); setvect(IRQnumber + 8,oldisr[IRQnumber]); outportb(0x21, intmask); } else { intmask = inportb(0xA1); intmask |= (1 << (IRQnumber - 8)); setvect(IRQnumber - 8 + 0x70, oldisr[IRQnumber]); outportb(0xA1, intmask); } } unsigned char bn, df, mbn; word Base0,IRQ; TPCICommonConfig config; void outpdw(unsigned portid, unsigned long value) { asm { mov dx,[portid] mov eax,[value] out dx,eax } } unsigned long int inpdw(unsigned portid) { asm { mov dx,[portid] in eax,dx push bx mov bx,ax shr eax,16 mov dx,ax mov ax,bx pop bx } } void interrupt ISR() { unsigned long which=0L; which=val=inpdw(0x181C); if (which & 0x00200000){ asm int 2+8;outpdw(0x180c,0x004007fdL);} if (which & 0x00400000){ asm int 3+8;outpdw(0x180c,0x004007fcL);} if (which & 0x00800000){ asm int 4+8;outpdw(0x180c,0x004007faL);} if (which & 0x01000000){ asm int 5+8;outpdw(0x180c,0x004007f6L);} if (which & 0x02000000){ asm int 6+8;outpdw(0x180c,0x004007eeL);} if (which & 0x04000000){ asm int 7+8;outpdw(0x180c,0x004007deL);} if (which & 0x08000000){ asm int 10+0x68;outpdw(0x180c,0x004007beL);} if (which & 0x10000000){ asm int 11+0x68;outpdw(0x180c,0x0040077eL);} if (which & 0x20000000){ asm int 12+0x68;outpdw(0x180c,0x004006feL);} if (which & 0x40000000){ asm int 14+0x68;outpdw(0x180c,0x004005feL);} if (which & 0x80000000){ asm int 15+0x68;outpdw(0x180c,0x004003feL);} sendEOI(); } #pragma argsused void Fail(char *msg) { #ifndef RELEASE printf(msg); #endif abort(); } int main() { unsigned long temp,i; if (pci_bios_present((byte*)&temp,(word*)&temp,&mbn) != SUCCESSFUL) Fail("Error: PCI BIOS not found.\nAre you in NT? This utility is DOS only.\n"); if (find_pci_device(DEVICEID, VENDORID, 0, &bn, &df) != SUCCESSFUL) Fail("Error: PCI-ISA expansion card not found."); read_config_word(bn, df, 60, &IRQ); //Get IRQ IRQ&=0xff; printf("PCI-ISA TSR 1.01 Installed: IRQ %02x BN %02x DF %02x",IRQ,bn,df); outpdw(0x1838,0x00002c0cL); initirq(IRQ,ISR); _dos_keep(0, (_SS + ((_SP+100)/16) - _psp)); // restoreirq(IRQ); return 0; }