/**************************************************
 *
 *	diskname.c  
 *	Anzeigen des Disknamens
 *	mit Trackdisk.device
 *
 *	-=mb=- Jul-87
 *
 **************************************************/

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

#define BLOCKSIZE 512L
#define MOTOR_ON 1
#define MOTOR_OFF 0

struct MsgPort *diskport;
struct IOStdReq *diskreq;
int openerror = -999;
 
/* hier lesen wir einen Block von Diskette */
ReadBlock(block, buffer)	
int block;
unsigned char *buffer;
	{
	diskreq->io_Length = BLOCKSIZE;
	diskreq->io_Data = (APTR)buffer;
	diskreq->io_Command = CMD_READ;
	diskreq->io_Offset = block*BLOCKSIZE;
	DoIO(diskreq);
	}

/* Drivemotor an- bzw. ausschalten */
SwitchMotor(onoffswitch)
/* onoffswitch ist MOTOR_ON oder MOTOR_OFF */
int onoffswitch;
	{
	diskreq->io_Length = onoffswitch;
	diskreq->io_Command = TD_MOTOR;
	DoIO(diskreq);
	}

/* Programmsteuerung */
main()   
	{
	char input[256];
	/* wir benutzen Drive 0 */
	long drive = 0;
	/* hier lesen wir einen Block hinein */
	unsigned char *diskbuffer;
	int namelength;
	int i;
        
	puts("Insert Disk in drive 0, hit RETURN");
	/* auf <RETURN> warten */
	gets(input);	

	/* CHIP-memory fuer Puffer holen */
	diskbuffer = AllocMem(BLOCKSIZE, MEMF_CHIP);
	if (diskbuffer == 0) cleanup("No memory!");

	/* Port zur Kommunikation mit trackdisk.device aufbauen */
	diskport = CreatePort("mydisk.port", 0L);
	if (diskport == 0) cleanup("CreatePort failed!");

	/* StdIO-Block zur Kommunikation ueber 'diskport' aufbauen */
	diskreq = CreateStdIO(diskport);
	if (diskreq == 0) cleanup("CreateStdIO failed!");
 
	/* wir reservieren uns trackdisk.device df0: */
	openerror = OpenDevice(TD_NAME,drive,diskreq,0L);
	if (openerror) cleanup("OpenDevice failed!");
    
	/* Drive-Motor einschalten */
	SwitchMotor(MOTOR_ON);

	/* Root-Block (normalerweise 880) einlesen */
	ReadBlock(880, diskbuffer);

	/* wir drucken den BCPL-String Diskettenname */
	/* Byte Nr. 432 gibt die Laenge des Namens */
	namelength = diskbuffer[432];
	/* Der eigentliche Name steht ab Byte 433 */
	for (i = 0; i < namelength; i++)
		putchar(diskbuffer[433+i]);
	putchar('\n');

	/* Drive-Motor ausschalten */
	SwitchMotor(MOTOR_OFF);
	cleanup(NULL);
	}
 
/* Aufraeumarbeiten erledigen */
cleanup(mes)
char *mes;
	{
	/* evtl. Fehlermeldung */
	if (mes) puts(mes);

	/* Drive df0: wieder freigeben */
	if (!openerror) CloseDevice(diskreq);
	/* StdIo-Block loeschen */
	if (diskreq) DeleteStdIO(diskreq);
	/* DiskPort entfernen */
	if (diskport) DeletePort(diskport);
	exit(0);
	}
