TYPE
    T* = RECORD
           hour* : INTEGER; (* [0..23] *)
           min*  : INTEGER; (* [0..59] *)
           sec*  : INTEGER; (* [0..59] *)
           msec* : INTEGER; (* [0..TactSEC-1] *)
         END;
        
    Stopwatch* = RECORD (T)
                   start : LONGINT;  (* начальное время 
в упакованном виде    *)
                   on-   : BOOLEAN;  (* контроль
состояния: включен ли? *)
                 END;

  PROCEDURE (VAR t: T) Pack* (): LONGINT;
    VAR  p: LONGINT; (* процедура связана с типом T; это
реализация метода класса *)
  BEGIN
    ASSERT((t.hour >= 0) & (t.hour <= 23)); (* контрольные
вставки *)
    ASSERT((t.min  >= 0) & (t.min  <= 59));
    ASSERT((t.sec  >= 0) & (t.sec  <= 59));
    ASSERT((t.msec >= 0) & (t.msec <= 999));
    p := t.hour * 60; (* упаковываем время, переводим
в бинарный вид *)
    p := p + t.min; p := p * 60;
    p := p + t.sec; p := p * TactSEC;
    p := p + t.msec;
    RETURN p
  END  Pack;

  PROCEDURE (VAR sw: Stopwatch) Start* ;
    VAR t: T;
  BEGIN
    ASSERT(~sw.on);
    sw.on := TRUE;  t.Get; sw.start := t.Pack();
  END Start;
  
  PROCEDURE (VAR sw: Stopwatch) Stop* ;
    VAR t,t2: T; dlt: LONGINT;
  BEGIN
    ASSERT(sw.on);
    sw.on := FALSE; t.Unpack(sw.start); t2.Get;
dlt := t.Delta(t2);
    sw.Inc(dlt); sw.start := 0;
  END Stop;
498