unit timer18;
interface

function Clock : longint;
        {время, прошедшее с запуска программы в 1/18 с}
procedure ResetTime; {сброс всех показаний времени в 0}
function GetFPS : single;
                  {текущее число кадров в секунду}
             {необходимо вызывать 1 раз в каждом кадре}
implementation

var
   ZeroClock    : longint;    {время запуска программы}
   LastFPSclock : longint; {-»- последнего запроса FPS}
   Days         : longint;                  {номер дня}
   LastClock    : longint;  {время предыдущего запроса}
   NumberFrames : integer;             {счетчик кадров}
   FPS          : single; {число кадров в секунду}

function Clock : longint;
        {время, прошедшее с запуска программы в 1/18 с}
var t : longint;
begin
   t := meml[Seg0040:$6c] - ZeroClock;
   if t < LastClock then begin {переход на след. сутки}
      inc(Days);
   end;
   LastClock := t;
   Clock := t + days*1573040;       {1 сутки - 1573040}
end;
procedure ResetTime; {сброс всех показаний времени в 0}
begin
   ZeroClock := meml[Seg0040:$6c];
   LastFPSclock := 0;
   NumberFrames := 0;
   FPS := 0;
   Days := 0;
   LastClock := 0;
end;

function GetFPS : single;
{текущее число кадров в секунду}
var
   c : longint;
   e : single;
begin
   inc(NumberFrames);
   c := Clock;
   if (c - LastFPSclock) >= 18 then begin
             {интервал времени измерения не меньше 1 с}
      FPS := NumberFrames / (c - LastFPSclock) * 18.2;
      NumberFrames := 0;
      LastFPSclock := c;
   end;
   GetFPS := FPS;
end;

begin
   ResetTime;
end.