#include "exec/types.h"
#include "exec/nodes.h"
#include "exec/lists.h"
#include "exec/memory.h"
#include "exec/interrupts.h"
#include "exec/ports.h"
#include "exec/libraries.h"
#include "exec/io.h"
#include "exec/tasks.h"
#include "exec/execbase.h"
#include "exec/devices.h"
#include "devices/trackdisk.h"
#include "functions.h"


#define BLOCKSIZE TD_SECTOR

SHORT error;
struct MsgPort *diskport;
struct IOExtTD *diskreq;
LONG *diskdata;

ULONG diskChangeCount;

extern struct IORequest *CreateExtIO();

void WriteBlock (block)
SHORT block;
{

   diskreq->iotd_Req.io_Length = BLOCKSIZE * 2;
   diskreq->iotd_Req.io_Data = (APTR) diskdata;
   diskreq->iotd_Req.io_Command = ETD_WRITE;
   diskreq->iotd_Count = diskChangeCount;

   diskreq->iotd_Req.io_Offset = (LONG) BLOCKSIZE * block;
   DoIO (diskreq);
   diskreq->iotd_Req.io_Command = CMD_UPDATE;
   DoIO (diskreq);
}

void Motor(diskreq, flag)
struct IOExtTD *diskreq;
LONG flag;
{
   diskreq->iotd_Req.io_Length = flag; /* 1 = aan en 0 = uit */
   diskreq->iotd_Req.io_Command = TD_MOTOR;
   DoIO (diskreq);
   printf ("Old motor state was: %ld\n",diskreq->iotd_Req.io_Actual);
   printf ("io_Error value was: %ld\n",diskreq->iotd_Req.io_Error);
}

unsigned long BBsum (BB)
unsigned long *BB;
{
   unsigned long prec, sum;
   int i;

   sum = prec = 0;

   for (i=0;i<256;i++)
   {
      sum += BB[i];
      if (sum < prec)
         ++sum;
      prec = sum;
   }
   return (0xffffffff - sum);
}

main()
{
   int i;

   diskdata = AllocMem (1024L, MEMF_CHIP);
   if ((diskport = CreatePort (0L, 0L))== 0L)
      Exit (100L);
   if ((diskreq = CreateExtIO (diskport,(LONG) sizeof (struct IOExtTD))) == 0L)
   {
      DeletePort (diskport);
      FreeMem (diskdata, 1024L);
      Exit (200L);
   }
   error = OpenDevice (TD_NAME, 0L, diskreq, 0L);
   printf ("Error value returned  by OpenDevice was: %lx\n",error);

   diskreq->iotd_Req.io_Command = TD_CHANGENUM;
   DoIO (diskreq);

   diskChangeCount = diskreq->iotd_Req.io_Actual;
   printf ("Change number for disk is currently %ld\n",diskChangeCount);

   diskdata[0] = 0x444f5300;
   diskdata[1] = 0;
   diskdata[2] = 0x00000370;
   diskdata[1] = BBsum(diskdata);
	

   Motor (diskreq, 1L);

   WriteBlock (0);
   if (diskreq->iotd_Req.io_Error != 0)
       printf ("Error =  %d\n",diskreq->iotd_Req.io_Error);
   Motor (diskreq, 0L);
   CloseDevice (diskreq);

   DeleteExtIO (diskreq, (LONG) sizeof (struct IOExtTD));
   DeletePort (diskport);

   for (i=0;i<128;i++)
      printf ("%lx\n",diskdata[i]);



   FreeMem (diskdata, 1024L);

}
