(* -------------------------------------------------------------------------
  :Program.       UClock
  :Author.        Holger Bolay
  :Address.       Hoffmannstraße 168, D-7250 Leonberg 1
  :Phone.         07152/22135
  :History.       Version 1.0  : Original translation!
  :History.       Version 1.01 : Beep on the hour
  :History.       Version 1.02 : Clever reorganized
  :History.       Version 1.1  : <unset> Function implemented
  :Copyright.     FreeWare
  :Language.      Modula-2
  :Translator.    M2Amiga 3.2d
  :Imports.       Beep [fbs]
  :Remark.        The Modula-2 Version of Mike Meyer's MClk.
  :Remark.        My first Modula-program (Don't laugh) - may help beginners!
  :Contents.      Small window which Shows Time & Memory.
------------------------------------------------------------------------- *)
MODULE UClock;

FROM SYSTEM       IMPORT ADR;
FROM Arts         IMPORT Assert, TermProcedure, Terminate, CurrentLevel;
FROM Conversions  IMPORT ValToStr;
FROM Str          IMPORT Length, Copy, Concat;
FROM Dos          IMPORT Date, DateStamp, Delay;
FROM Exec         IMPORT Byte, AvailMem, MemReqSet, MemReqs, GetMsg, ReplyMsg,
                         TaskPtr, SetTaskPri, FindTask;
FROM Graphics     IMPORT RastPortPtr, SetAPen, Text, Move;
FROM Intuition    IMPORT NewWindow, OpenWindow, CloseWindow, WindowPtr,
                         IDCMPFlags, IDCMPFlagSet, WindowFlags, WindowFlagSet,
                         ScreenFlagSet, ScreenFlags, IntuiMessagePtr;
FROM Beep         IMPORT Beep;

(* $R- $V- $S- $F- Make it faster and shorter! *)

VAR DateWindowPtr                    : WindowPtr;
    DateRPortPtr                     : RastPortPtr;
    chipMem, fastMem                 : LONGINT;
    Hour, Minute, Second             : LONGINT;
    chipStr, fastStr                 : ARRAY [1..4] OF CHAR;
    HourStr, MinuteStr, SecondStr    : ARRAY [1..2] OF CHAR;
    VTSerr                           : BOOLEAN;
    AllTogether                      : ARRAY [1..50] OF CHAR;
    IntuiMsgPtr                      : IntuiMessagePtr;
    class                            : IDCMPFlagSet;
    Time                             : Date;


PROCEDURE CloseDown;

BEGIN
   IF DateWindowPtr # NIL THEN
      CloseWindow(DateWindowPtr);
      DateWindowPtr := NIL;
   END; (* IF *)
END CloseDown;


PROCEDURE Init;

VAR DateWindow   : NewWindow;
    OldPri       : Byte;
    ClockTaskPtr : TaskPtr;

BEGIN
   TermProcedure(CloseDown);
   ClockTaskPtr := FindTask(NIL);
   Assert(ClockTaskPtr # NIL, ADR("Can't find Task!?!"));
   OldPri := SetTaskPri(ClockTaskPtr, 20);
   WITH DateWindow DO
      leftEdge := 223; topEdge := 0;
      width := 369; height := 10;
      detailPen := 0; blockPen := 1;
      idcmpFlags := IDCMPFlagSet{closeWindow};
      flags := WindowFlagSet{windowDepth, windowDrag, windowClose,
                             rmbTrap, windowRefresh, noCareRefresh};
      firstGadget := NIL;
      checkMark := NIL;
      title := NIL;
      screen := NIL;
      bitMap := NIL;
      minWidth := 0; minHeight := 0;
      maxWidth := 0; maxHeight := 0;
      type := ScreenFlagSet{wbenchScreen};
   END; (* WITH *)
   DateWindowPtr := OpenWindow(DateWindow);
   Assert(DateWindowPtr # NIL, ADR("Unable to open Date-Window!"));
   DateRPortPtr := DateWindowPtr^.rPort;
   SetAPen(DateRPortPtr, 1);
END Init;


PROCEDURE Concatenation;

BEGIN
   chipMem := AvailMem(MemReqSet{chip}) DIV 1024;
   fastMem := AvailMem(MemReqSet{fast}) DIV 1024;
   DateStamp(ADR(Time));
   Hour := Time.minute DIV 60;
   Minute := Time.minute MOD 60;
   Second := Time.tick DIV 50;
   ValToStr(chipMem, FALSE, chipStr, 10, 3, ' ', VTSerr);
   ValToStr(fastMem, FALSE, fastStr, 10, 4, ' ', VTSerr);
   ValToStr(Hour, FALSE, HourStr, 10, 2, ' ', VTSerr);
   ValToStr(Minute, FALSE, MinuteStr, 10, 2, '0', VTSerr);
   ValToStr(Second, FALSE, SecondStr, 10, 2, '0', VTSerr);
   Copy(AllTogether, " Chip:");
   Concat(AllTogether, chipStr);
   Concat(AllTogether, "  ");
   Concat(AllTogether, "Fast:");
   Concat(AllTogether, fastStr);
   Concat(AllTogether, "  ");
   Concat(AllTogether, "Time:");
   IF Time.days # 0 THEN
      Concat(AllTogether, HourStr);
      Concat(AllTogether, ":");
      Concat(AllTogether, MinuteStr);
      Concat(AllTogether, ":");
      Concat(AllTogether, SecondStr);
      Concat(AllTogether, " ");
   ELSE
      Concat(AllTogether, " <unset> ");
   END; (* IF *)
END Concatenation;


BEGIN
   Init;
   LOOP
      Delay(15);
      Concatenation;
      Move(DateRPortPtr, 28, 7);
      Text(DateRPortPtr, ADR(AllTogether), Length(AllTogether));
      IntuiMsgPtr := GetMsg(DateWindowPtr^.userPort);
      IF (Second = 0) AND (Minute = 0) THEN
         Beep(FALSE);
         REPEAT
            Delay(1);
            DateStamp(ADR(Time));
            Second := Time.tick DIV 50;
         UNTIL (Second # 0);
      END; (* IF *)
      IF Time.days = 0 THEN
         Beep(TRUE);
      END; (* IF *)
      IF IntuiMsgPtr # NIL THEN
         class := IntuiMsgPtr^.class;
         ReplyMsg(IntuiMsgPtr);
         IF (closeWindow IN class) THEN
            Terminate(CurrentLevel());
         END; (* IF *)
      END; (* IF *)
   END; (* LOOP *)
END UClock.
