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

    {The problem:  repeat
                     ...
                   until SomeEvent;
     If SomeEvent (external hardware signals etc.) never comes, the program
     hangs. So I did this code to avoid hangup's. Look below for example.

     GetTimeWord returns the actual timer value.
     SetTimeOutTicks sets a timeout-value to a word variable TimeVar.
     IsTimeOut returns true when TimeVar >= actual time or false if lower.

     All 3 functions/procedures are very fast. The function IsTimeOut runs
     about 2.000.000!/second on a P90-machine.

     Dec. 12, 1995, Udo Juerss, 57078 Siegen, Germany, CompuServe [101364,526]}

    uses
      Crt;
    {---------------------------------------------------------------------------}

    var
      Time  : Word;
      Count : LongInt;
    {---------------------------------------------------------------------------}

    function GetTimeWord:Word; assembler;
    asm
               mov   es,Seg0040
               mov   di,6Ch
               mov   ax,word ptr es:[di]
    end;
    {---------------------------------------------------------------------------}

    procedure SetTimeOutTicks(Ticks:Word; var TimeVar:Word); assembler;
    asm
               call  GetTimeWord
               add   ax,Ticks
               les   di,TimeVar
               stosw
    end;
    {---------------------------------------------------------------------------}

    function IsTimeOut(TimeVar:Word):Boolean; assembler;
    asm
               mov   bx,TimeVar
               call  GetTimeWord
               cmp   ax,bx
               mov   al,0
               jl    @End
               mov   al,1
    @End:
    end;
    {---------------------------------------------------------------------------}

    begin
      ClrScr;
      Count:=0;
      SetTimeOutTicks(18,Time);               {1 second equals ~18.2 timer ticks}
      Writeln('Waiting for 1 second and counting IsTimeOut query...');
      repeat
        Inc(Count);
      until IsTimeOut(Time);
      Writeln('IsTimeOut query = ',Count:8,' times/sec.');
      ReadKey;
    end.

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