{$C Copyright (c) 1983 SAGE Computer Technology, All Rights Reserved}

{ SAGE Time & Date Set
  
  File:	    SAGEDATE.TEXT
  Date:	    23-Oct-83
  Version:  2

  COPYRIGHT (c) 1982, 1983 SAGE Computer Technology
  All Rights Reserved


  Requirements:

    1. Uses SIO_Unit, TAD_Unit, and Config_SAGE from SAGE Tool Kit.
    2. Uses Screenops, Sys_info, Wild, and DirInfo Units from
       p-System distribution.


  Development History:

  1	29-Aug-82  Initial release
  1A	 2-Oct-82  Initialize data in Screenops.
  1B	17-Mar-83  Update date on Winchester (#9:)
  2	17-May-83  Revised to use Channel Table for device updates.
  2A	23-Oct-83  Update all visible physical devices #4, 5, 9, and 11.
  
}
PROGRAM SageDate;

USES 
  {$U SAGETOOLS.CODE}
  Sys_Info,
  Wild,
  DIRINFO,
  SIO_Unit,
  TAD_Unit,
  Config_Sage,
  {$U SCREENOPS.CODE}
  SCREENOPS;

VAR
  Day,Month,Year,Hours,Minutes,Seconds:INTEGER;
  DayofWeek,Julian:INTEGER;
  LastDay,LastMonth,LastYear,LastHour,LastMinute,LastSeconds:INTEGER;
  LastDayofWeek,LastJulian:INTEGER;
  SysDay,SysMonth,SysYear:INTEGER;
  Cursor:INTEGER;
  D:D_DateRec;
  SysSet,NeedSys:BOOLEAN;
  SageSet:BOOLEAN;
  Reading,Dummy:BOOLEAN;
  Result:STRING;
  M:STRING;
  NewDate,NewTime:STRING;
  LastDate,SageInfo:TAD_Ptime;
  
PROCEDURE UpdateDevs;
VAR
  Count:INTEGER;
  I:INTEGER;
  S:STRING;
  Table:Conf_ChanTable;
BEGIN
  Count:=0;
  D.Day:=Day;
  D.Month:=Month;
  D.Year:=Year;
  Result:='  Updating device(s) ';
  Conf_RD_ChanTable(Table);
  FOR I:= 0 TO 31 DO
    IF Table[I].Channel IN [4,5,11,9] THEN
      BEGIN
	S:='#';
	SIO_IntWt(I,S);
	IF D_Change_Date(S,D,[D_Vol]) = D_Okay THEN
	  BEGIN
	    IF Count>0 THEN Result:=CONCAT(Result,', ');
	    Count:=Count+1;
	    IF LENGTH(Result) > 54 THEN
	      BEGIN
		WRITELN(Result);
		Result:='		      ';
	      END;
	    Result:=CONCAT(Result,S);
	  END;
      END;
  IF Count > 0 THEN
    BEGIN
      Result:=CONCAT(Result,' with ');
      TAD_DatO(Day,Month,Year,[],Result);
      WRITELN(Result);
    END;
  SI_Set_Date(D);
  sc_init; { update date in screenops }
END;

PROCEDURE UpdateBios(TimeChange:BOOLEAN);
VAR
  UpDay,UpMonth,UpYear,UpHours,UpMinutes,UpSeconds:INTEGER;
  UpDayofWeek,UpJulian:INTEGER;
BEGIN
  IF NOT TimeChange THEN
    BEGIN
      UNITREAD(129,SageInfo,0,0,1);
      TAD_Unpack(SageInfo,UpDay,UpMonth,UpYear,UpHours,UpMinutes,UpSeconds,
		 UpDayofWeek,UpJulian);
      Hours:=UpHours;
      Minutes:=UpMinutes;
      Seconds:=UpSeconds;
    END;
  TAD_Set(Day,Month,Year,Hours,Minutes,Seconds);
  Result:='  SAGE updated with ';
  TAD_DatO(Day,Month,Year,[],Result);
  SIO_Fill(2,Result);
  TAD_TimO(Hours,Minutes,Seconds,[TAD_Long],Result);
  WRITELN(Result);
END;

BEGIN
  SysSet:=FALSE;
  SageSet:=FALSE;
  Day:=0;
  Month:=0;
  Year:=0;
  WRITELN('SAGE Time & Date Set.');
  WRITELN;
  SI_Get_Date(D);
  SysDay:=D.Day;
  SysMonth:=D.Month;
  SysYear:=D.Year;
  IF (SysDay>0) AND (SysDay<32) AND (SysMonth>0) AND (SysMonth<13) AND
     (SysYear>=0) AND (SysYear<100) THEN SysSet:=TRUE;
  UNITREAD(129,LastDate,0,0,2);
  IF (LastDate[0]<>0) OR (LastDate[1]<>0) OR (LastDate[2]<>0) OR
     (LastDate[3]<>0) THEN
    BEGIN
      TAD_Unpack(LastDate,LastDay,LastMonth,LastYear,LastHours,LastMinutes,LastSeconds,
		 LastDayofWeek,LastJulian);
      UNITREAD(129,SageInfo,0,0,1);
      TAD_Unpack(SageInfo,Day,Month,Year,Hours,Minutes,Seconds,
		 DayofWeek,Julian);
      SageSet:=TRUE;
    END;
  IF SageSet THEN
    BEGIN
      Result:='	 SAGE time & date:	 ';
      TAD_DOWO(DayofWeek,[],Result);
      Result:=CONCAT(Result,', ');
      TAD_DatO(Day,Month,Year,[],Result);
      SIO_Fill(2,Result);
      TAD_TimO(Hours,Minutes,Seconds,[TAD_Long],Result);
      WRITELN(Result);
      WRITELN;
      Result:='	 Last set:		 ';      TAD_DOWO(LastDayofWeek,[],Result);
      Result:=CONCAT(Result,', ');
      TAD_DatO(LastDay,LastMonth,LastYear,[],Result);
      SIO_Fill(2,Result);
      TAD_TimO(LastHours,LastMinutes,LastSeconds,[TAD_Long],Result);
      WRITELN(Result);
      WRITELN;
    END;
  NeedSys:=FALSE;
  IF SysSet THEN
    BEGIN
      IF (SysDay<>Day) OR (SysMonth<>Month) OR (SysYear<>Year) THEN
	BEGIN
	  Result:='  Date on system device: ';
	  TAD_DatO(SysDay,SysMonth,SysYear,[],Result);
	  WRITELN(Result);
	  WRITELN;
	  IF SageSet THEN NeedSys:=TRUE;
	END;
    END;
  IF (NOT SageSet) AND SysSet THEN
    BEGIN
      Day:=SysDay;
      Month:=SysMonth;
      Year:=SysYear;
    END;
  Reading:=TRUE;
  WHILE Reading DO
    BEGIN
      WRITE('New date <CR for same>: ');
      READLN(NewDate);
      Cursor:=1;
      IF LENGTH(NewDate)>0 THEN
	BEGIN
	  IF TAD_DatI(Cursor,NewDate,[TAD_Short],Day,Month,Year) THEN
	    BEGIN
	      Dummy:=SIO_ByDlim(Cursor,NewDate,' ');
	      IF Cursor > LENGTH(NewDate) THEN Reading:=FALSE;
	    END;
	END
      ELSE
	Reading:=FALSE;
      IF Reading THEN WRITE(CHR(7));
    END;
  Reading:=TRUE;
  WHILE Reading DO
    BEGIN
      WRITE('New time <CR for none>: ');
      READLN(NewTime);
      Cursor:=1;
      IF LENGTH(NewTime)>0 THEN
	BEGIN
	  IF TAD_TimI(Cursor,NewTime,[],Hours,Minutes,Seconds) THEN
	    Reading:=FALSE;
	END
      ELSE
	Reading:=FALSE;
      IF Reading THEN WRITE(CHR(7));
    END;
  WRITELN;
  IF (LENGTH(NewDate)=0) AND (LENGTH(NewTime)=0) THEN
    BEGIN  {No time or date}
      WRITELN('No time or date changed.');
      IF NeedSys THEN UpdateDevs
    END
  ELSE
    BEGIN
      IF LENGTH(NewDate)=0 THEN
	BEGIN  {New time only}
	  WRITELN('Time only changed.');
	  UpdateBios(TRUE);
	END
      ELSE
	IF LENGTH(NewTime)=0 THEN
	  BEGIN	 {New date only}
	    WRITELN('Date only changed.');
	    IF SageSet THEN UpdateBios(FALSE);
	    UpdateDevs;
	  END
	ELSE
	  BEGIN {New date and time}
	    WRITELN('Time and date changed.');
	    UpdateBios(TRUE);
	    UpdateDevs;
	  END;
    END;
END.

                                                                                                   