Metropoli BBS
VIEWER: wait.pas MODE: TEXT (ASCII)
 (*****************    W A I T   *************************
 * Delays NumberOfSecs seconds.  This is done by         *
 * accessing the PC clock via function $2C of DOS int    *
 * 21h.  Its accuracy is limited by the fact that the    *
 * time is calculated from the ROM BIOS tick count,      *
 * which is updated only about 18.2 times per second.    *
 * This means that Wait will be accurate to about        *
 * 1/18 second.                                          *
 *                                                       *
 * Requires "Uses DOS" if in TP4 or TP5                  *
 ******************    W A I T   ************************)

  PROCEDURE Wait(NumberOfSecs : Real);
  CONST
    Secs_PER_DAY = 86400.0; {60 * 60 * 24}
  VAR
    TimeIsUp : Boolean;
    StartingSecs,
    Secs : Real;

    (******************   READ CLOCK  ************************
    *                                                        *
    *  Reads the PC clock, by using service $2C of int 21h.  *
    *  This service returns information in the 8088          *
    *  registers as follows:                                 *
    *                                                        *
    *    CH      Hour                  (0 through 23)        *
    *    CL      Minute                (0 through 59)        *
    *    DH      Seconds               (0 through 59)        *
    *    DL      Hundredths of seconds (0 through 99)        *
    *******************   READ CLOCK  ***********************)

    PROCEDURE ReadClock(VAR Secs : Real);

    CONST
      Secs_PER_HOUR = 3600.0; {This must be a real constant!}
      Secs_PER_MINUTE = 60.0;
    TYPE {Delete this type for TP4 and TP5}
      Registers = RECORD
        CASE Boolean OF
          True : (AL,AH,BL,BH,CL,CH,DL,DH:Byte);
          False : (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:Integer)
        END;
    VAR Register : Registers;
    BEGIN
      Register.AH := $2C;
      msDos(Register);
      Secs := Secs_PER_HOUR*(Register.CH)
                +Secs_PER_MINUTE*(Register.CL)
                +Register.DH
                +0.01*Register.DL;
    END;

{********************** BODY OF WAIT ************************}

  BEGIN
    ReadClock(StartingSecs);
    REPEAT
      ReadClock(Secs);
      IF Secs-StartingSecs >= 0.0 THEN {Normal situation.}
        TimeIsUp := Secs-StartingSecs >= NumberOfSecs
      ELSE {During call, clock has ticked past midnight.}
        TimeIsUp := Secs_PER_DAY-StartingSecs+Secs >= NumberOfSecs
    UNTIL TimeIsUp
  END;
[ RETURN TO DIRECTORY ]