home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 6 / Sonderheft_6-96.iso / pd / disktools / softrack / source / softrack.c < prev   
C/C++ Source or Header  |  1996-11-03  |  6KB  |  190 lines

  1.  
  2. /* SofTrack.
  3.  
  4.    Shows the floppy head position and whether a read or a write 
  5.    operation is underway.
  6.  
  7.    It installs two routines to intercept SendIO() and DoIO() routines.
  8.    whenever a floppy disk operation is requested, information about it
  9.    if passed back to the main program, which displayes them to the user.
  10.    
  11.    compile with SAS/C 6.50 and link with Install.o and GetUnitID.o .
  12.  
  13.    1> sc SofTrack.c
  14.    1> slink lib:c.o SofTrack.o Install.o GetUnitID.o lib lib:sc.lib
  15.       lib:amiga.lib
  16.   
  17.    Written by and Copyright Kamran Karimi.
  18. */ 
  19.  
  20. #include <stdlib.h>
  21. #include <string.h>
  22.  
  23. #include <exec/exec.h>
  24. #include <intuition/intuition.h>
  25. #include <resources/disk.h>
  26.  
  27. #include <clib/exec_protos.h>
  28. #include <clib/dos_protos.h>
  29. #include <clib/intuition_protos.h>
  30. #include <clib/alib_protos.h>
  31.  
  32. #define DOIO -456
  33. #define SENDIO -462
  34.  
  35. #define  MyWindowRP  MyWindow->RPort
  36.  
  37.  
  38. /* structures used by Intuition: fonts, message texts and so on */
  39.  
  40. struct TextAttr ROMFont = 
  41.                 {(STRPTR)"topaz.font",TOPAZ_EIGHTY,FS_NORMAL,FPF_ROMFONT};
  42. struct TextAttr MyPRG =
  43.                 {(STRPTR)"topaz.font",TOPAZ_EIGHTY,FSF_BOLD,FPF_ROMFONT};
  44. struct IntuiText DF0 =
  45.                 {2,0,JAM2,2,1,&ROMFont,(UBYTE *) "DF0:  ?   DF1:  ?   ",NULL};
  46. struct IntuiText DF2 =
  47.                 {2,0,JAM2,2,10,&ROMFont,(UBYTE *)"DF2:  ?   DF3:  ?   ",&DF0};
  48. struct IntuiText DFT =
  49.                 {1,0,JAM2,12,1,&ROMFont,(UBYTE *)"000 R",NULL};
  50. struct IntuiText Intro = 
  51.                 {2,0,JAM2,2,1,&MyPRG,(UBYTE *)   "      SofTrack     ",NULL};
  52. struct IntuiText MyName = 
  53.                 {1,0,JAM2,2,10,&ROMFont,(UBYTE *)"  By Kamran Karimi ",&Intro};
  54. struct IntuiText NoDisk = 
  55.                 {2,0,JAM2,12,1,&ROMFont,(UBYTE *)" N/A",NULL};   
  56.  
  57. /* structure to define desired window attributes. */
  58. struct NewWindow WindowPar =
  59.  { 400,0,171,30,0,1,CLOSEWINDOW,WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG,NULL,NULL,
  60.    (UBYTE *)"SofTrack V1.1",NULL,NULL,0,0,0,0,WBENCHSCREEN};
  61.  
  62. ULONG CoOrd[4][2] = 
  63.          { {23,10},{105,10},{23,19},{105,19} };
  64.  
  65.  
  66. extern struct ExecBase *SysBase;
  67. struct IntuitionBase *IntuitionBase = NULL; /* Intuition library */
  68. struct DiscResource *DiskBase = NULL;
  69.  
  70. struct Window *MyWindow = NULL; 
  71. struct MsgPort *Port = NULL;
  72.  
  73. struct MyMessage
  74. {
  75.  struct Message message;
  76.  short int unit;
  77.  char info[6];
  78. };
  79.  
  80. extern ULONG GetUnitID(LONG);
  81. extern LONG Install(VOID);
  82.  
  83. APTR ReservedDoIO,ReservedSendIO;
  84. ULONG SizeOfIO;
  85. ULONG (*SaveDoIO)(),(*SaveSendIO)();
  86.  
  87.  
  88. VOID CloseAll(LONG RetCode)
  89. {
  90.  if(Port) DeletePort(Port);
  91.  if(MyWindow) CloseWindow(MyWindow);
  92.  if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  93.  exit(RetCode);
  94. }
  95.  
  96. VOID main()
  97. {
  98.  char NewTitel[6],OldTitel[4][6];
  99.  char Unit;
  100.  struct MyMessage *message;
  101.  ULONG SigTrack,SigIntui;
  102.  
  103.  /* check to see if the user has already executed the program */
  104.  if(FindPort("SofTrack's Port"))
  105.   exit(0); /* no more than one instance! */ 
  106.  
  107.  /* open any version of intuition.library */
  108.  if(!(IntuitionBase = 
  109.    (struct IntuitionBase *)OpenLibrary("intuition.library",0L))) CloseAll(20);
  110.   
  111.  /* open window */
  112.  if(!(MyWindow = OpenWindow(&WindowPar)))  CloseAll(10); 
  113.  
  114.  /* we need a message port so that our spy routines can send us info */
  115.  /* just to make the search for the port quicker, use priority 1 */
  116.  if(!(Port = CreatePort("SofTrack's Port",1L))) CloseAll(10); 
  117.  
  118.  PrintIText(MyWindowRP,&MyName,2L,10L); /* display my name */
  119.  Delay(3 * 50L); /* wait 3 seconds */ 
  120.  PrintIText(MyWindowRP,&DF2,2L,10L); /* diplay drive info */
  121.  
  122.  /* we need to find out which disk drives are present in the system */ 
  123.  if(DiskBase = (struct DiscResource *)OpenResource("disk.resource"))
  124.  {
  125.   /* Amiga supports at most 4 diskette drives */
  126.   for(Unit = 0;Unit < 4;Unit++)
  127.   {
  128.    /* GetUnitID() queriers the disk.resource */ 
  129.    if(GetUnitID(Unit) == DRT_EMPTY)
  130.     PrintIText(MyWindowRP,&NoDisk,CoOrd[Unit][0],CoOrd[Unit][1]);
  131.   }
  132.   /* there is no CloseResource() */ 
  133.  }
  134.  
  135.  /* istall the spy routines */
  136.  if (Install()) CloseAll(10);
  137.  
  138.  /* we should wait for two input sources. The first is the Intuition: when
  139.     the user clicks on the CloseWindow gadget, the window message port
  140.     will rceive a message. The second source are the spy routines. They
  141.     send their information to the port we allocated previously */ 
  142.  SigIntui = 1L << MyWindow->UserPort->mp_SigBit;
  143.  SigTrack = 1L << Port->mp_SigBit;
  144.  
  145.  /* we want consistency between information on the screen and the actual
  146.     disk drive situation, so increasing the priorityto 19 seems appropriate.
  147.     As this task is in waiting state most of the time, system performance 
  148.     is not degraded much */
  149.  SetTaskPri(FindTask(NULL),19L);
  150.  
  151.  /* this is the main loop. program waits for a message from either port. */   
  152.  for (;;)
  153.  {
  154.   if(Wait(SigTrack | SigIntui) & SigTrack)
  155.   {
  156.    /* a message from spy routines */
  157.    message = (struct MyMessage *)GetMsg(Port);
  158.   
  159.    /* actual message information are after the Message structure. 
  160.       title Points to this information */
  161.    Unit = message->unit; /* which drive unit? (DF0, DF1, ... ) */
  162.    strcpy(NewTitel,message->info); /* new information: Track no. and R/W */
  163.    if(strcmp(NewTitel,OldTitel[Unit])) /* any change? */
  164.    {
  165.     DFT.IText = (UBYTE *)NewTitel;
  166.     PrintIText(MyWindowRP,&DFT,CoOrd[Unit][0],CoOrd[Unit][1]);
  167.     strcpy(OldTitel[Unit],NewTitel);
  168.    }
  169.   }
  170.   else 
  171.   {
  172.    /* the message was from Intuition. We only expect a message from our
  173.       window when the user clicks on CloseWindow, that is why we don't 
  174.       check for the message identity */
  175.    ReplyMsg(GetMsg(MyWindow->UserPort));
  176.  
  177.    /* restore the vectors to their original state */
  178.    SetFunction((struct Library *)SysBase, DOIO, SaveDoIO);
  179.    SetFunction((struct Library *)SysBase, SENDIO, SaveSendIO);
  180.  
  181.    /* free memory allocated for the routines */
  182.    FreeMem(ReservedDoIO,SizeOfIO);
  183.    FreeMem(ReservedSendIO,SizeOfIO);
  184.  
  185.    /* clean up */
  186.    CloseAll(0);
  187.   }
  188.  }
  189. }
  190.