Listing 3 (vect.c)

/*** ***        INITIALIZE SERIAL        *** ***/

#include "serial.h"

extern int portbase;

void (interrupt far *oldvect)();

void InitSerial (int Com_Port)
{
  Setvects(Com_Port);
  EnableInt(Com_Port);
}

/*** ***           CLOSE SERIAL          *** ***/

void CloseSerial (int Com_Port)
{
  DisableInt();
  Resvects(Com_Port);
}

/*** ***      SET INTERRUPT VECTORS      *** ***/

void Setvects (int Com_Port)
  {
   switch (Com_Port)
   {
    case COM1:   oldvect = getvect(0x0C);
                 setvect(0x0C,ReceiveData);
                 break;
    
    case COM2:   oldvect = getvect(0x0B);
                 setvect(0x0B,ReceiveData);
                 break;
    
    case COM3:   oldvect = getvect(0x0C);
                 setvect(0x0C,ReceiveData);
                 break;
    
    case COM4:   oldvect = getvect(0x0B);
                 setvect(0x0B,ReceiveData);
   }
}

/*** ***      RESET INTERRUPT VECTORS    *** ***/

void Resvects (int Com_Port)
{
  switch (Com_Port)
    {
      
      case COM1:    setvect(0x0C,oldvect);
                  break;
      
      case COM2:    setvect(0x0B,oldvect);
                  break;
      
      case COM3:    setvect(0x0C,oldvect);
                  break;
      
      case COM4:    setvect(0x0B,oldvect);
    }
}

/*** ***         ENABLE INTERRUPTS       *** ***/

void EnableInt (int Com_Port)
{
  int New_Value;
  
  New_Value = inp(portbase + MCR) | GPO2;
  outp(portbase + MCR,New_Value);
  
  outp(portbase + IER,RX_INT);
  
  if((Com_Port == COM1) || (Com_Port == COM3))
     New_Value = inp(IMR) & IRQ4;
  
  else if((Com_Port == COM2) || (Com_Port == COM4))
     New_Value = inp(IMR) & IRQ3;
  
  outp(IMR,New_Value);
}

/*** ***      DISABLE INTERRUPTS        *** ***/

void DisableInt (void)
{
  int Old_Value;
   
   Old_Value = inp(IMR) | ~IRQ3 | ~IRQ4;
   outp(IMR,Old_Value);
   outp(portbase + IER,0);
   
   Old_Value = inp(portbase + MCR) & ~EN_INT;
   outp(portbase + MCR,Old_Value);
}


/* End of File */