TIMER.MOD 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * TIMER.MOD - COMMS Toolkit timer functions *
  5. * *
  6. * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. IMPLEMENTATION MODULE Timer;
  11. (*%F _OS2*)
  12. IMPORT SYSTEM,Lib;
  13. VAR
  14. AppTimer,OldSeconds : CARDINAL;
  15. (*................................................*)
  16. PROCEDURE ReadClock():CARDINAL;
  17. VAR
  18. Regs : SYSTEM.Registers;
  19. BEGIN
  20. Regs.AH := 2CH;
  21. Lib.Dos(Regs);
  22. RETURN Regs.DX>>8;
  23. END ReadClock;
  24. (*................................................*)
  25. PROCEDURE TickHandler(Ticks:CARDINAL);
  26. VAR
  27. i : CARDINAL;
  28. BEGIN
  29. IF Ticks=0 THEN
  30. RETURN;
  31. END;
  32. IF AppTimer>=Ticks THEN
  33. DEC(AppTimer,Ticks);
  34. ELSE
  35. AppTimer:=0;
  36. END;
  37. IF Clock.Running THEN
  38. WITH Clock DO
  39. INC(Seconds,Ticks);
  40. IF Seconds>=60 THEN
  41. DEC(Seconds,60);
  42. INC(Minutes);
  43. IF Minutes=60 THEN
  44. Minutes:=0;
  45. INC(Hours);
  46. END;
  47. END;
  48. END;
  49. END;
  50. END TickHandler;
  51. (*.............................................*)
  52. PROCEDURE UpdateTimer;
  53. VAR
  54. Seconds : CARDINAL;
  55. BEGIN
  56. Seconds := ReadClock();
  57. IF Seconds>=OldSeconds THEN
  58. TickHandler(Seconds - OldSeconds)
  59. ELSE
  60. TickHandler((60+Seconds) - OldSeconds)
  61. END;
  62. OldSeconds := Seconds;
  63. END UpdateTimer;
  64. (*................................................*)
  65. PROCEDURE StopClock;
  66. BEGIN
  67. Clock.Running := FALSE;
  68. END StopClock;
  69. (*........................................*)
  70. PROCEDURE StartClock;
  71. BEGIN
  72. StopClock; (* Stop clock if it is running *)
  73. WITH Clock DO
  74. Hours:=0;
  75. Minutes:=0;
  76. Seconds:=0;
  77. Running := TRUE;
  78. END;
  79. OldSeconds := ReadClock();
  80. END StartClock;
  81. (*........................................*)
  82. PROCEDURE AppTimerExpired():BOOLEAN;
  83. BEGIN
  84. RETURN AppTimer=0;
  85. END AppTimerExpired;
  86. (*........................................*)
  87. PROCEDURE SetAppTimer(Seconds:CARDINAL);
  88. BEGIN
  89. AppTimer := Seconds;
  90. OldSeconds := ReadClock();
  91. END SetAppTimer;
  92. (*........................................*)
  93. BEGIN
  94. AppTimer := 0;
  95. StopClock;
  96. END Timer.
  97. (*%E*)
  98. (*%T _OS2*)
  99. (* OS/2 version *)
  100. IMPORT Dos;
  101. VAR
  102. AppTimer : CARDINAL;
  103. OldSeconds : LONGCARD;
  104. ginfo : CARDINAL;
  105. pinfo : CARDINAL;
  106. (*................................................*)
  107. PROCEDURE ReadClock():LONGCARD;
  108. VAR
  109. tmp : LONGCARD;
  110. BEGIN
  111. REPEAT
  112. tmp := [ginfo:0 Dos.PGINFOSEG]^.time;
  113. UNTIL tmp = [ginfo:0 Dos.PGINFOSEG]^.time;
  114. RETURN tmp;
  115. END ReadClock;
  116. (*................................................*)
  117. PROCEDURE TickHandler(Ticks:CARDINAL);
  118. VAR
  119. i : CARDINAL;
  120. BEGIN
  121. IF Ticks=0 THEN
  122. RETURN;
  123. END;
  124. IF AppTimer>=Ticks THEN
  125. DEC(AppTimer,Ticks);
  126. ELSE
  127. AppTimer:=0;
  128. END;
  129. IF Clock.Running THEN
  130. WITH Clock DO
  131. INC(Seconds,Ticks);
  132. IF Seconds>=60 THEN
  133. DEC(Seconds,60);
  134. INC(Minutes);
  135. IF Minutes=60 THEN
  136. Minutes:=0;
  137. INC(Hours);
  138. END;
  139. END;
  140. END;
  141. END;
  142. END TickHandler;
  143. (*.............................................*)
  144. PROCEDURE UpdateTimer;
  145. VAR
  146. Seconds : LONGCARD;
  147. BEGIN
  148. Seconds := ReadClock();
  149. TickHandler(VAL(CARDINAL,Seconds-OldSeconds));
  150. OldSeconds := Seconds;
  151. END UpdateTimer;
  152. (*................................................*)
  153. PROCEDURE StopClock;
  154. BEGIN
  155. Clock.Running := FALSE;
  156. END StopClock;
  157. (*........................................*)
  158. PROCEDURE StartClock;
  159. BEGIN
  160. StopClock; (* Stop clock if it is running *)
  161. WITH Clock DO
  162. Hours:=0;
  163. Minutes:=0;
  164. Seconds:=0;
  165. Running := TRUE;
  166. END;
  167. OldSeconds := ReadClock();
  168. END StartClock;
  169. (*........................................*)
  170. PROCEDURE AppTimerExpired():BOOLEAN;
  171. BEGIN
  172. RETURN AppTimer=0;
  173. END AppTimerExpired;
  174. (*........................................*)
  175. PROCEDURE SetAppTimer(Seconds:CARDINAL);
  176. BEGIN
  177. AppTimer := Seconds;
  178. OldSeconds := ReadClock();
  179. END SetAppTimer;
  180. (*........................................*)
  181. BEGIN
  182. Dos.GetInfoSeg(ginfo,pinfo);
  183. AppTimer := 0;
  184. StopClock;
  185. END Timer.
  186. (*%E*)
  187.