       /************************************************/
      /*		   Block		      */
     /*						     */
    /*	    zum Anzeigen des Blockinhaltes	    */
   /*						   */
  /*	        (c) Thomas Wacker 1988		  */
 /*						 */
/************************************************/

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

struct MsgPort		*dpt;
struct IOStdReq		*drq;
unsigned char		*dbuf;

main(argc,argv)
int argc;
char *argv[];
	{
	int i=1,j,n,blocknu,kk,fehler;
	long drive=NULL;

	dbuf=AllocMem(512,MEMF_CHIP|MEMF_CLEAR);
	if(dbuf==NULL)
	  {
	  printf("Nicht genug Speicher!?\n");
	  ende();
	  }

	dpt=CreatePort("disk.port",NULL);
	drq=CreateStdIO(dpt);

	if(strncmp(argv[1],"df",2)==NULL)
	 { drive=(long)argv[1][2]-'0'; i=2; }

	fehler=OpenDevice(TD_NAME,drive,drq,NULL);

	if(fehler)
	  {
	  printf("Kann Geraet nicht ansprechen!\n");
	  ende();
	  }

	if(i==2 && argc==2)
	  {
	  printf("Block-Nummer feht!\n");
	  ende();
	  }

	drq->io_Length=1;
	drq->io_Command=TD_MOTOR;
	DoIO(drq);

	for(kk=i;kk<argc;kk++)
	 {
	 blocknu=atoi(argv[kk]);
	 if (1760<=blocknu || blocknu<=-1) blocknu=0;
	 printf("Block %d:\n",blocknu);

	 drq->io_Command=CMD_READ;
	 drq->io_Data=(APTR)dbuf;
	 drq->io_Length=512;
	 drq->io_Offset=blocknu*512;
	 DoIO(drq);

	 for(n=0;n<=512;n+=16)
	   {
	   for(j=0;j<16;j++)
	     printf("%02x ",dbuf[n+j]);
	   printf("  ");
	   for(j=0;j<16;j++)
	     {
	     if( (dbuf[n+j]>0x1f && dbuf[n+j]<0x7f)
	      ||  dbuf[n+j]>0x9f ) printf("%c",dbuf[n+j]);
	     else printf(".");
	     }
	   printf("\n");
	   }
	 }

	drq->io_Length=0;
	drq->io_Command=TD_MOTOR;
	DoIO(drq);
	ende();
	}
ende()
	{
	if(drq)
	  {
	  CloseDevice(drq);
	  DeleteStdIO(drq);
	  }
	if(dpt)	 DeletePort(dpt);
	if(dbuf) FreeMem(dbuf,512);
	exit(NULL);
	}
