/****************************************************************************
*                                                                           *
* LoadKickC0 V1.0 -- Copyright 1991 by Matthias Scheler                     *
*                                                                           *
*      This program may be freely copied, as long as all copyright          *
*      notices are left intact and unchanged.                               *
*                                                                           *
****************************************************************************/

#include <exec/memory.h>
#include <exec/execbase.h>

#include <proto/dos.h>
#include <proto/exec.h>

#include <stdlib.h>

extern struct ExecBase *SysBase;

#define EXTMEMSTART   0xC00000L
#define EXTMEMMINSIZE (EXTMEMSTART+0x80000L)

#define KICK20SIZE    0x080000L
#define KICKVERSID    0x2500AFL

#define DELAY 3L

extern void __stdargs StartKick(ULONG *,ULONG *);
extern void __stdargs printf(char *,...);

BPTR stdout;

void main(long argc,char **argv)

{
 BPTR Handle;
 ULONG KickFileHeader[2];
 ULONG *KickImage;

 stdout=Output();

 if (argc==0L) exit (20L);
 printf ("LoadKickC0 V1.0 -- (c) 1991 by Matthias Scheler\n\n");

 if (SysBase->LibNode.lib_Version>34)
  {
   printf ("LoadKickC0 will only run under Kickstart 1.2/1.3\n");
   exit (5L);
  }

 if ((((ULONG)SysBase&0xFFFF0000L)!=EXTMEMSTART)||
     ((ULONG)SysBase->MaxExtMem<EXTMEMMINSIZE))
  {
   printf ("You must have a 1 MB or greater memory board at $%lx\n",EXTMEMSTART);
   exit (10L);
  }

 if (argc<2L)
  {
   printf ("Usage: LoadKickC0 KICKFILE\n");
   exit (10L);
  }

 if ((Handle=Open(argv[1],MODE_OLDFILE))==NULL)
  {
   printf ("Can't open %s\n",argv[1]);
   exit (10L);
  }
 if (Read(Handle,(char *)KickFileHeader,8L)!=8L)
  {
   Close (Handle);
   printf ("Error while reading %s\n",argv[1]);
   exit (10L);
  }
 if ((KickFileHeader[0]!=0L)||(KickFileHeader[1]!=KICK20SIZE))
  {
   Close (Handle);
   printf ("%s contains a bad header\n",argv[1]);
   exit (10L);
  }
 if ((KickImage=AllocMem(KICK20SIZE,MEMF_PUBLIC))==NULL)
  {
   Close (Handle);
   printf ("Out of memory\n");
   exit (10L);
  }
 if (Read(Handle,(char *)KickImage,KICK20SIZE)!=KICK20SIZE)
  {
   FreeMem (KickImage,KICK20SIZE);
   Close (Handle);
   printf ("Error while reading %s\n",argv[1]);
   exit (10L);
  }
 Close (Handle);
 if (KickImage[3]!=KICKVERSID)
  {
   FreeMem (KickImage,KICK20SIZE);
   printf ("Kickstart must be V%d.%d\n",KICKVERSID);
   exit (10L);
  }

 printf ("Rebooting in %ld seconds press <CTRL>-C to abort\n",DELAY);
 Delay (DELAY*TICKS_PER_SECOND);
 if (SetSignal(0L,SIGBREAKF_CTRL_C)&SIGBREAKF_CTRL_C)
  {
   FreeMem (KickImage,KICK20SIZE);
   printf ("\naborted\n");
   exit (0L);
  }

 StartKick(KickImage,(ULONG *)EXTMEMSTART);
}
