#include #include #include #include #include const unsigned char IRQ = 5; unsigned BaseAddress = 0x0350; void (interrupt far *IDIntVec)(); unsigned char IntOccurred = 0; unsigned char Key = 0; unsigned char LoopVar = 0; unsigned int ValueRead, ValueMask; void interrupt far (*oldisr[16])(__CPPARGS); //global to store old handler pointer void ExitProgram(int errorCode) { clrscr(); puts("A fatal error occured, program halted!"); printf("Error code returned was %d.\n", errorCode); } unsigned AskForBaseAddress(unsigned int OldOne) { char msg[7]; int NewOne = 0, Success = 0, Dummy; int AddrInputPosX, AddrInputPosY; puts("\nPlease enter the Base Address for your card (in hex)"); 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); 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 */ /* ****************************************************************************** FUNCTION initirq() RETURNS PARAMETERS PURPOSE ****************************************************************************** */ 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); } // end initirq /* ****************************************************************************** FUNCTION restoreirq() RETURNS PARAMETERS PURPOSE ****************************************************************************** */ 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); } } // end restoreirq void EnableMicroprocessor(void) { outp(BaseAddress + 5, 0); } void DisableMicroprocessor(void) { inp(BaseAddress + 1); } void interrupt IDIInterrupt() { IntOccurred = 1; outp(0x20, 0x20); } /* end setflag */ int main(void) { clrscr(); BaseAddress=AskForBaseAddress(BaseAddress); // Prompt for base address puts("Borland C Language Sample for IDI-48 Option C. Version 1.00\n\n"); puts("This sample will show option C's functionality.\n"); puts("IDI-48 Card setup:"); printf(" Card is at base address %3X Hex.\n", BaseAddress); puts(" Card is set at IRQ5."); puts(" MODE switch has switch 1 ON and 2-5 OFF.\n"); puts("Press any key to continue...\n"); getch(); initirq(IRQ, IDIInterrupt); EnableMicroprocessor(); clrscr(); do { gotoxy(1, 1); puts("Toggle a bit on digital port 0. The microprocessor will"); puts("detect a change of state and generate an interrupt on"); puts("IRQ5. Press ESC to exit the program."); do {} while ((!IntOccurred) && (!kbhit())); if (!IntOccurred) { Key = getch(); if (Key == 27) { clrscr(); puts("Exiting Sample 0 Program..."); restoreirq(IRQ); DisableMicroprocessor(); exit(0); } } else { sound(500); delay(100); nosound(); gotoxy(1, 5); puts("A bit of data port zero was toggled!"); puts("It is now: "); ValueRead = inpw(BaseAddress); for (LoopVar = 0; LoopVar <= 15; LoopVar++) { ValueMask = 1 << LoopVar; printf(" Bit %hu = %hu\n", LoopVar, ((ValueRead & ValueMask) == ValueMask)); } puts(""); IntOccurred = 0; EnableMicroprocessor(); } } while (!kbhit()); return 1; }