[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]