#include <dos.h>
#include "timer.h"

void interrupt (far * near Timer::OldHandler)(...);

/* Dieses Unterprogramm verbiegt den Interrupt 8 auf die bergebene Adresse und
   stellt die Timer-Frequenz neu ein */
void Timer::Ein(void interrupt (*Proc)(...),WORD freq)
{
  disable();                           // Hardware-Interrupts sperren

  outportb(0x43,0x36);                 // Kanal 0; LO- und HI-Byte laden;
  outportb(0x40,LOBYTE(1193180l/freq)); // Modus 3 (Rechtecksignalgenerator);
  outportb(0x40,HIBYTE(1193180l/freq)); // Binrzhler;

  OldHandler=getvect(8);               // Alten Vektor sichern
  setvect(8,Proc);                     // Int 8 auf Proc setzen

  enable();                            // Hardware-Interrupts freigeben
}

/* Dieses Unterprogramm setzt den Interrupt 8 auf die alte Adresse und stellt
   die Standard-Frequenz wieder ein (18.2 Hz) */
void Timer::Aus()
{
  disable();

  outportb(0x43,0x34);        // s.o.; Modus 2 (Taktgenerator)
  outportb(0x40,0x0);
  outportb(0x40,0x0);

  setvect(8,OldHandler);

  enable();
}