/***                 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) | EN_INT;
  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);
}


