Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Инструментарий для выполнения лабораторных работ / Sampler_new / Samp16 / TRAP
.CPP/* -------------------------------------------------------------------- */
/* */
/* 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 ----- */