| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- (* Release 3.10 *)
- (*-------------------------------------------------------------------------*
- * *
- * TIMER.MOD - COMMS Toolkit timer functions *
- * *
- * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. *
- * All Rights Reserved *
- * *
- *--------------------------------------------------------------------------*)
- IMPLEMENTATION MODULE Timer;
- (*%F _OS2*)
- IMPORT SYSTEM,Lib;
- VAR
- AppTimer,OldSeconds : CARDINAL;
- (*................................................*)
- PROCEDURE ReadClock():CARDINAL;
- VAR
- Regs : SYSTEM.Registers;
- BEGIN
- Regs.AH := 2CH;
- Lib.Dos(Regs);
- RETURN Regs.DX>>8;
- END ReadClock;
- (*................................................*)
- PROCEDURE TickHandler(Ticks:CARDINAL);
- VAR
- i : CARDINAL;
- BEGIN
- IF Ticks=0 THEN
- RETURN;
- END;
- IF AppTimer>=Ticks THEN
- DEC(AppTimer,Ticks);
- ELSE
- AppTimer:=0;
- END;
- IF Clock.Running THEN
- WITH Clock DO
- INC(Seconds,Ticks);
- IF Seconds>=60 THEN
- DEC(Seconds,60);
- INC(Minutes);
- IF Minutes=60 THEN
- Minutes:=0;
- INC(Hours);
- END;
- END;
- END;
- END;
- END TickHandler;
- (*.............................................*)
- PROCEDURE UpdateTimer;
- VAR
- Seconds : CARDINAL;
- BEGIN
- Seconds := ReadClock();
- IF Seconds>=OldSeconds THEN
- TickHandler(Seconds - OldSeconds)
- ELSE
- TickHandler((60+Seconds) - OldSeconds)
- END;
- OldSeconds := Seconds;
- END UpdateTimer;
- (*................................................*)
- PROCEDURE StopClock;
- BEGIN
- Clock.Running := FALSE;
- END StopClock;
- (*........................................*)
- PROCEDURE StartClock;
- BEGIN
- StopClock; (* Stop clock if it is running *)
- WITH Clock DO
- Hours:=0;
- Minutes:=0;
- Seconds:=0;
- Running := TRUE;
- END;
- OldSeconds := ReadClock();
- END StartClock;
- (*........................................*)
- PROCEDURE AppTimerExpired():BOOLEAN;
- BEGIN
- RETURN AppTimer=0;
- END AppTimerExpired;
- (*........................................*)
- PROCEDURE SetAppTimer(Seconds:CARDINAL);
- BEGIN
- AppTimer := Seconds;
- OldSeconds := ReadClock();
- END SetAppTimer;
- (*........................................*)
- BEGIN
- AppTimer := 0;
- StopClock;
- END Timer.
- (*%E*)
- (*%T _OS2*)
- (* OS/2 version *)
- IMPORT Dos;
- VAR
- AppTimer : CARDINAL;
- OldSeconds : LONGCARD;
- ginfo : CARDINAL;
- pinfo : CARDINAL;
- (*................................................*)
- PROCEDURE ReadClock():LONGCARD;
- VAR
- tmp : LONGCARD;
- BEGIN
- REPEAT
- tmp := [ginfo:0 Dos.PGINFOSEG]^.time;
- UNTIL tmp = [ginfo:0 Dos.PGINFOSEG]^.time;
- RETURN tmp;
- END ReadClock;
- (*................................................*)
- PROCEDURE TickHandler(Ticks:CARDINAL);
- VAR
- i : CARDINAL;
- BEGIN
- IF Ticks=0 THEN
- RETURN;
- END;
- IF AppTimer>=Ticks THEN
- DEC(AppTimer,Ticks);
- ELSE
- AppTimer:=0;
- END;
- IF Clock.Running THEN
- WITH Clock DO
- INC(Seconds,Ticks);
- IF Seconds>=60 THEN
- DEC(Seconds,60);
- INC(Minutes);
- IF Minutes=60 THEN
- Minutes:=0;
- INC(Hours);
- END;
- END;
- END;
- END;
- END TickHandler;
- (*.............................................*)
- PROCEDURE UpdateTimer;
- VAR
- Seconds : LONGCARD;
- BEGIN
- Seconds := ReadClock();
- TickHandler(VAL(CARDINAL,Seconds-OldSeconds));
- OldSeconds := Seconds;
- END UpdateTimer;
- (*................................................*)
- PROCEDURE StopClock;
- BEGIN
- Clock.Running := FALSE;
- END StopClock;
- (*........................................*)
- PROCEDURE StartClock;
- BEGIN
- StopClock; (* Stop clock if it is running *)
- WITH Clock DO
- Hours:=0;
- Minutes:=0;
- Seconds:=0;
- Running := TRUE;
- END;
- OldSeconds := ReadClock();
- END StartClock;
- (*........................................*)
- PROCEDURE AppTimerExpired():BOOLEAN;
- BEGIN
- RETURN AppTimer=0;
- END AppTimerExpired;
- (*........................................*)
- PROCEDURE SetAppTimer(Seconds:CARDINAL);
- BEGIN
- AppTimer := Seconds;
- OldSeconds := ReadClock();
- END SetAppTimer;
- (*........................................*)
- BEGIN
- Dos.GetInfoSeg(ginfo,pinfo);
- AppTimer := 0;
- StopClock;
- END Timer.
- (*%E*)
|