[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]

    {
    From: ka9dgx@interaccess.com (Mike Warot)

    Here is the companion code for TIMER2.PAS which is required as well.
    (My news grazed choked on the file size... go figure)
    }

    Unit Timer2;
    {
      Author  : Michael Warot
      Date    : December, 1987
      Purpose : Provide timing functions.
      Notes   : Does not provide midnight protection.

      05/29/92 MAW - Add protection against midnight in DT()
      06/18/93 MAW - Remove ExactRealTime - Too much fuss
    }
    Interface
    Uses
      DOS;

    Const
      OneDay   = $1800AF;        { Number of Seconds in one Day }

    Procedure StartTime(Var X : LongInt);
    { Resets the tick counter }

    Function DT(Var X : LongInt) : LongInt;
    { Returns the time since the last Starttime, IN TICKS }

    Function TimeStamp : String;
    { Returns YYMMDD:HHMMSS }

    Function REALtime:LongInt;
    { Returns time from BIOS in SECONDS }

    Function Ticks:Longint; { Current time of day, in TICKS }

    Implementation

    Var
      BiosTick : LongInt ABSOLUTE $40:$6c;
      LastTime : LongInt;

    (*
    Function Ticks : Longint; Assembler;
    Asm
      Cli
      Mov ax,0040h
      mov es,ax
      mov ax,es:[6ch]
      mov dx,es:[6eh]
      Sti
    End;
    *)
    Function Ticks : Longint;
    Var
      X : Longint;
    Begin
      Repeat
        X := BiosTick;
      Until X = BiosTick;
      Ticks := X;
    End;

    Procedure StartTime(Var X : LongInt);
    Begin
      X := Ticks;
    End;

    (*
    Function DT(Var X : LongInt) : LongInt; Assembler;
    Asm
      les  bx,X
      mov  cx,es:[bx]
      mov  bx,es:[bx+2]     { X is now in BX:CX   }
      CLI
      mov  ax,0040h
      mov  es,ax
      mov  ax,es:[6ch]
      mov  dx,es:[6eh]      { Current is in DX:AX }
      STI
      sub  ax,cx
      sbb  dx,bx
      jnc  @ok              { delta t is DX:AX, without midnight }
      add  ax,00afh         { handle midnight! }
      adc  dx,0018h
    @ok:
    End;
    *)

    Function DT(Var X : Longint):Longint;
    Var
      Y : Longint;
    Begin
      Y := Ticks;
      Y := Y - X;
      If Y < 0 then Inc(Y,OneDay);
      DT := Y;
    End;

    Function TimeStamp:String;
    Var
      Year,Month,Date,Day,
      Hour,Min,Sec,Sec100   : Word;
      Tmp,Tmp2 : String;
      I        : Byte;
    Begin
      GetDate(Year,Month,Date,Day);
      GetTime(Hour,Min,Sec,Sec100);
      Year := Year MOD 100;

      Str(Year:2  ,Tmp2); Tmp := Tmp2;
      Str(Month:2 ,Tmp2); Tmp := Tmp + Tmp2;
      Str(Date:2  ,Tmp2); Tmp := Tmp + Tmp2 + ':';
      Str(Hour:2  ,Tmp2); Tmp := Tmp + Tmp2;
      Str(Min:2   ,Tmp2); Tmp := Tmp + Tmp2;
      Str(Sec:2   ,Tmp2); Tmp := Tmp + Tmp2;
      For i := 1 to Length(Tmp) DO
        If Tmp[i] = ' ' Then
          Tmp[i] := '0';
      TimeStamp := Tmp;
    End; { TimeStamp }

    Function REALtime:Longint;
    Var
      Hour,Min,Sec,Sec100 : Word;
      h,m,s : longint;
    Begin
      GetTime(Hour,Min,Sec,Sec100);
      H := Hour;
      M := Min;
      S := Sec;
      REALtime := H*3600 + M*60 + S;
    End;

    End.

[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]