/* -------------------------------------------------------------------- */
/*                                                                      */
/* FILE : trap.h                                                        */
/*                                                                      */
/* DESC : Interrupt Interface Implementation.                           */
/*                                                                      */
/* PROJ : CSA\sampler.                                                  */
/*                                                                      */
/* CREATED  16.02.98 19:37    by L&M.                                   */
/*                                                                      */
/*                                                                      */
/*                                     1995-98 (c) by Leonid Moiseichuk */
/* -------------------------------------------------------------------- */

/* ==========================[ includes ]============================== */

#include "trap.h"

#ifndef __DOS_H
#include <Dos.h>
#endif

#pragma hdrstop

/* ===========================[ classes ]============================== */

/* Static Members */
Trap* Trap :: CurrentTrap = 0;


Trap :: Trap( int iNum ) : Vector(iNum), OldHandler(0)
{
   CurrentTrap = this ;
   RegisterInterrupt();
} // Trap

Trap :: ~Trap()
{
   UnregisterInterrupt();
   CurrentTrap = 0 ;
} // ~Trap

void Trap :: RegisterInterrupt( /*int Enable*/ )
{
  // long far* PVector = (long far*)MK_FP( 0x00, Vector*sizeof(void far*) );

   _disable();
       OldHandler  = _dos_getvect(Vector);
       _dos_setvect(Vector,(VarFunc)InterruptEntry);
/*      OldHandler = *PVector ;
      *PVector   = (long)InterruptEntry ;*/
   _enable();
} // RegisterInterrupt

void Trap :: UnregisterInterrupt( /*int Enable*/ )
{
//   long far * PVector = (long far*)MK_FP( 0x00, Vector*sizeof(void far*) );

   _disable();
      _dos_setvect(Vector,OldHandler);
      OldHandler = 0;
/*      *PVector   = OldHandler ;
      OldHandler = 0 ;*/
   _enable();
} // UnregisterInterrupt

void interrupt InterruptEntry( unsigned, unsigned DI, unsigned SI)
{
   volatile int Access = 1 ;

   if (Access)
   {
      Access = 0 ;

      Trap::CurrentTrap -> di = DI ;
      Trap::CurrentTrap -> si = SI ;

      if ( Trap::CurrentTrap -> InterruptHandler()==0 )
	 Trap::CurrentTrap -> UnregisterInterrupt();
      Access = 1 ;
   }
} // InterruptEntry

/* ----- End of file Trap.cpp ----- */
Соседние файлы в папке Samp16