(*--------------------------------------------------------------------------*)
(*      TimeOfDayH  --- Get time of day in 1/100 seconds from midnight      *)
(*--------------------------------------------------------------------------*)

FUNCTION TimeOfDayH : REAL;

(*--------------------------------------------------------------------------*)
(*                                                                          *)
(*     Function:  TimeOfDayH                                                *)
(*                                                                          *)
(*     Purpose:   Gets time of day from internal clock in 1/100 seconds     *)
(*                                                                          *)
(*     Calling sequence:                                                    *)
(*                                                                          *)
(*        Tod := TimeOfDayH : REAL;                                         *)
(*                                                                          *)
(*           Tod --- Real number which is timer value expressed in          *)
(*                   hundredths of seconds as:                              *)
(*                   ( 360000 x hour + 6000 x minutes + 100 x seconds +     *)
(*                     hundredths of seconds ).                             *)
(*                                                                          *)
(*     Calls:  INTR                                                         *)
(*                                                                          *)
(*--------------------------------------------------------------------------*)

VAR
   Regs:  RegPack;

BEGIN (* TimeOfDayH *)
                                   (* Time of day interrupt *)
   Regs.Ax := $2C00;
   INTR( $21 , Regs );
                                   (* Convert to hundredths of seconds *)
                                   (* from 12AM                        *)
   WITH Regs DO
      TimeOfDayH  := Ch * 360000.0 + Cl * 6000.0 + Dh * 100.0 + Dl;

END   (* TimeOfDayH *);

(*--------------------------------------------------------------------------*)
(*       TimeDiffH  --- Get difference in time between two timer values     *)
(*--------------------------------------------------------------------------*)

FUNCTION TimeDiffH( Timer1, Timer2: REAL ) : REAL;

(*--------------------------------------------------------------------------*)
(*                                                                          *)
(*     Function:  TimeDiffH                                                 *)
(*                                                                          *)
(*     Purpose:   Get difference in time between two timer values           *)
(*                in hundredths of seconds.                                 *)
(*                                                                          *)
(*     Calling sequence:                                                    *)
(*                                                                          *)
(*        Tdiff := TimeDiffH( Timer1, Timer2: REAL ) : REAL;                *)
(*                                                                          *)
(*           Timer1  --- first timer value (earlier)                        *)
(*           Timer2  --- second timer value (later)                         *)
(*                                                                          *)
(*           Tdiff   --- difference between timer values                    *)
(*                                                                          *)
(*     Calls:  None                                                         *)
(*                                                                          *)
(*     Remarks:                                                             *)
(*                                                                          *)
(*        This routine will handle time wrap around midnight.  However, it  *)
(*        only handles timer values <= 24 hours in duration.                *)
(*                                                                          *)
(*--------------------------------------------------------------------------*)

CONST
   Hundredths_Secs_Per_Day = 8640000.0  (* 1/100 Seconds in one day *);

VAR
   TDiff : REAL;

BEGIN (* TimeDiffH *)

   TDiff := Timer2 - Timer1;

   IF Tdiff < 0.0 THEN Tdiff := Tdiff + Hundredths_Secs_Per_Day;

   TimeDiffH := Tdiff;

END   (* TimeDiffH *);

(*--------------------------------------------------------------------------*)
(*      TimeStringH  --- convert timer value in 1/100 secs to string        *)
(*--------------------------------------------------------------------------*)

FUNCTION TimeStringH( Timer_Value : REAL ) : AnyStr;

(*--------------------------------------------------------------------------*)
(*                                                                          *)
(*     Function:  TimeStringH                                               *)
(*                                                                          *)
(*     Purpose:   Convert elapsed timer value to HH:MM:SS string            *)
(*                                                                          *)
(*     Calling sequence:                                                    *)
(*                                                                          *)
(*        Tstring := TimeStringH( Timer_Value : REAL ) : AnyStr;            *)
(*                                                                          *)
(*           Timer_Value --- Real number which is timer value expressed as  *)
(*                           1/100 seconds from 12 am.                      *)
(*           Tstring     --- Resultant 'HH:MM:SS' form of time              *)
(*                                                                          *)
(*     Calls:  None                                                         *)
(*                                                                          *)
(*--------------------------------------------------------------------------*)

VAR
   Hours:    INTEGER;
   Minutes:  INTEGER;
   Seconds:  INTEGER;
   Save_H:   REAL;
   SH:       STRING[2];
   SM:       STRING[2];
   SS:       STRING[2];

BEGIN (* TimeStringH *)

   Timer_Value := INT( Timer_Value / 100.0 );

   Hours   := TRUNC( Timer_Value / 3600.0 );
   Save_H  := Timer_Value - Hours * 3600.0;
   Minutes := TRUNC( Save_H / 60.0 );
   Seconds := TRUNC( Save_H - Minutes * 60.0 );

   STR( Hours:2,   SH );
   STR( Minutes:2, SM );
   STR( Seconds:2, SS );

   IF SH[1] = ' ' THEN SH[1] := '0';
   IF SM[1] = ' ' THEN SM[1] := '0';
   IF SS[1] = ' ' THEN SS[1] := '0';

   TimeStringH := SH + ':' + SM + ':' + SS;

END   (* TimeStringH *);

(*--------------------------------------------------------------------------*)
(*                TimeOfDay  --- Get time of day                            *)
(*--------------------------------------------------------------------------*)

FUNCTION TimeOfDay : REAL;

