[comp.sys.amiga.introduction] How to I read the system time from within a Modulaprg?

pilgrim@daimi.aau.dk (Jakob G}rdsted) (05/12/91)

I've been trying to read the clock from a M2Amiga program,
but I cannot find any information in the manual on doing
this. I've looked in various c programs(all those clock
programs...) and it seems, that in c there is a routine
called getclk or something like that. I would have
thought, that there was a library or an inclusion module;
on I*M PC Modula and on Sun, it's an inclusion module -
you say something like 

FROM SystemTimer IMPORT
Getdate,Setdate
END

But I find no such thing. What simple thing is it that I've
overlooked?

Thanks in advance, replies by E-mail.
--
From the notorious
                      Jakob Gaardsted, Computer Science Department
Bed og arbejd !            University of Aarhus,  Jylland (!)
(Pray and work!)  AMIGA!  pilgrim@daimi.aau.dk | I'd rather play Moria.

dac@prolix.pub.uu.oz.au (Andrew Clayton) (05/13/91)

In article <1991May12.042713.4925@daimi.aau.dk>, Jakob G}rdsted writes:

> I've been trying to read the clock from a M2Amiga program,
> but I cannot find any information in the manual on doing
> this. I've looked in various c programs(all those clock
> programs...) and it seems, that in c there is a routine
> called getclk or something like that. I would have

What is so difficult?

MODULE TimerDemo;

(*======================================================================*)
(*                        M2Sprint Demo Program                         *)
(*======================================================================*)
(*       Copyright (c) 1988 Martin Taillefer, All Rights Reserved       *)
(*                    This is freely redistributable                    *)
(*======================================================================*)
(*      Version: 1.00           Author : Martin Taillefer               *)
(*      Date   : 16-Dec-88      Changes: Original			*)
(*======================================================================*)
(*	References: Rom Kernel Manual					*)
(*======================================================================*)

FROM SYSTEM	 IMPORT ADR, ADDRESS, BYTE, TSIZE;
FROM DOSLoader	 IMPORT Execute;
FROM Devices	 IMPORT OpenDevice, CloseDevice, DevicePtr;
FROM IO		 IMPORT DoIO;
FROM IOUtils	 IMPORT CreateExtIO, DeleteExtIO;
FROM Ports	 IMPORT MsgPortPtr;
FROM PortUtils	 IMPORT CreatePort, DeletePort;
FROM TimerDevice IMPORT TimerBase, TimerName, TimeVal, TimeRequestPtr,
                        TimeRequest, TRAddRequest, TRGetSysTime, 
                        TRSetSysTime, UnitMicroHz, UnitVBlank;
FROM TermOut	 IMPORT WriteLongCard, WriteString, WriteLn;


PROCEDURE DeleteTimer(tr:TimeRequestPtr);
VAR 
  tp : MsgPortPtr;
BEGIN
  tp:=tr^.trNode.ioMessage.mnReplyPort;
  IF tr # NIL THEN
    CloseDevice(tr);
    DeleteExtIO(tr,TSIZE(TimeRequest));
  END;

  IF tp # NIL THEN
    DeletePort(tp);
  END;
END DeleteTimer;


PROCEDURE PrepareTimer(precision:INTEGER): TimeRequestPtr;
VAR
  whichunit : LONGINT;
  timerport : MsgPortPtr;
  timermsg  : TimeRequestPtr;
BEGIN
  timerport:=CreatePort(NIL,0);
  IF timerport=NIL THEN
    RETURN NIL;
  END;

  timermsg:=CreateExtIO(timerport,TSIZE(TimeRequest));
  IF timermsg=NIL THEN
    DeletePort(timerport);
    RETURN NIL;
  END;

  whichunit:=UnitVBlank;
  IF precision # 0 THEN
    whichunit:=UnitMicroHz;
  END;

  IF OpenDevice(ADR(TimerName),whichunit,timermsg,LONGBITSET{}) # 0 THEN
    DeleteExtIO(timermsg,TSIZE(TimeRequest));
    DeletePort(timerport);
    RETURN NIL;
  END;

  RETURN timermsg;
END PrepareTimer;


PROCEDURE GetTimerBase(): DevicePtr;
VAR
  tbase : DevicePtr;
  tr    : TimeRequestPtr;
BEGIN
  tr:=PrepareTimer(0);
  tbase:=tr^.trNode.ioDevice;
  DeleteTimer(tr);

  RETURN tbase;
END GetTimerBase;


PROCEDURE WaitForTimer(tr:TimeRequestPtr; seconds,microseconds:LONGCARD);
VAR
  x : LONGINT;
BEGIN
  WITH tr^ DO
    trNode.ioCommand := TRAddRequest;
    trTime.tvSecs    := seconds;
    trTime.tvMicro   := microseconds;
  END;
  x:=DoIO(tr);
