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

     (*****************    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   ************************)

      uses dos, TpCrt, TpString;

      var
        p_cnt : integer;
        s     : string[5];
        sr    : real;
        okay  : boolean;
        ch    : char;

      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 Regs : Registers;
        BEGIN
          Regs.AH := $2C;
          msDos(Regs);
          Secs := Secs_PER_HOUR*(Regs.CH)
                    +Secs_PER_MINUTE*(Regs.CL)
                    +Regs.DH
                    +0.01*Regs.DL;
        END;

    { BODY OF WAIT procedure}

      BEGIN
        ReadClock(StartingSecs);
        REPEAT                                  { allow break out }
          if KeyPressed then begin
                               ch := ReadKey;   { eat the key }
                               Halt;
                             end;
          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;

    {  M _ A _ I _ N  }

      begin

        p_cnt := paramcount;
        if p_cnt = 0 then begin
          writeln('WAIT - a utility to wait a set number of seconds.');
          writeln('     - Is machine speed independent because it uses dos int 21h, function $2C.');
          writeln('     - can wait up to a whole day with a count of 86400.');
          writeln('     - can be interupted at any time by pressing a keyboard key.');
          writeln('     - needs a command line argument of number of seconds to wait.');
          writeln('     - IE. "wait 300" would wait for 5 minutes and then continue.');
          halt;
        end else begin
          s := paramstr(1);
          okay := false;
          okay := Str2Real(s, sr);
          if okay then begin
            writeln('WAIT - is now running for ', s ,' seconds.');
            wait(sr);
          end else
            writeln('WAIT - could not run because the parameter was invalid.');
        end;

      end.

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