
#include <exec/types.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <devices/trackdisk.h>
#include <functions.h>
#include <stdio.h>

#define BLOCKSIZE TD_SECTOR

struct MsgPort *diskport;
struct IOStdReq *diskreq;
unsigned char err;

APTR diskbuffer;
extern struct IOStdReq *CreateStdIO();

char *errs[] = {
	"NotSpecified",
	"NoSecHdr",
	"BadSecPreamble",
	"BadSecID",
	"BadHdrSum",
	"BadSecSum",
	"TooFewSecs",
	"BadSecHdr",
	"WriteProt",
	"DiskChanged",
	"SeekError",
	"NoMem",
	"BadUnitNum",
	"BadDriveType",
	"DriveInUse",
	"PostReset"
};
                
WriteBlock (block)
unsigned block;
{
  printf ("%d\r", block);
  fflush (stdout);
  diskreq->io_Length = BLOCKSIZE;
  diskreq->io_Offset = block * BLOCKSIZE;
  diskreq->io_Data = diskbuffer;  
  diskreq->io_Command = CMD_WRITE;
  DoIO (diskreq);
  if (err = diskreq->io_Error) {
    if (err >= 20 && err < 35)
      printf ("Error %s at block %d\n", errs[err- 20], block);
    else
      printf ("Error %d at block %d\n", err, block);
  }
}

main(ac, av)
int ac;
char *av[];
{
  unsigned block;
  unsigned char *kptr, c;
  diskbuffer = 0;
  diskreq = 0;
  diskport = 0;
  puts ("WARNING : This program builds a KICKSTART disk on drive df0:");
  puts ("OK to continue ?");
  c = toupper (getchar());
  if (c != 'Y')
    exit (0);
  if ((diskbuffer = (APTR) AllocMem ((long)BLOCKSIZE, MEMF_CHIP)) == 0) {
    printf ("Can't allocate buffer\n");
    exit (-1);
  }
  if ((diskport = (struct MsgPort *)CreatePort("foo",0L)) == 0) {
    printf ("Can't create port\n");
    _abort (10);
  }
  if ((diskreq = CreateStdIO(diskport)) == 0) {
    printf ("Can't create msg\n");
    _abort (20);
  }
  if ((err = OpenDevice(TD_NAME, 0L, diskreq, 0L)) != 0) {
    printf ("Can't open %s %x\n", TD_NAME, err);
    _abort (30);
  }
  kptr = 0xfc0000;
  movmem ("KICK", diskbuffer, (short)BLOCKSIZE);
  for (block = 0; block < 513 && ! err; block++) {
    WriteBlock (block);
    movmem (kptr, diskbuffer, (short)BLOCKSIZE);
    kptr += BLOCKSIZE;
  }
  _abort (err);
}

_abort (code)
int code;
{
  if (code)
    printf ("Aborting !\n");
  if (diskreq) {
    diskreq->io_Length = 0; /* this says motor is to be turned off */
    diskreq->io_Command = TD_MOTOR; /* do something with the motor */
    DoIO(diskreq);
    CloseDevice(diskreq);
    DeleteStdIO(diskreq);
  }
  if (diskport)
    DeletePort(diskport);
  if (diskbuffer)
    FreeMem (diskbuffer, (long)BLOCKSIZE);
  exit (code);
}               /* end of main */