END WaitForTimer;


PROCEDURE SetNewTime(day,min,sec:LONGCARD);
VAR
  tr : TimeRequestPtr;
  x  : LONGINT;
BEGIN
  tr:=PrepareTimer(1);
  IF tr=NIL THEN
    RETURN;
  END;

  WITH tr^ DO
    trNode.ioCommand := TRSetSysTime;
    trTime.tvSecs    := (24D*60*60*day) + (60*min) + sec;
    trTime.tvMicro   := 0;
  END;
  x:=DoIO(tr);

  DeleteTimer(tr);
END SetNewTime;


PROCEDURE GetSysTime(VAR tv:TimeVal);
VAR
  tr : TimeRequestPtr;
  x  : LONGINT;
BEGIN
  tr:=PrepareTimer(1);
  IF tr=NIL THEN
    RETURN;
  END;

  tr^.trNode.ioCommand:=TRGetSysTime;
  x:=DoIO(tr);
  tv:=tr^.trTime;

  DeleteTimer(tr);
END GetSysTime;


PROCEDURE TimeDelay(seconds,microseconds: LONGCARD; precision: INTEGER);
VAR
  precise : INTEGER;
  tr      : TimeRequestPtr;
BEGIN
  precise:=0;
  IF (seconds<0) OR (precision # 0) THEN
    precise:=1;
  END;

  tr:=PrepareTimer(precise);
  IF tr=NIL THEN
    RETURN;
  END;

  WaitForTimer(tr,seconds,microseconds);
  DeleteTimer(tr);
END TimeDelay;


VAR
  dummy                : BOOLEAN;
  days,minutes,seconds : LONGINT;
  mytimeval, oldtimeval: TimeVal;

BEGIN
  WriteString("Asleep for 2 seconds...\n");
  TimeDelay(2,0,0);

  WriteString("Asleep for 4 seconds...\n");
  TimeDelay(4,0,0);

  WriteString("Asleep for 1/2 second...\n");
  TimeDelay(0,500000,0);
  WriteLn;

  WriteString("Current system date: ");
  dummy:=Execute(ADR("date"),0,0);

  WriteString("Current system time in seconds: ");
  GetSysTime(oldtimeval);
  WriteLongCard(oldtimeval.tvSecs,1);
  WriteLn; WriteLn;

  WriteString("Setting a new system time\n");
  days    := 1000 + oldtimeval.tvSecs DIV (24D*60*60);
  minutes := (oldtimeval.tvSecs MOD (24D*60*60)) DIV 60;
  seconds := (oldtimeval.tvSecs MOD (24D*60*60)) MOD 60;
  SetNewTime(days, minutes, seconds);
  WriteLn;

  WriteString("Current system date: ");
  dummy:=Execute(ADR("date"),0,0);

  WriteString("Current system time in seconds: ");
  GetSysTime(mytimeval);
  WriteLongCard(mytimeval.tvSecs,1);
  WriteLn; WriteLn;

  WriteString("Current system time: ");
  GetSysTime(mytimeval);
  WriteLongCard(mytimeval.tvSecs,1);
  WriteString(".");
  WriteLongCard(mytimeval.tvMicro,1);
  WriteLn;

  WriteString("Current system time: ");
  GetSysTime(mytimeval);
  WriteLongCard(mytimeval.tvSecs,1);
  WriteString(".");
  WriteLongCard(mytimeval.tvMicro,1);
  WriteLn;

  WriteString("Current system time: ");
  GetSysTime(mytimeval);
  WriteLongCard(mytimeval.tvSecs,1);
  WriteString(".");
  WriteLongCard(mytimeval.tvMicro,1);
  WriteLn; WriteLn;

  WriteString("Resetting to former time\n");
  days    := oldtimeval.tvSecs DIV (24D*60*60);
  minutes := (oldtimeval.tvSecs MOD (24D*60*60)) DIV 60;
  seconds := (oldtimeval.tvSecs MOD (24D*60*60)) MOD 60;
  SetNewTime(days,minutes,seconds);
  WriteLn;

  WriteString("Current system time: ");
  GetSysTime(mytimeval);
  WriteLongCard(mytimeval.tvSecs,1);
  WriteString(".");
  WriteLongCard(mytimeval.tvMicro,1);
  WriteLn;

  TimerBase:=GetTimerBase();
END TimerDemo.

--------------------------------------------------------------

Dac
--
David Andrew Clayton. // _l _  _|Normally a resident at dac@prolix.pub.uu.oz.au
Canberra, Australia.\X/ (_](_l(_|But, due to circumstances beyond my control, I
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\|don't RECEIVE mail at the moment. You could try
prolix!dac%eyrie@labtam.oz.au   or  ...!munnari!labtam!eyrie!prolix!dac |Post.Am