/* Time_to_IBM - für alle, die eine PC-Karte in ihrem Amiga haben.

   Das Problem : Der Amiga hat zwar eine akkugepufferte Uhr, der PC ist an
		 diese jedoch nicht angeschlossen. Beim Systemstart muß der
		 Benutzer daher jedesmal die Zeit neu eintippen, wenn der PC
		 bootet. Das ist ärgerlich, aber vermeidbar, denn jetzt kommt :
   Die Lösung  : Amiga und PC verfügen über einen Speicherbereich, der beiden
		 gemeinsam zugänglich ist, das sogenannte Dual-Ported-RAM.
		 Über diesen Speicher wird dem IBM die aktuelle Zeit übermit-
		 telt, die er dann in seiner Uhr speichern kann.
		 Dazu muß auf IBM-Seite nach dem Aufruf dieses Programms das
		 entsprechende Gegenstück gestartet werden, um die gesendete
		 Zeit zu empfangen. Die beiden Programme arbeiten synchron, 
		 d.h. sie warten aufeinander.
   Aufruf      :
   
   [run] TTI [-w]
   
   Option -w : Wenn der IBM nach einer gewissen Zeit nicht reagiert hat, weil
   	       das Empfangsprogramm nicht gestartet wurde, bricht der Amiga ab,
	       um Deadlock-Situationen zu vermeiden.

   Letzte Version (1.1) :  12.4.1989 Tim Pietzcker Software
   
   Änderungen : - Umleitung der Ausgabe in ein Window -> Starten des Programms 
		  als Background Task mit 'run' jetzt möglich.
		- Es wird eine Viertelsekunde Pause zwischen den einzelnen 
		  Abfragen, die feststellen, ob der IBM reagiert, eingelegt.
		  Der Befehl Wait() kann leider nicht verwendet werden, da der
		  IBM dem Amiga keine Signal-Bits übermitteln kann (Er kann 		  schon, ich kann's nicht, um genau zu sein). Also benutze
		  ich Delay(12) zwischen einzelnen Testabfragen.

  ACHTUNG : DIESES PROGRAMM ARBEITET NUR MIT DER VERSION 1.1 DES IBM-PROGRAMMS
  'RAT' ZUSAMMEN !!!

*/

#include <exec/types.h>
#include <time.h>
#include <stdio.h>

FILE *freopen(),*output;

char Window[] = "CON:100/50/350/60/Time To IBM © 1989 Tim Pietzcker";
 
char atime[26];
long clock;

usage (string)	/* Bei unkorrektem Aufruf wird diese Meldung ausgegeben */
char *string;
{
   printf("USAGE : %s [-w]\n",string);
   Delay(100l);
   exit(FALSE);
}

main(argc,argv)
int argc;
char **argv;
{
   BOOL wait=FALSE;
   UWORD *lang;
   UBYTE *data;
   LONG warten;
   int i;

   output = freopen(Window,"w",stdout);	/* Neues Window öffnen und Ausgabe in
					   dasselbe umleiten -> so wird nicht
					   das Start-CLI-Window blockiert, wenn
					   man das Programm mit RUN startet */
					   
   if (argc > 2 || (argc == 2 && (strcmp(argv[1],"-w")))) usage(argv[0]);
   if (argc == 2) wait = TRUE; 		/* Option -w gesetzt */
      
   lang = data = (long)0x202000;	/* Übertragungsadresse */	
   
   /* Jetzt wird der String übertragen */
   
   *lang = 26l;		/* Länge des Strings */
   printf ("Bereit zur Übertragung !\n");
   
   warten = 0l;
   while (warten < 40l && *lang != 0l) /* Abbruch entweder durch TimeOut oder
					  durch positive Rückmeldung des IBM */
   {
      if (wait) warten++;	/* wenn Option -w gesetzt */
      Delay(12l);
   }
   
   if (warten > 39l)	/* nach ca. 10 Sekunden bei gesetztem -w : Error */
   {
      printf("Timeout Error - IBM antwortet nicht !\n");
      Delay(100l);
      *lang = 0l;	/* falls nach dem so zustandegekommenen Abbruch das
			   IBM-Programm doch gestartet wird, muß diese Adresse
			   wieder gelöscht sein, da sonst der IBM denkt, der
			   Amiga wäre noch zuzr Sendung bereit */
      exit(FALSE);
   }
   
   printf("IBM - Rückmeldung erhalten ...\n");   
   clock = time(NULL);			/* Zeit holen */
   strcpy(atime,ctime(&clock));		/* und in String umformen */

   for (i=0 ; i < 26l ; i++)
   {
      *data = atime[i];			/* 1 Byte übertragen */
      while (*data != 255- atime[i]);	/* Warten auf Bestätigung */
   }
   
   *data = atime[25];	/* Letztes Zeichen nochmal, um IBM-Programm zu 
			   beenden */
   printf("Übertragung erfolgreich beendet !\n");
   Delay(100l);
}
