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