#include #include #include //This program was originally an engineering test program, and as such is not //very well commented. //The primary purpose of this sample is to provide a utility allowing you to //determine how large your FIFO is, as we offer a variety of FIFO sizes as //factory-installed "specials" or "options" unsigned int BASE=0x300; unsigned int IRQ=0x05; int irqCount,irqstat=0; unsigned long int count; unsigned AskFor(char *Prompt,unsigned int OldOne) { char msg[8]; unsigned int NewOne = 0, Success = 0, Dummy; int AddrInputPosX, AddrInputPosY; printf("\nPlease enter the %s (in hex) ",Prompt); printf("or press ENTER for %X.\n>",OldOne); AddrInputPosX = wherex(); AddrInputPosY = wherey(); do { gotoxy(AddrInputPosX, AddrInputPosY); clreol(); msg[0] = 5; msg[1] = 0; cgets(msg); sscanf(msg + 2, "%x", &NewOne); if ((NewOne > 0)) { Success = 1; Dummy = NewOne; } if (msg[1] == 0) { gotoxy(AddrInputPosX, AddrInputPosY); printf("%X", OldOne); Success = 1; Dummy = OldOne; } } while(!Success); return (Dummy); } /* end of AskForBaseAddress */ //In C++, ISRs take (...) arguments #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif void interrupt far (*oldisr[16])(__CPPARGS); //global to store old handler pointer void sendEOI(void) { outportb(0xA0, 0x20); outportb(0x20, 0x20); } unsigned char initirq(char IRQnumber,void interrupt (*ISR)(__CPPARGS)) { 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); } } //The ISR looks like this... void interrupt far newisr(__CPPARGS) { irqCount = count; irqstat=inportb(BASE+0x13); sendEOI(); } int printstatus() //pretty display of base +12 and +13 { int x,y,i,j,changed=0; static int ov12,v12,ov13,v13; x=wherex();y=wherey(); gotoxy(x+6,y); v12=inportb(BASE+0x12); for (i=7;i>=0;i--) printf("%4s",(v12&(1<=0;i--) printf("%4s",(v13&(1<