/* program SofTrack.Shows the floppy head position and whether it is a read or 
write operation.compile with lattice C 3.1 and link with Install.o and 
GetUnitID.o using blink.

Written by Kamran Karimi
*/ 


#include <exec/exec.h>
#include <intuition/intuition.h>
#include <resources/disk.h>

struct TextAttr ROMFont = 
 { (STRPTR)"topaz.font",TOPAZ_EIGHTY,FS_NORMAL,FPF_ROMFONT };

struct TextAttr MyPRG =
 { (STRPTR)"topaz.font",TOPAZ_EIGHTY,FSF_BOLD,FPF_ROMFONT };

struct IntuiText DF0 =
 { 2,0,JAM2,2,1,&ROMFont,(UBYTE *) "DF0:  ?   DF1:  ?   ",NULL };

struct IntuiText DF2 =
 { 2,0,JAM2,2,10,&ROMFont,(UBYTE *)"DF2:  ?   DF3:  ?   ",&DF0 };

struct IntuiText DFT =
 { 1,0,JAM2,12,1,&ROMFont,(UBYTE *)"000 R",NULL };

struct IntuiText Intro = 
 { 2,0,JAM2,2,1,&MyPRG,(UBYTE *)   "      SofTrack     ",NULL };

struct IntuiText MyName = 
 { 1,0,JAM2,2,10,&ROMFont,(UBYTE *)"  By Kamran Karimi ",&Intro };

struct IntuiText NoDisk = 
 { 2,0,JAM2,12,1,&ROMFont,(UBYTE *)" N/A",NULL };   

struct IntuitionBase *IntuitionBase;
struct Window *MyWindow;
struct MsgPort *Port;
struct DiscResource *DiskBase;

ULONG CoOrd[4][2] = 
         { {23,10},{105,10},{23,19},{105,19} };

struct NewWindow WindowPar =
 { 400,0,171,30,0,1,NULL,WINDOWDEPTH|WINDOWDRAG,NULL,NULL,
   (UBYTE *)"SofTrack",NULL,NULL,0,0,0,0,WBENCHSCREEN};

short Install();
struct MsgPort *CreatePort();
unsigned long GetUnitID();

struct Library *OpenLibrary(),*OpenResource();
struct Window *OpenWindow();
char   SetTaskPri();
struct Task    *FindTask();
struct Message *GetMsg(),*WaitPort();
struct MsgPort  *FindPort();
void ReplyMsg(),CloseLibrary(),CloseWindow(),CloseAll();
void PrintIText(),Forbid(),Permit();

void main()
{
 char *titel,NewTitel[6],OldTitel0[6],OldTitel1[6],OldTitel2[6],OldTitel3[6];
 char Unit;
 struct Task *task;
 unsigned long count;
 struct Message *message;
 struct RastPort *MyWindowRP;

  if(FindPort("SofTrack's Port"))  exit(0); 

  if(!(IntuitionBase =
              (struct IntuitionBase *)OpenLibrary("intuition.library",0L)))
  {
   CloseAll();
   exit(10);
  }

 if(!(MyWindow = OpenWindow(&WindowPar)))
  {
   CloseAll();
   exit(10);
  }
 MyWindowRP = MyWindow->RPort;
 PrintIText(MyWindowRP,&MyName,2L,10L);
 Delay(150L);
 PrintIText(MyWindowRP,&DF2,2L,10L);
 if(!(Port = CreatePort("SofTrack's Port",1L)))
  {
   CloseAll();
   exit(10);
  }
  if (Install())
  {
   CloseAll();
   exit(10);
  }
 
 if(DiskBase = (struct DiscResource *)OpenResource("disk.resource",0L))
  {
   for(count = 0;count <= 4;count++)
    {
     if(GetUnitID(count) == DRT_EMPTY)
        PrintIText(MyWindowRP,&NoDisk,CoOrd[count][0],CoOrd[count][1]);
    }
  }
   
 strcpy(OldTitel0,"     ");
 strcpy(OldTitel1,"     ");
 strcpy(OldTitel2,"     ");
 strcpy(OldTitel3,"     ");

 task = FindTask(NULL);
 SetTaskPri(task,19L);
 for (;;)
 {
   WaitPort(Port);
   message = GetMsg(Port);
   Forbid();
   titel = (char *)(&message->mn_Length);
   titel += 2;
   Unit = *titel;
   titel += 2; 
   strcpy(NewTitel,titel);
   switch(Unit)
    {
     case 0:
      if(strcmp(NewTitel,OldTitel0))
       {
        DFT.IText = (UBYTE *)NewTitel;
        PrintIText(MyWindowRP,&DFT,23L,10L);
        strcpy(OldTitel0,NewTitel);
       }
      break;

     case 1:
      if (strcmp(NewTitel,OldTitel1))
      {
       DFT.IText = (UBYTE *)NewTitel;
       PrintIText(MyWindowRP,&DFT,105L,10L);
       strcpy(OldTitel1,NewTitel);
      }
     break;

     case 2:
      if (strcmp(NewTitel,OldTitel2))
       {
        DFT.IText = (UBYTE *)NewTitel;
        PrintIText(MyWindowRP,&DFT,23L,19L);
        strcpy(OldTitel2,NewTitel);
       }
      break;

     case 3:
      if (strcmp(NewTitel,OldTitel3))
       {
        DFT.IText = (UBYTE *)NewTitel;
        PrintIText(MyWindowRP,&DFT,105L,19L);
        strcpy(OldTitel3,NewTitel);
       }
     break;
    }
  Permit();
  ReplyMsg(message);
 }
}


void CloseAll()
{
 if (MyWindow)      CloseWindow(MyWindow);
 if (IntuitionBase) CloseLibrary(IntuitionBase);
}
