{$M 16384,0,16384}
Uses Dos,Crt;
Const
WDTryTime = 18;
BatchFileName = 'woufwouf.bat';
Var
WDCount : Integer;
WDBusy,WdEvent : Boolean;
WDSave1c,WDSaveExit: Pointer;
DosReentrant : ^Byte;
IntVec : Array[0..255] of Pointer Absolute 0:0;
Procedure STI;
Inline($FB);
Procedure CLI;
Inline($FA);
Procedure WatchDog;interrupt;
Var h,m,s,c : Word;
begin
if not WDBusy then
begin
WDBusy:=True;
inc(WDCount);
if DosReentrant^=0 then
if WDCount>=WdTryTime then
begin
WDCount:=0;
GetTime(h,m,s,c);
if(s=1) or (s=15) then {A watchdog idejének beállítása.
Jelenleg 1 perc 15 másodperc.}
begin
Cli;IntVec[$1c]:=WDSave1C;Sti;
Port[$20]:=$a0;
Port[$20]:=$20;
SwapVectors;
Exec(GetEnv('COMSPEC'),'/C '+batchFilename);
SwapVectors;
Cli;IntVec[$1c]:=@Watchdog;Sti;
WDEvent:=True;
end;
end;
WDBusy:=False;
end;
end;
Procedure WDRemove;
begin
SetIntVec($1C,WDSave1c);
ExitProc:=WDSaveExit;
Writeln('Exiting Watchdog');
Halt(Exitcode);
end;
Procedure WDInstall;
Var Regs:Registers;
begin
With Regs do
begin
ah:=$34;
MsDos(regs);
DosReentrant:=ptr(es,bx);
end;
WdCount:=0;
WDBusy:=False;
WDEvent:=False;
GetIntVec($1C,WDSave1C);
SetIntVec($1C,@Watchdog);
WDSaveExit:=ExitProc;
ExitProc:=@WDRemove;
Writeln('Watchdog installed');
end;
Var c:Char;
begin
clrscr;
WDInstall;
Repeat
Write('Hello ');
if WDEvent then
begin
Writeln;Writeln('Event occured');
WDEvent:=False;
end;
Delay(1000);
Until KeyPressed;
c:=ReadKey;
end.