/*========================================================================
 Name		BootBlink  
 Autor		Tilo Rossmanith
 Datum		8.7.88
 Zweck      	Aendert den Bootblock einer Diskette.
		Beim Booten der Disk blinkt nun der Bildschirm kurz auf,
		dadurch kann festgestellt werden, ob die Disk von einem
		Virus infiziert wurde (dann blinkt's nicht mehr !)
 Bedienung  	Aufruf: 'BootBlink <drive>'
 Hinweise	Um das Programm kurz zu halten, wurde darauf verzichtet,
		alle moeglichen Fehlerquellen zu ueberpruefen. Es kann
		also vorkommen, dass das Programm keinen Fehler meldet,	
		obwohl sich der Bootblock noch garnicht auf der Disk
		befindet.		
========================================================================*/

#include "exec/types.h"
#include "exec/memory.h"
#include "devices/trackdisk.h"

struct MsgPort	*DiskPort= NULL;
struct IOStdReq	*DiskRequest= NULL;

long	*BBlock= NULL;
long	BVal[17]= {
  0x444f5300, 0x4b8382e2, 0x00000370, 0x203c0001,
  0x000033c0, 0x00dff180, 0x538066f6, 0x43fa0018,
  0x4eaeffa0, 0x4a80670a, 0x20402068, 0x00167000,
  0x4e7570ff, 0x60fa646f, 0x732e6c69, 0x62726172,
  0x79000000  
  /* Die kompletten Daten des neuen Bootblocks, 
     der Rest wird mit Nullen aufgefuellt */
};
 		
/* Universal Fehlerhandler */	 
void cleanup(text)
  char	*text;
{
  if (DiskRequest != NULL)
  {
    /* Motor ausschalten */
    DiskRequest-> io_Command= TD_MOTOR;
    DiskRequest-> io_Length= 0;
    DoIO (DiskRequest);
    CloseDevice (DiskRequest);
    DeleteExtIO (DiskRequest, sizeof (struct IOStdReq));
  }
  if (DiskPort != NULL)
    DeletePort (DiskPort);

  if (BBlock != NULL)
    FreeMem (BBlock, 512*2);

  if (text)
    printf ("%s\n", text);

  exit ();
}
   
main(argc, argv)
  int  argc;
  char  *argv[];
{
  long  Unit;
  COUNT  Loop;
  long  Changenum;

  printf ("BootBlink - (C)7/88 Tilo Rossmanith\n");

  Unit= argv[1][2]-'0';
  if ( (argc != 2) || (Unit<0 || Unit>3) )
  {
    cleanup ("Aufruf: 'BootBlink <Drive>'\n");
  }
  
  /* Trackdisk-device oeffnen */
  DiskPort= CreatePort (0,0);  
  DiskRequest= CreateExtIO (DiskPort, sizeof (struct IOStdReq));
  if (OpenDevice (TD_NAME, Unit, DiskRequest, 0)!= 0)
  {
    cleanup ("Fehler beim Oeffnen des Devices\n");
  }

  /* Speicher fuer Bootblock */
  if ( (BBlock= AllocMem (512*2, MEMF_CHIP|MEMF_CLEAR))== 0)
    cleanup("Kein Chip-Mem frei");

  /* Bootblock-Daten in den Diskpuffer umkopieren */
  for (Loop= 0; Loop< 17; Loop++)
    BBlock[Loop]= BVal[Loop];

  /* Bootblock auf Disk schreiben */
  DiskRequest-> io_Command= CMD_WRITE;
  DiskRequest-> io_Data= BBlock;
  DiskRequest-> io_Offset= 0; /* Block 0 */
  DiskRequest-> io_Length= 1024; /* 2 Blocks schreiben */
  DoIO (DiskRequest);

  /* Das folgende Kommando bewirkt, dass der Track-Puffer des 
     trackdisk.device sofort auf die Disk geschrieben wird. */
  DiskRequest-> io_Command= CMD_UPDATE;
  DoIO (DiskRequest);
  if (DiskRequest-> io_Error != NULL)
    cleanup ("Fehler beim Schreiben des Bootblocks");

  cleanup ("BootBlink wurde auf der Diskette installiert");
}