(*--------------------------------------------------------------------------*)
(*                                                                          *)
(*     Function:  TimeOfDay                                                 *)
(*                                                                          *)
(*     Purpose:   Gets time of day from internal clock                      *)
(*                                                                          *)
(*     Calling sequence:                                                    *)
(*                                                                          *)
(*        Tod := TimeOfDay : REAL;                                          *)
(*                                                                          *)
(*           Tod --- Real number which is timer value expressed in          *)
(*                   seconds as:                                            *)
(*                   ( 3600 x hour + 60 x minutes + seconds )               *)
(*                                                                          *)
(*     Calls:  INTR                                                         *)
(*                                                                          *)
(*--------------------------------------------------------------------------*)

VAR
   Regs:  RegPack;

BEGIN (* TimeOfDay *)
                                   (* Time of day interrupt *)
   Regs.Ax := $2C00;
   INTR( $21 , Regs );
                                   (* Convert to number of seconds since *)
                                   (* 12AM                               *)
   WITH Regs DO
      TimeOfDay  := Ch * 3600.0 + Cl * 60.0 + Dh;

END   (* TimeOfDay *);

(*--------------------------------------------------------------------------*)
(*        TimeDiff  --- Get difference in time between two timer values     *)
(*--------------------------------------------------------------------------*)

FUNCTION TimeDiff( Timer1, Timer2: REAL ) : REAL;

(*--------------------------------------------------------------------------*)
(*                                                                          *)
(*     Function:  TimeDiff                                                  *)
(*                                                                          *)
(*     Purpose:   Get difference in time between two timer values in        *)
(*                seconds.                                                  *)
(*                                                                          *)
(*     Calling sequence:                                                    *)
(*                                                                          *)
(*        Tdiff := TimeDiff( Timer1, Timer2: REAL ) : REAL;                 *)
(*                                                                          *)
(*           Timer1  --- first timer value (earlier)                        *)
(*           Timer2  --- second timer value (later)                         *)
(*                                                                          *)
(*           Tdiff   --- difference between timer values                    *)
(*                                                                          *)
(*     Calls:  None                                                         *)
(*                                                                          *)
(*     Remarks:                                                             *)
(*                                                                          *)
(*        This routine will handle time wrap around midnight.  However, it  *)
(*        only handles timer values <= 24 hours in duration.                *)
(*                                                                          *)
(*--------------------------------------------------------------------------*)

CONST
   Secs_Per_Day = 86400.0  (* Seconds in one day *);

VAR
   TDiff : REAL;

BEGIN (* TimeDiff *)

   TDiff := Timer2 - Timer1;

   IF Tdiff < 0.0 THEN Tdiff := Tdiff + Secs_Per_Day;

   TimeDiff := Tdiff;

END   (* TimeDiff *);

(*--------------------------------------------------------------------------*)
(*          TimeString  --- convert timer value to string                   *)
(*--------------------------------------------------------------------------*)

FUNCTION TimeString( Timer_Value : REAL ) : AnyStr;

(*--------------------------------------------------------------------------*)
(*                                                                          *)
(*     Function:  TimeString                                                *)
(*                                                                          *)
(*     Purpose:   Convert elapsed timer value to HH:MM:SS string            *)
(*                                                                          *)
(*     Calling sequence:                                                    *)
(*                                                                          *)
(*        Tstring := TimeString( Timer_Value : REAL ) : AnyStr;             *)
(*                                                                          *)
(*           Timer_Value --- Real number which is timer value expressed as  *)
(*                           seconds from 12 am.                            *)
(*           Tstring     --- Resultant 'HH:MM:SS' form of time              *)
(*                                                                          *)
(*     Calls:  None                                                         *)
(*                                                                          *)
(*--------------------------------------------------------------------------*)

VAR
   Hours:    INTEGER;
   Minutes:  INTEGER;
   Seconds:  INTEGER;
   Save_H:   REAL;
   SH:       STRING[2];
   SM:       STRING[2];
   SS:       STRING[2];

BEGIN (* TimeString *)

   Hours   := TRUNC( Timer_Value / 3600.0 );
   Save_H  := Timer_Value - Hours * 3600.0;
   Minutes := TRUNC( Save_H / 60.0 );
   Seconds := TRUNC( Save_H - Minutes * 60.0 );

   STR( Hours:2,   SH );
   STR( Minutes:2, SM );
   STR( Seconds:2, SS );

   IF SH[1] = ' ' THEN SH[1] := '0';
   IF SM[1] = ' ' THEN SM[1] := '0';
   IF SS[1] = ' ' THEN SS[1] := '0';

   TimeString := SH + ':' + SM + ':' + SS;

END   (* TimeString *);

(*--------------------------------------------------------------------------*)
(*          DateString  --- Return current date in MM/DD/YY form            *)
(*--------------------------------------------------------------------------*)

FUNCTION DateString: AnyStr;

(*--------------------------------------------------------------------------*)
(*                                                                          *)
(*     Function:  DateString                                                *)
(*                                                                          *)
(*     Purpose:   Returns current date in MM/DD/YY form                     *)
(*                                                                          *)
(*     Calling sequence:                                                    *)
(*                                                                          *)
(*        Dstring := DateString: AnyStr;                                    *)
(*                                                                          *)
(*           Dstring     --- Resultant 'MM/DD/YY' form of date              *)
(*                                                                          *)
(*     Calls:  MsDos                                                        *)
(*                                                                          *)
(*--------------------------------------------------------------------------*)

VAR
  RecPack:       regpack;
  Month:         STRING[2];
  Day:           STRING[2];
  Year:          STRING[4];

BEGIN (* DateString *)
                                   (* Date function *)
  RecPack.Ax := $2A00;
                                   (* Get date from DOS *)
  MsDos( RecPack );
                                   (* Convert to MM/DD/YY string *)
  WITH Recpack DO
     BEGIN
        STR( Cx         , Year  );
        STR( Dx MOD 256 , Day   );
        STR( Dx SHR 8   , Month );
     END;

  DateString := Month + '/' + Day + '/' + Year;

END   (* DateString *);
